aboutsummaryrefslogtreecommitdiffhomepage
path: root/inc
diff options
context:
space:
mode:
authorNicolas LÅ“uillet <nicolas@loeuillet.org>2014-04-11 17:22:04 +0200
committerNicolas LÅ“uillet <nicolas@loeuillet.org>2014-04-11 17:22:04 +0200
commit4a74d9857cdb6116ce24df01b45176b92ad592c0 (patch)
treef8347803fe40f8b27218cbad8ed688c7dbf3a46e /inc
parent0d67b00d5d3b7ce1b76b639dcc65c415a5f13439 (diff)
parent7256e9e139eb07cdae1fbe3009454e6c7d9a8677 (diff)
downloadwallabag-4a74d9857cdb6116ce24df01b45176b92ad592c0.tar.gz
wallabag-4a74d9857cdb6116ce24df01b45176b92ad592c0.tar.zst
wallabag-4a74d9857cdb6116ce24df01b45176b92ad592c0.zip
Merge pull request #634 from wallabag/dev1.6.1b
1.6.1
Diffstat (limited to 'inc')
-rw-r--r--inc/3rdparty/libraries/feedwriter/FeedItem.php353
-rwxr-xr-xinc/3rdparty/libraries/feedwriter/FeedWriter.php839
-rwxr-xr-xinc/poche/Database.class.php12
-rwxr-xr-xinc/poche/Poche.class.php163
-rwxr-xr-xinc/poche/Tools.class.php4
5 files changed, 699 insertions, 672 deletions
diff --git a/inc/3rdparty/libraries/feedwriter/FeedItem.php b/inc/3rdparty/libraries/feedwriter/FeedItem.php
index 0eae5e08..3487423f 100644
--- a/inc/3rdparty/libraries/feedwriter/FeedItem.php
+++ b/inc/3rdparty/libraries/feedwriter/FeedItem.php
@@ -10,177 +10,188 @@
10 */ 10 */
11 class FeedItem 11 class FeedItem
12 { 12 {
13 private $elements = array(); //Collection of feed elements 13 private $elements = array(); //Collection of feed elements
14 private $version; 14 private $version;
15 15
16 /** 16 /**
17 * Constructor 17 * Constructor
18 * 18 *
19 * @param contant (RSS1/RSS2/ATOM) RSS2 is default. 19 * @param contant (RSS1/RSS2/ATOM) RSS2 is default.
20 */ 20 */
21 function __construct($version = RSS2) 21 function __construct($version = RSS2)
22 { 22 {
23 $this->version = $version; 23 $this->version = $version;
24 } 24 }
25 25
26 /** 26 /**
27 * Set element (overwrites existing elements with $elementName) 27 * Set element (overwrites existing elements with $elementName)
28 * 28 *
29 * @access public 29 * @access public
30 * @param srting The tag name of an element 30 * @param srting The tag name of an element
31 * @param srting The content of tag 31 * @param srting The content of tag
32 * @param array Attributes(if any) in 'attrName' => 'attrValue' format 32 * @param array Attributes(if any) in 'attrName' => 'attrValue' format
33 * @return void 33 * @return void
34 */ 34 */
35 public function setElement($elementName, $content, $attributes = null) 35 public function setElement($elementName, $content, $attributes = null)
36 { 36 {
37 if (isset($this->elements[$elementName])) { 37 if (isset($this->elements[$elementName])) {
38 unset($this->elements[$elementName]); 38 unset($this->elements[$elementName]);
39 } 39 }
40 $this->addElement($elementName, $content, $attributes); 40 $this->addElement($elementName, $content, $attributes);
41 } 41 }
42 42
43 /** 43 /**
44 * Add an element to elements array 44 * Add an element to elements array
45 * 45 *
46 * @access public 46 * @access public
47 * @param srting The tag name of an element 47 * @param srting The tag name of an element
48 * @param srting The content of tag 48 * @param srting The content of tag
49 * @param array Attributes(if any) in 'attrName' => 'attrValue' format 49 * @param array Attributes(if any) in 'attrName' => 'attrValue' format
50 * @return void 50 * @return void
51 */ 51 */
52 public function addElement($elementName, $content, $attributes = null) 52 public function addElement($elementName, $content, $attributes = null)
53 { 53 {
54 $i = 0; 54 $i = 0;
55 if (isset($this->elements[$elementName])) { 55 if (isset($this->elements[$elementName])) {
56 $i = count($this->elements[$elementName]); 56 $i = count($this->elements[$elementName]);
57 } else { 57 } else {
58 $this->elements[$elementName] = array(); 58 $this->elements[$elementName] = array();
59 } 59 }
60 $this->elements[$elementName][$i]['name'] = $elementName; 60 $this->elements[$elementName][$i]['name'] = $elementName;
61 $this->elements[$elementName][$i]['content'] = $content; 61 $this->elements[$elementName][$i]['content'] = $content;
62 $this->elements[$elementName][$i]['attributes'] = $attributes; 62 $this->elements[$elementName][$i]['attributes'] = $attributes;
63 } 63 }
64 64
65 /** 65 /**
66 * Set multiple feed elements from an array. 66 * Set multiple feed elements from an array.
67 * Elements which have attributes cannot be added by this method 67 * Elements which have attributes cannot be added by this method
68 * 68 *
69 * @access public 69 * @access public
70 * @param array array of elements in 'tagName' => 'tagContent' format. 70 * @param array array of elements in 'tagName' => 'tagContent' format.
71 * @return void 71 * @return void
72 */ 72 */
73 public function addElementArray($elementArray) 73 public function addElementArray($elementArray)
74 { 74 {
75 if(! is_array($elementArray)) return; 75 if(! is_array($elementArray)) return;
76 foreach ($elementArray as $elementName => $content) 76 foreach ($elementArray as $elementName => $content)
77 { 77 {
78 $this->addElement($elementName, $content); 78 $this->addElement($elementName, $content);
79 } 79 }
80 } 80 }
81 81
82 /** 82 /**
83 * Return the collection of elements in this feed item 83 * Return the collection of elements in this feed item
84 * 84 *
85 * @access public 85 * @access public
86 * @return array 86 * @return array
87 */ 87 */
88 public function getElements() 88 public function getElements()
89 { 89 {
90 return $this->elements; 90 return $this->elements;
91 } 91 }
92 92
93 // Wrapper functions ------------------------------------------------------ 93 // Wrapper functions ------------------------------------------------------
94 94
95 /** 95 /**
96 * Set the 'dscription' element of feed item 96 * Set the 'dscription' element of feed item
97 * 97 *
98 * @access public 98 * @access public
99 * @param string The content of 'description' element 99 * @param string The content of 'description' element
100 * @return void 100 * @return void
101 */ 101 */
102 public function setDescription($description) 102 public function setDescription($description)
103 { 103 {
104 $tag = 'description'; 104 $this->setElement('description', $description);
105 $this->setElement($tag, $description); 105 }
106 } 106
107 107 /**
108 /** 108 * @desc Set the 'title' element of feed item
109 * @desc Set the 'title' element of feed item 109 * @access public
110 * @access public 110 * @param string The content of 'title' element
111 * @param string The content of 'title' element 111 * @return void
112 * @return void 112 */
113 */ 113 public function setTitle($title)
114 public function setTitle($title) 114 {
115 { 115 $this->setElement('title', $title);
116 $this->setElement('title', $title); 116 }
117 } 117
118 118 /**
119 /** 119 * Set the 'date' element of feed item
120 * Set the 'date' element of feed item 120 *
121 * 121 * @access public
122 * @access public 122 * @param string The content of 'date' element
123 * @param string The content of 'date' element 123 * @return void
124 * @return void 124 */
125 */ 125 public function setDate($date)
126 public function setDate($date) 126 {
127 { 127 if(! is_numeric($date))
128 if(! is_numeric($date)) 128 {
129 { 129 $date = strtotime($date);
130 $date = strtotime($date); 130 }
131 }
132 131
133 if($this->version == RSS2) 132 if($this->version == RSS2)
134 { 133 {
135 $tag = 'pubDate'; 134 $tag = 'pubDate';
136 $value = date(DATE_RSS, $date); 135 $value = date(DATE_RSS, $date);
137 } 136 }
138 else 137 else
139 { 138 {
140 $tag = 'dc:date'; 139 $tag = 'dc:date';
141 $value = date("Y-m-d", $date); 140 $value = date("Y-m-d", $date);
142 } 141 }
143 142
144 $this->setElement($tag, $value); 143 $this->setElement($tag, $value);
145 } 144 }
146 145
147 /** 146 /**
148 * Set the 'link' element of feed item 147 * Set the 'link' element of feed item
149 * 148 *
150 * @access public 149 * @access public
151 * @param string The content of 'link' element 150 * @param string The content of 'link' element
152 * @return void 151 * @return void
153 */ 152 */
154 public function setLink($link) 153 public function setLink($link)
155 { 154 {
156 if($this->version == RSS2 || $this->version == RSS1) 155 if($this->version == RSS2 || $this->version == RSS1)
157 { 156 {
158 $this->setElement('link', $link); 157 $this->setElement('link', $link);
159 $this->setElement('guid', $link); 158 $this->setElement('guid', $link);
160 } 159 }
161 else 160 else
162 { 161 {
163 $this->setElement('link','',array('href'=>$link)); 162 $this->setElement('link','',array('href'=>$link));
164 $this->setElement('id', FeedWriter::uuid($link,'urn:uuid:')); 163 $this->setElement('id', FeedWriter::uuid($link,'urn:uuid:'));
165 } 164 }
166 165
167 } 166 }
168 167
169 /** 168 /**
170 * Set the 'encloser' element of feed item 169 * Set the 'source' element of feed item
171 * For RSS 2.0 only 170 *
172 * 171 * @access public
173 * @access public 172 * @param string The content of 'source' element
174 * @param string The url attribute of encloser tag 173 * @return void
175 * @param string The length attribute of encloser tag 174 */
176 * @param string The type attribute of encloser tag 175 public function setSource($link)
177 * @return void 176 {
178 */ 177 $this->setElement('source', $link);
179 public function setEncloser($url, $length, $type) 178 }
180 { 179
181 $attributes = array('url'=>$url, 'length'=>$length, 'type'=>$type); 180 /**
182 $this->setElement('enclosure','',$attributes); 181 * Set the 'encloser' element of feed item
183 } 182 * For RSS 2.0 only
184 183 *
184 * @access public
185 * @param string The url attribute of encloser tag
186 * @param string The length attribute of encloser tag
187 * @param string The type attribute of encloser tag
188 * @return void
189 */
190 public function setEncloser($url, $length, $type)
191 {
192 $attributes = array('url'=>$url, 'length'=>$length, 'type'=>$type);
193 $this->setElement('enclosure','',$attributes);
194 }
195
185 } // end of class FeedItem 196 } // end of class FeedItem
186?> 197?> \ No newline at end of file
diff --git a/inc/3rdparty/libraries/feedwriter/FeedWriter.php b/inc/3rdparty/libraries/feedwriter/FeedWriter.php
index 5d16e765..df4c8b4b 100755
--- a/inc/3rdparty/libraries/feedwriter/FeedWriter.php
+++ b/inc/3rdparty/libraries/feedwriter/FeedWriter.php
@@ -18,424 +18,423 @@ define('JSONP', 3, true);
18 */ 18 */
19 class FeedWriter 19 class FeedWriter
20 { 20 {
21 private $self = null; // self URL - http://feed2.w3.org/docs/warning/MissingAtomSelfLink.html 21 private $self = null; // self URL - http://feed2.w3.org/docs/warning/MissingAtomSelfLink.html
22 private $hubs = array(); // PubSubHubbub hubs 22 private $hubs = array(); // PubSubHubbub hubs
23 private $channels = array(); // Collection of channel elements 23 private $channels = array(); // Collection of channel elements
24 private $items = array(); // Collection of items as object of FeedItem class. 24 private $items = array(); // Collection of items as object of FeedItem class.
25 private $data = array(); // Store some other version wise data 25 private $data = array(); // Store some other version wise data
26 private $CDATAEncoding = array(); // The tag names which have to encoded as CDATA 26 private $CDATAEncoding = array(); // The tag names which have to encoded as CDATA
27 private $xsl = null; // stylesheet to render RSS (used by Chrome) 27 private $xsl = null; // stylesheet to render RSS (used by Chrome)
28 private $json = null; // JSON object 28 private $json = null; // JSON object
29 29
30 private $version = null; 30 private $version = null;
31 31
32 /** 32 /**
33 * Constructor 33 * Constructor
34 * 34 *
35 * @param constant the version constant (RSS2 or JSON). 35 * @param constant the version constant (RSS2 or JSON).
36 */ 36 */
37 function __construct($version = RSS2) 37 function __construct($version = RSS2)
38 { 38 {
39 $this->version = $version; 39 $this->version = $version;
40 40
41 // Setting default value for assential channel elements 41 // Setting default value for assential channel elements
42 $this->channels['title'] = $version . ' Feed'; 42 $this->channels['title'] = $version . ' Feed';
43 $this->channels['link'] = 'http://www.ajaxray.com/blog'; 43 $this->channels['link'] = 'http://www.ajaxray.com/blog';
44 44
45 //Tag names to encode in CDATA 45 //Tag names to encode in CDATA
46 $this->CDATAEncoding = array('description', 'content:encoded', 'content', 'subtitle', 'summary'); 46 $this->CDATAEncoding = array('description', 'content:encoded', 'content', 'subtitle', 'summary');
47 } 47 }
48 48
49 public function setFormat($format) { 49 public function setFormat($format) {
50 $this->version = $format; 50 $this->version = $format;
51 } 51 }
52 52
53 // Start # public functions --------------------------------------------- 53 // Start # public functions ---------------------------------------------
54 54
55 /** 55 /**
56 * Set a channel element 56 * Set a channel element
57 * @access public 57 * @access public
58 * @param srting name of the channel tag 58 * @param srting name of the channel tag
59 * @param string content of the channel tag 59 * @param string content of the channel tag
60 * @return void 60 * @return void
61 */ 61 */
62 public function setChannelElement($elementName, $content) 62 public function setChannelElement($elementName, $content)
63 { 63 {
64 $this->channels[$elementName] = $content ; 64 $this->channels[$elementName] = $content ;
65 } 65 }
66 66
67 /** 67 /**
68 * Set multiple channel elements from an array. Array elements 68 * Set multiple channel elements from an array. Array elements
69 * should be 'channelName' => 'channelContent' format. 69 * should be 'channelName' => 'channelContent' format.
70 * 70 *
71 * @access public 71 * @access public
72 * @param array array of channels 72 * @param array array of channels
73 * @return void 73 * @return void
74 */ 74 */
75 public function setChannelElementsFromArray($elementArray) 75 public function setChannelElementsFromArray($elementArray)
76 { 76 {
77 if(! is_array($elementArray)) return; 77 if(! is_array($elementArray)) return;
78 foreach ($elementArray as $elementName => $content) 78 foreach ($elementArray as $elementName => $content)
79 { 79 {
80 $this->setChannelElement($elementName, $content); 80 $this->setChannelElement($elementName, $content);
81 } 81 }
82 } 82 }
83 83
84 /** 84 /**
85 * Genarate the actual RSS/JSON file 85 * Genarate the actual RSS/JSON file
86 * 86 *
87 * @access public 87 * @access public
88 * @return void 88 * @return void
89 */ 89 */
90 public function genarateFeed() 90 public function genarateFeed()
91 { 91 {
92 if ($this->version == RSS2) { 92 if ($this->version == RSS2) {
93// header('Content-type: text/xml; charset=UTF-8'); 93// header('Content-type: text/xml; charset=UTF-8');
94 // this line prevents Chrome 20 from prompting download 94 // this line prevents Chrome 20 from prompting download
95 // used by Google: https://news.google.com/news/feeds?ned=us&topic=b&output=rss 95 // used by Google: https://news.google.com/news/feeds?ned=us&topic=b&output=rss
96// header('X-content-type-options: nosniff'); 96// header('X-content-type-options: nosniff');
97 } elseif ($this->version == JSON) { 97 } elseif ($this->version == JSON) {
98// header('Content-type: application/json; charset=UTF-8'); 98// header('Content-type: application/json; charset=UTF-8');
99 $this->json = new stdClass(); 99 $this->json = new stdClass();
100 } elseif ($this->version == JSONP) { 100 } elseif ($this->version == JSONP) {
101// header('Content-type: application/javascript; charset=UTF-8'); 101// header('Content-type: application/javascript; charset=UTF-8');
102 $this->json = new stdClass(); 102 $this->json = new stdClass();
103 } 103 }
104 $this->printHead(); 104 $this->printHead();
105 $this->printChannels(); 105 $this->printChannels();
106 $this->printItems(); 106 $this->printItems();
107 $this->printTale(); 107 $this->printTale();
108 if ($this->version == JSON || $this->version == JSONP) { 108 if ($this->version == JSON || $this->version == JSONP) {
109 echo json_encode($this->json); 109 echo json_encode($this->json);
110 } 110 }
111 } 111 }
112 112
113 /** 113 /**
114 * Create a new FeedItem. 114 * Create a new FeedItem.
115 * 115 *
116 * @access public 116 * @access public
117 * @return object instance of FeedItem class 117 * @return object instance of FeedItem class
118 */ 118 */
119 public function createNewItem() 119 public function createNewItem()
120 { 120 {
121 $Item = new FeedItem($this->version); 121 $Item = new FeedItem($this->version);
122 return $Item; 122 return $Item;
123 } 123 }
124 124
125 /** 125 /**
126 * Add a FeedItem to the main class 126 * Add a FeedItem to the main class
127 * 127 *
128 * @access public 128 * @access public
129 * @param object instance of FeedItem class 129 * @param object instance of FeedItem class
130 * @return void 130 * @return void
131 */ 131 */
132 public function addItem($feedItem) 132 public function addItem($feedItem)
133 { 133 {
134 $this->items[] = $feedItem; 134 $this->items[] = $feedItem;
135 } 135 }
136 136
137 // Wrapper functions ------------------------------------------------------------------- 137 // Wrapper functions -------------------------------------------------------------------
138 138
139 /** 139 /**
140 * Set the 'title' channel element 140 * Set the 'title' channel element
141 * 141 *
142 * @access public 142 * @access public
143 * @param srting value of 'title' channel tag 143 * @param srting value of 'title' channel tag
144 * @return void 144 * @return void
145 */ 145 */
146 public function setTitle($title) 146 public function setTitle($title)
147 { 147 {
148 $this->setChannelElement('title', $title); 148 $this->setChannelElement('title', $title);
149 } 149 }
150 150
151 /** 151 /**
152 * Add a hub to the channel element 152 * Add a hub to the channel element
153 * 153 *
154 * @access public 154 * @access public
155 * @param string URL 155 * @param string URL
156 * @return void 156 * @return void
157 */ 157 */
158 public function addHub($hub) 158 public function addHub($hub)
159 { 159 {
160 $this->hubs[] = $hub; 160 $this->hubs[] = $hub;
161 } 161 }
162 162
163 /** 163 /**
164 * Set XSL URL 164 * Set XSL URL
165 * 165 *
166 * @access public 166 * @access public
167 * @param string URL 167 * @param string URL
168 * @return void 168 * @return void
169 */ 169 */
170 public function setXsl($xsl) 170 public function setXsl($xsl)
171 { 171 {
172 $this->xsl = $xsl; 172 $this->xsl = $xsl;
173 } 173 }
174 174
175 /** 175 /**
176 * Set self URL 176 * Set self URL
177 * 177 *
178 * @access public 178 * @access public
179 * @param string URL 179 * @param string URL
180 * @return void 180 * @return void
181 */ 181 */
182 public function setSelf($self) 182 public function setSelf($self)
183 { 183 {
184 $this->self = $self; 184 $this->self = $self;
185 } 185 }
186 186
187 /** 187 /**
188 * Set the 'description' channel element 188 * Set the 'description' channel element
189 * 189 *
190 * @access public 190 * @access public
191 * @param srting value of 'description' channel tag 191 * @param srting value of 'description' channel tag
192 * @return void 192 * @return void
193 */ 193 */
194 public function setDescription($desciption) 194 public function setDescription($description)
195 { 195 {
196 $tag = ($this->version == ATOM)? 'subtitle' : 'description'; 196 $this->setChannelElement('description', $description);
197 $this->setChannelElement($tag, $desciption); 197 }
198 } 198
199 199 /**
200 /** 200 * Set the 'link' channel element
201 * Set the 'link' channel element 201 *
202 * 202 * @access public
203 * @access public 203 * @param srting value of 'link' channel tag
204 * @param srting value of 'link' channel tag 204 * @return void
205 * @return void 205 */
206 */ 206 public function setLink($link)
207 public function setLink($link) 207 {
208 { 208 $this->setChannelElement('link', $link);
209 $this->setChannelElement('link', $link); 209 }
210 } 210
211 211 /**
212 /** 212 * Set the 'image' channel element
213 * Set the 'image' channel element 213 *
214 * 214 * @access public
215 * @access public 215 * @param srting title of image
216 * @param srting title of image 216 * @param srting link url of the imahe
217 * @param srting link url of the imahe 217 * @param srting path url of the image
218 * @param srting path url of the image 218 * @return void
219 * @return void 219 */
220 */ 220 public function setImage($title, $link, $url)
221 public function setImage($title, $link, $url) 221 {
222 { 222 $this->setChannelElement('image', array('title'=>$title, 'link'=>$link, 'url'=>$url));
223 $this->setChannelElement('image', array('title'=>$title, 'link'=>$link, 'url'=>$url)); 223 }
224 } 224
225 225 // End # public functions ----------------------------------------------
226 // End # public functions ---------------------------------------------- 226
227 227 // Start # private functions ----------------------------------------------
228 // Start # private functions ---------------------------------------------- 228
229 229 /**
230 /** 230 * Prints the xml and rss namespace
231 * Prints the xml and rss namespace 231 *
232 * 232 * @access private
233 * @access private 233 * @return void
234 * @return void 234 */
235 */ 235 private function printHead()
236 private function printHead() 236 {
237 { 237 if ($this->version == RSS2)
238 if ($this->version == RSS2) 238 {
239 { 239 $out = '<?xml version="1.0" encoding="utf-8"?>'."\n";
240 $out = '<?xml version="1.0" encoding="utf-8"?>'."\n"; 240 if ($this->xsl) $out .= '<?xml-stylesheet type="text/xsl" href="'.htmlspecialchars($this->xsl).'"?>' . PHP_EOL;
241 if ($this->xsl) $out .= '<?xml-stylesheet type="text/xsl" href="'.htmlspecialchars($this->xsl).'"?>' . PHP_EOL; 241 $out .= '<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">' . PHP_EOL;
242 $out .= '<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">' . PHP_EOL; 242 echo $out;
243 echo $out; 243 }
244 } 244 elseif ($this->version == JSON || $this->version == JSONP)
245 elseif ($this->version == JSON || $this->version == JSONP) 245 {
246 { 246 $this->json->rss = array('@attributes' => array('version' => '2.0'));
247 $this->json->rss = array('@attributes' => array('version' => '2.0')); 247 }
248 } 248 }
249 } 249
250 250 /**
251 /** 251 * Closes the open tags at the end of file
252 * Closes the open tags at the end of file 252 *
253 * 253 * @access private
254 * @access private 254 * @return void
255 * @return void 255 */
256 */ 256 private function printTale()
257 private function printTale() 257 {
258 { 258 if ($this->version == RSS2)
259 if ($this->version == RSS2) 259 {
260 { 260 echo '</channel>',PHP_EOL,'</rss>';
261 echo '</channel>',PHP_EOL,'</rss>'; 261 }
262 } 262 // do nothing for JSON
263 // do nothing for JSON 263 }
264 } 264
265 265 /**
266 /** 266 * Creates a single node as xml format
267 * Creates a single node as xml format 267 *
268 * 268 * @access private
269 * @access private 269 * @param string name of the tag
270 * @param string name of the tag 270 * @param mixed tag value as string or array of nested tags in 'tagName' => 'tagValue' format
271 * @param mixed tag value as string or array of nested tags in 'tagName' => 'tagValue' format 271 * @param array Attributes(if any) in 'attrName' => 'attrValue' format
272 * @param array Attributes(if any) in 'attrName' => 'attrValue' format 272 * @return string formatted xml tag
273 * @return string formatted xml tag 273 */
274 */ 274 private function makeNode($tagName, $tagContent, $attributes = null)
275 private function makeNode($tagName, $tagContent, $attributes = null) 275 {
276 { 276 if ($this->version == RSS2)
277 if ($this->version == RSS2) 277 {
278 { 278 $nodeText = '';
279 $nodeText = ''; 279 $attrText = '';
280 $attrText = ''; 280 if (is_array($attributes))
281 if (is_array($attributes)) 281 {
282 { 282 foreach ($attributes as $key => $value)
283 foreach ($attributes as $key => $value) 283 {
284 { 284 $attrText .= " $key=\"$value\" ";
285 $attrText .= " $key=\"$value\" "; 285 }
286 } 286 }
287 } 287 $nodeText .= "<{$tagName}{$attrText}>";
288 $nodeText .= "<{$tagName}{$attrText}>"; 288 if (is_array($tagContent))
289 if (is_array($tagContent)) 289 {
290 { 290 foreach ($tagContent as $key => $value)
291 foreach ($tagContent as $key => $value) 291 {
292 { 292 $nodeText .= $this->makeNode($key, $value);
293 $nodeText .= $this->makeNode($key, $value); 293 }
294 } 294 }
295 } 295 else
296 else 296 {
297 { 297 //$nodeText .= (in_array($tagName, $this->CDATAEncoding))? $tagContent : htmlentities($tagContent);
298 //$nodeText .= (in_array($tagName, $this->CDATAEncoding))? $tagContent : htmlentities($tagContent); 298 $nodeText .= htmlspecialchars($tagContent);
299 $nodeText .= htmlspecialchars($tagContent); 299 }
300 } 300 //$nodeText .= (in_array($tagName, $this->CDATAEncoding))? "]]></$tagName>" : "</$tagName>";
301 //$nodeText .= (in_array($tagName, $this->CDATAEncoding))? "]]></$tagName>" : "</$tagName>"; 301 $nodeText .= "</$tagName>";
302 $nodeText .= "</$tagName>"; 302 return $nodeText . PHP_EOL;
303 return $nodeText . PHP_EOL; 303 }
304 } 304 elseif ($this->version == JSON || $this->version == JSONP)
305 elseif ($this->version == JSON || $this->version == JSONP) 305 {
306 { 306 $tagName = (string)$tagName;
307 $tagName = (string)$tagName; 307 $tagName = strtr($tagName, ':', '_');
308 $tagName = strtr($tagName, ':', '_'); 308 $node = null;
309 $node = null; 309 if (!$tagContent && is_array($attributes) && count($attributes))
310 if (!$tagContent && is_array($attributes) && count($attributes)) 310 {
311 { 311 $node = array('@attributes' => $this->json_keys($attributes));
312 $node = array('@attributes' => $this->json_keys($attributes)); 312 } else {
313 } else { 313 if (is_array($tagContent)) {
314 if (is_array($tagContent)) { 314 $node = $this->json_keys($tagContent);
315 $node = $this->json_keys($tagContent); 315 } else {
316 } else { 316 $node = $tagContent;
317 $node = $tagContent; 317 }
318 } 318 }
319 } 319 return $node;
320 return $node; 320 }
321 } 321 return ''; // should not get here
322 return ''; // should not get here 322 }
323 } 323
324 324 private function json_keys(array $array) {
325 private function json_keys(array $array) { 325 $new = array();
326 $new = array(); 326 foreach ($array as $key => $val) {
327 foreach ($array as $key => $val) { 327 if (is_string($key)) $key = strtr($key, ':', '_');
328 if (is_string($key)) $key = strtr($key, ':', '_'); 328 if (is_array($val)) {
329 if (is_array($val)) { 329 $new[$key] = $this->json_keys($val);
330 $new[$key] = $this->json_keys($val); 330 } else {
331 } else { 331 $new[$key] = $val;
332 $new[$key] = $val; 332 }
333 } 333 }
334 } 334 return $new;
335 return $new; 335 }
336 } 336
337 337 /**
338 /** 338 * @desc Print channels
339 * @desc Print channels 339 * @access private
340 * @access private 340 * @return void
341 * @return void 341 */
342 */ 342 private function printChannels()
343 private function printChannels() 343 {
344 { 344 //Start channel tag
345 //Start channel tag 345 if ($this->version == RSS2) {
346 if ($this->version == RSS2) { 346 echo '<channel>' . PHP_EOL;
347 echo '<channel>' . PHP_EOL; 347 // add hubs
348 // add hubs 348 foreach ($this->hubs as $hub) {
349 foreach ($this->hubs as $hub) { 349 //echo $this->makeNode('link', '', array('rel'=>'hub', 'href'=>$hub, 'xmlns'=>'http://www.w3.org/2005/Atom'));
350 //echo $this->makeNode('link', '', array('rel'=>'hub', 'href'=>$hub, 'xmlns'=>'http://www.w3.org/2005/Atom')); 350 echo '<link rel="hub" href="'.htmlspecialchars($hub).'" xmlns="http://www.w3.org/2005/Atom" />' . PHP_EOL;
351 echo '<link rel="hub" href="'.htmlspecialchars($hub).'" xmlns="http://www.w3.org/2005/Atom" />' . PHP_EOL; 351 }
352 } 352 // add self
353 // add self 353 if (isset($this->self)) {
354 if (isset($this->self)) { 354 //echo $this->makeNode('link', '', array('rel'=>'self', 'href'=>$this->self, 'xmlns'=>'http://www.w3.org/2005/Atom'));
355 //echo $this->makeNode('link', '', array('rel'=>'self', 'href'=>$this->self, 'xmlns'=>'http://www.w3.org/2005/Atom')); 355 echo '<link rel="self" href="'.htmlspecialchars($this->self).'" xmlns="http://www.w3.org/2005/Atom" />' . PHP_EOL;
356 echo '<link rel="self" href="'.htmlspecialchars($this->self).'" xmlns="http://www.w3.org/2005/Atom" />' . PHP_EOL; 356 }
357 } 357 //Print Items of channel
358 //Print Items of channel 358 foreach ($this->channels as $key => $value)
359 foreach ($this->channels as $key => $value) 359 {
360 { 360 echo $this->makeNode($key, $value);
361 echo $this->makeNode($key, $value); 361 }
362 } 362 } elseif ($this->version == JSON || $this->version == JSONP) {
363 } elseif ($this->version == JSON || $this->version == JSONP) { 363 $this->json->rss['channel'] = (object)$this->json_keys($this->channels);
364 $this->json->rss['channel'] = (object)$this->json_keys($this->channels); 364 }
365 } 365 }
366 } 366
367 367 /**
368 /** 368 * Prints formatted feed items
369 * Prints formatted feed items 369 *
370 * 370 * @access private
371 * @access private 371 * @return void
372 * @return void 372 */
373 */ 373 private function printItems()
374 private function printItems() 374 {
375 { 375 foreach ($this->items as $item) {
376 foreach ($this->items as $item) { 376 $itemElements = $item->getElements();
377 $itemElements = $item->getElements(); 377
378 378 echo $this->startItem();
379 echo $this->startItem(); 379
380 380 if ($this->version == JSON || $this->version == JSONP) {
381 if ($this->version == JSON || $this->version == JSONP) { 381 $json_item = array();
382 $json_item = array(); 382 }
383 } 383
384 384 foreach ($itemElements as $thisElement) {
385 foreach ($itemElements as $thisElement) { 385 foreach ($thisElement as $instance) {
386 foreach ($thisElement as $instance) { 386 if ($this->version == RSS2) {
387 if ($this->version == RSS2) { 387 echo $this->makeNode($instance['name'], $instance['content'], $instance['attributes']);
388 echo $this->makeNode($instance['name'], $instance['content'], $instance['attributes']); 388 } elseif ($this->version == JSON || $this->version == JSONP) {
389 } elseif ($this->version == JSON || $this->version == JSONP) { 389 $_json_node = $this->makeNode($instance['name'], $instance['content'], $instance['attributes']);
390 $_json_node = $this->makeNode($instance['name'], $instance['content'], $instance['attributes']); 390 if (count($thisElement) > 1) {
391 if (count($thisElement) > 1) { 391 $json_item[strtr($instance['name'], ':', '_')][] = $_json_node;
392 $json_item[strtr($instance['name'], ':', '_')][] = $_json_node; 392 } else {
393 } else { 393 $json_item[strtr($instance['name'], ':', '_')] = $_json_node;
394 $json_item[strtr($instance['name'], ':', '_')] = $_json_node; 394 }
395 } 395 }
396 } 396 }
397 } 397 }
398 } 398 echo $this->endItem();
399 echo $this->endItem(); 399 if ($this->version == JSON || $this->version == JSONP) {
400 if ($this->version == JSON || $this->version == JSONP) { 400 if (count($this->items) > 1) {
401 if (count($this->items) > 1) { 401 $this->json->rss['channel']->item[] = $json_item;
402 $this->json->rss['channel']->item[] = $json_item; 402 } else {
403 } else { 403 $this->json->rss['channel']->item = $json_item;
404 $this->json->rss['channel']->item = $json_item; 404 }
405 } 405 }
406 } 406 }
407 } 407 }
408 } 408
409 409 /**
410 /** 410 * Make the starting tag of channels
411 * Make the starting tag of channels 411 *
412 * 412 * @access private
413 * @access private 413 * @return void
414 * @return void 414 */
415 */ 415 private function startItem()
416 private function startItem() 416 {
417 { 417 if ($this->version == RSS2)
418 if ($this->version == RSS2) 418 {
419 { 419 echo '<item>' . PHP_EOL;
420 echo '<item>' . PHP_EOL; 420 }
421 } 421 // nothing for JSON
422 // nothing for JSON 422 }
423 } 423
424 424 /**
425 /** 425 * Closes feed item tag
426 * Closes feed item tag 426 *
427 * 427 * @access private
428 * @access private 428 * @return void
429 * @return void 429 */
430 */ 430 private function endItem()
431 private function endItem() 431 {
432 { 432 if ($this->version == RSS2)
433 if ($this->version == RSS2) 433 {
434 { 434 echo '</item>' . PHP_EOL;
435 echo '</item>' . PHP_EOL; 435 }
436 } 436 // nothing for JSON
437 // nothing for JSON 437 }
438 } 438
439 439 // End # private functions ----------------------------------------------
440 // End # private functions ----------------------------------------------
441 } \ No newline at end of file 440 } \ No newline at end of file
diff --git a/inc/poche/Database.class.php b/inc/poche/Database.class.php
index 6244df88..036c9d1b 100755
--- a/inc/poche/Database.class.php
+++ b/inc/poche/Database.class.php
@@ -77,7 +77,7 @@ class Database {
77 } 77 }
78 else { 78 else {
79 $sql = ' 79 $sql = '
80 CREATE TABLE tags ( 80 CREATE TABLE IF NOT EXISTS tags (
81 id bigserial primary key, 81 id bigserial primary key,
82 value varchar(255) NOT NULL 82 value varchar(255) NOT NULL
83 ); 83 );
@@ -110,7 +110,7 @@ class Database {
110 } 110 }
111 else { 111 else {
112 $sql = ' 112 $sql = '
113 CREATE TABLE tags_entries ( 113 CREATE TABLE IF NOT EXISTS tags_entries (
114 id bigserial primary key, 114 id bigserial primary key,
115 entry_id integer NOT NULL, 115 entry_id integer NOT NULL,
116 tag_id integer NOT NULL 116 tag_id integer NOT NULL
@@ -245,7 +245,7 @@ class Database {
245 $sql_limit = "LIMIT ".$limit." OFFSET 0"; 245 $sql_limit = "LIMIT ".$limit." OFFSET 0";
246 } 246 }
247 247
248 $sql = "SELECT * FROM entries WHERE (content = '' OR content IS NULL) AND user_id=? ORDER BY id " . $sql_limit; 248 $sql = "SELECT * FROM entries WHERE (content = '' OR content IS NULL) AND title LIKE 'Untitled - Import%' AND user_id=? ORDER BY id " . $sql_limit;
249 $query = $this->executeQuery($sql, array($user_id)); 249 $query = $this->executeQuery($sql, array($user_id));
250 $entries = $query->fetchAll(); 250 $entries = $query->fetchAll();
251 251
@@ -253,7 +253,7 @@ class Database {
253 } 253 }
254 254
255 public function retrieveUnfetchedEntriesCount($user_id) { 255 public function retrieveUnfetchedEntriesCount($user_id) {
256 $sql = "SELECT count(*) FROM entries WHERE (content = '' OR content IS NULL) AND user_id=?"; 256 $sql = "SELECT count(*) FROM entries WHERE (content = '' OR content IS NULL) AND title LIKE 'Untitled - Import%' AND user_id=?";
257 $query = $this->executeQuery($sql, array($user_id)); 257 $query = $this->executeQuery($sql, array($user_id));
258 list($count) = $query->fetch(); 258 list($count) = $query->fetch();
259 259
@@ -374,7 +374,7 @@ class Database {
374 $id = null; 374 $id = null;
375 } 375 }
376 else { 376 else {
377 $id = intval($this->getLastId( (STORAGE == 'postgres') ? 'users_id_seq' : '' )); 377 $id = intval($this->getLastId( (STORAGE == 'postgres') ? 'entries_id_seq' : '') );
378 } 378 }
379 return $id; 379 return $id;
380 } 380 }
@@ -407,7 +407,7 @@ class Database {
407 public function getLastId($column = '') { 407 public function getLastId($column = '') {
408 return $this->getHandle()->lastInsertId($column); 408 return $this->getHandle()->lastInsertId($column);
409 } 409 }
410 410
411 public function search($term, $user_id, $limit = '') { 411 public function search($term, $user_id, $limit = '') {
412 $search = '%'.$term.'%'; 412 $search = '%'.$term.'%';
413 $sql_action = "SELECT * FROM entries WHERE user_id=? AND (content LIKE ? OR title LIKE ? OR url LIKE ?) "; //searches in content, title and URL 413 $sql_action = "SELECT * FROM entries WHERE user_id=? AND (content LIKE ? OR title LIKE ? OR url LIKE ?) "; //searches in content, title and URL
diff --git a/inc/poche/Poche.class.php b/inc/poche/Poche.class.php
index a662f695..811895dc 100755
--- a/inc/poche/Poche.class.php
+++ b/inc/poche/Poche.class.php
@@ -373,9 +373,7 @@ class Poche
373 $body = $content['rss']['channel']['item']['description']; 373 $body = $content['rss']['channel']['item']['description'];
374 374
375 // clean content from prevent xss attack 375 // clean content from prevent xss attack
376 $config = HTMLPurifier_Config::createDefault(); 376 $purifier = $this->getPurifier();
377 $config->set('Cache.SerializerPath', CACHE);
378 $purifier = new HTMLPurifier($config);
379 $title = $purifier->purify($title); 377 $title = $purifier->purify($title);
380 $body = $purifier->purify($body); 378 $body = $purifier->purify($body);
381 379
@@ -828,10 +826,12 @@ class Poche
828 define('IMPORT_LIMIT', 5); 826 define('IMPORT_LIMIT', 5);
829 } 827 }
830 if (!defined('IMPORT_DELAY')) { 828 if (!defined('IMPORT_DELAY')) {
831 define('IMPORT_DELAY', 5); 829 define('IMPORT_DELAY', 5);
832 } 830 }
833 831
834 if ( isset($_FILES['file']) ) { 832 if ( isset($_FILES['file']) ) {
833 Tools::logm('Import stated: parsing file');
834
835 // assume, that file is in json format 835 // assume, that file is in json format
836 $str_data = file_get_contents($_FILES['file']['tmp_name']); 836 $str_data = file_get_contents($_FILES['file']['tmp_name']);
837 $data = json_decode($str_data, true); 837 $data = json_decode($str_data, true);
@@ -844,18 +844,18 @@ class Poche
844 $read = 0; 844 $read = 0;
845 foreach (array('ol','ul') as $list) { 845 foreach (array('ol','ul') as $list) {
846 foreach ($html->find($list) as $ul) { 846 foreach ($html->find($list) as $ul) {
847 foreach ($ul->find('li') as $li) { 847 foreach ($ul->find('li') as $li) {
848 $tmpEntry = array(); 848 $tmpEntry = array();
849 $a = $li->find('a'); 849 $a = $li->find('a');
850 $tmpEntry['url'] = $a[0]->href; 850 $tmpEntry['url'] = $a[0]->href;
851 $tmpEntry['tags'] = $a[0]->tags; 851 $tmpEntry['tags'] = $a[0]->tags;
852 $tmpEntry['is_read'] = $read; 852 $tmpEntry['is_read'] = $read;
853 if ($tmpEntry['url']) { 853 if ($tmpEntry['url']) {
854 $data[] = $tmpEntry; 854 $data[] = $tmpEntry;
855 } 855 }
856 } 856 }
857 # the second <ol/ul> is for read links 857 # the second <ol/ul> is for read links
858 $read = ((sizeof($data) && $read)?0:1); 858 $read = ((sizeof($data) && $read)?0:1);
859 } 859 }
860 } 860 }
861 } 861 }
@@ -866,16 +866,16 @@ class Poche
866 $data[] = $record; 866 $data[] = $record;
867 foreach ($record as $record2) { 867 foreach ($record as $record2) {
868 if (is_array($record2)) { 868 if (is_array($record2)) {
869 $data[] = $record2; 869 $data[] = $record2;
870 } 870 }
871 } 871 }
872 } 872 }
873 } 873 }
874 874
875 $i = 0; //counter for articles inserted 875 $urlsInserted = array(); //urls of articles inserted
876 foreach ($data as $record) { 876 foreach ($data as $record) {
877 $url = trim( isset($record['article__url']) ? $record['article__url'] : (isset($record['url']) ? $record['url'] : '') ); 877 $url = trim( isset($record['article__url']) ? $record['article__url'] : (isset($record['url']) ? $record['url'] : '') );
878 if ( $url ) { 878 if ( $url and !in_array($url, $urlsInserted) ) {
879 $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>');
880 $body = (isset($record['content']) ? $record['content'] : ''); 880 $body = (isset($record['content']) ? $record['content'] : '');
881 $isRead = (isset($record['is_read']) ? intval($record['is_read']) : (isset($record['archive'])?intval($record['archive']):0)); 881 $isRead = (isset($record['is_read']) ? intval($record['is_read']) : (isset($record['archive'])?intval($record['archive']):0));
@@ -883,19 +883,21 @@ class Poche
883 //insert new record 883 //insert new record
884 $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);
885 if ( $id ) { 885 if ( $id ) {
886 //increment no of records inserted 886 $urlsInserted[] = $url; //add
887 $i++; 887
888 if ( isset($record['tags']) && trim($record['tags']) ) { 888 if ( isset($record['tags']) && trim($record['tags']) ) {
889 //@TODO: set tags 889 //@TODO: set tags
890 890
891 } 891 }
892 } 892 }
893 } 893 }
894 } 894 }
895 895
896 $i = sizeof($urlsInserted);
896 if ( $i > 0 ) { 897 if ( $i > 0 ) {
897 $this->messages->add('s', _('Articles inserted: ').$i._('. Please note, that some may be marked as "read".')); 898 $this->messages->add('s', _('Articles inserted: ').$i._('. Please note, that some may be marked as "read".'));
898 } 899 }
900 Tools::logm('Import of articles finished: '.$i.' articles added (w/o content if not provided).');
899 } 901 }
900 //file parsing finished here 902 //file parsing finished here
901 903
@@ -906,30 +908,32 @@ class Poche
906 if ( $recordsDownloadRequired == 0 ) { 908 if ( $recordsDownloadRequired == 0 ) {
907 //nothing to download 909 //nothing to download
908 $this->messages->add('s', _('Import finished.')); 910 $this->messages->add('s', _('Import finished.'));
911 Tools::logm('Import finished completely');
909 Tools::redirect(); 912 Tools::redirect();
910 } 913 }
911 else { 914 else {
912 //if just inserted - don't download anything, download will start in next reload 915 //if just inserted - don't download anything, download will start in next reload
913 if ( !isset($_FILES['file']) ) { 916 if ( !isset($_FILES['file']) ) {
914 //download next batch 917 //download next batch
918 Tools::logm('Fetching next batch of articles...');
915 $items = $this->store->retrieveUnfetchedEntries($this->user->getId(), IMPORT_LIMIT); 919 $items = $this->store->retrieveUnfetchedEntries($this->user->getId(), IMPORT_LIMIT);
916 920
917 $config = HTMLPurifier_Config::createDefault(); 921 $purifier = $this->getPurifier();
918 $config->set('Cache.SerializerPath', CACHE);
919 $purifier = new HTMLPurifier($config);
920 922
921 foreach ($items as $item) { 923 foreach ($items as $item) {
922 $url = new Url(base64_encode($item['url'])); 924 $url = new Url(base64_encode($item['url']));
923 $content = Tools::getPageContent($url); 925 Tools::logm('Fetching article '.$item['id']);
926 $content = Tools::getPageContent($url);
924 927
925 $title = (($content['rss']['channel']['item']['title'] != '') ? $content['rss']['channel']['item']['title'] : _('Untitled')); 928 $title = (($content['rss']['channel']['item']['title'] != '') ? $content['rss']['channel']['item']['title'] : _('Untitled'));
926 $body = (($content['rss']['channel']['item']['description'] != '') ? $content['rss']['channel']['item']['description'] : _('Undefined')); 929 $body = (($content['rss']['channel']['item']['description'] != '') ? $content['rss']['channel']['item']['description'] : _('Undefined'));
927 930
928 //clean content to prevent xss attack 931 //clean content to prevent xss attack
929 $title = $purifier->purify($title); 932 $title = $purifier->purify($title);
930 $body = $purifier->purify($body); 933 $body = $purifier->purify($body);
931 934
932 $this->store->updateContentAndTitle($item['id'], $title, $body, $this->user->getId()); 935 $this->store->updateContentAndTitle($item['id'], $title, $body, $this->user->getId());
936 Tools::logm('Article '.$item['id'].' updated.');
933 } 937 }
934 938
935 } 939 }
@@ -942,16 +946,15 @@ class Poche
942 * export poche entries in json 946 * export poche entries in json
943 * @return json all poche entries 947 * @return json all poche entries
944 */ 948 */
945 public function export() 949 public function export() {
946 { 950 $filename = "wallabag-export-".$this->user->getId()."-".date("Y-m-d").".json";
947 $filename = "wallabag-export-".$this->user->getId()."-".date("Y-m-d").".json"; 951 header('Content-Disposition: attachment; filename='.$filename);
948 header('Content-Disposition: attachment; filename='.$filename); 952
949 953 $entries = $this->store->retrieveAll($this->user->getId());
950 $entries = $this->store->retrieveAll($this->user->getId()); 954 echo $this->tpl->render('export.twig', array(
951 echo $this->tpl->render('export.twig', array( 955 'export' => Tools::renderJson($entries),
952 'export' => Tools::renderJson($entries), 956 ));
953 )); 957 Tools::logm('export view');
954 Tools::logm('export view');
955 } 958 }
956 959
957 /** 960 /**
@@ -959,43 +962,42 @@ class Poche
959 * @param string $which 'prod' or 'dev' 962 * @param string $which 'prod' or 'dev'
960 * @return string latest $which version 963 * @return string latest $which version
961 */ 964 */
962 private function getPocheVersion($which = 'prod') 965 private function getPocheVersion($which = 'prod') {
963 { 966 $cache_file = CACHE . '/' . $which;
964 $cache_file = CACHE . '/' . $which; 967 $check_time = time();
965 $check_time = time(); 968
966 969 # checks if the cached version file exists
967 # checks if the cached version file exists 970 if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 86400 ))) {
968 if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 86400 ))) { 971 $version = file_get_contents($cache_file);
969 $version = file_get_contents($cache_file); 972 $check_time = filemtime($cache_file);
970 $check_time = filemtime($cache_file); 973 } else {
971 } else { 974 $version = file_get_contents('http://static.wallabag.org/versions/' . $which);
972 $version = file_get_contents('http://static.wallabag.org/versions/' . $which); 975 file_put_contents($cache_file, $version, LOCK_EX);
973 file_put_contents($cache_file, $version, LOCK_EX); 976 }
974 } 977 return array($version, $check_time);
975 return array($version, $check_time);
976 } 978 }
977 979
978 public function generateToken() 980 public function generateToken()
979 { 981 {
980 if (ini_get('open_basedir') === '') { 982 if (ini_get('open_basedir') === '') {
981 if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { 983 if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
982 echo 'This is a server using Windows!'; 984 echo 'This is a server using Windows!';
983 // alternative to /dev/urandom for Windows 985 // alternative to /dev/urandom for Windows
984 $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20); 986 $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20);
985 } else { 987 } else {
986 $token = substr(base64_encode(file_get_contents('/dev/urandom', false, null, 0, 20)), 0, 15); 988 $token = substr(base64_encode(file_get_contents('/dev/urandom', false, null, 0, 20)), 0, 15);
987 }
988 }
989 else {
990 $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20);
991 } 989 }
990 }
991 else {
992 $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20);
993 }
992 994
993 $token = str_replace('+', '', $token); 995 $token = str_replace('+', '', $token);
994 $this->store->updateUserConfig($this->user->getId(), 'token', $token); 996 $this->store->updateUserConfig($this->user->getId(), 'token', $token);
995 $currentConfig = $_SESSION['poche_user']->config; 997 $currentConfig = $_SESSION['poche_user']->config;
996 $currentConfig['token'] = $token; 998 $currentConfig['token'] = $token;
997 $_SESSION['poche_user']->setConfig($currentConfig); 999 $_SESSION['poche_user']->setConfig($currentConfig);
998 Tools::redirect(); 1000 Tools::redirect();
999 } 1001 }
1000 1002
1001 public function generateFeeds($token, $user_id, $tag_id, $type = 'home') 1003 public function generateFeeds($token, $user_id, $tag_id, $type = 'home')
@@ -1031,6 +1033,7 @@ class Poche
1031 foreach ($entries as $entry) { 1033 foreach ($entries as $entry) {
1032 $newItem = $feed->createNewItem(); 1034 $newItem = $feed->createNewItem();
1033 $newItem->setTitle($entry['title']); 1035 $newItem->setTitle($entry['title']);
1036 $newItem->setSource(Tools::getPocheUrl() . '?view=view&amp;id=' . $entry['id']);
1034 $newItem->setLink($entry['url']); 1037 $newItem->setLink($entry['url']);
1035 $newItem->setDate(time()); 1038 $newItem->setDate(time());
1036 $newItem->setDescription($entry['content']); 1039 $newItem->setDescription($entry['content']);
@@ -1057,4 +1060,16 @@ class Poche
1057 $this->messages->add('s', _('Cache deleted.')); 1060 $this->messages->add('s', _('Cache deleted.'));
1058 Tools::redirect(); 1061 Tools::redirect();
1059 } 1062 }
1063
1064 /**
1065 * return new purifier object with actual config
1066 */
1067 protected function getPurifier() {
1068 $config = HTMLPurifier_Config::createDefault();
1069 $config->set('Cache.SerializerPath', CACHE);
1070 $config->set('HTML.SafeIframe', true);
1071 $config->set('URI.SafeIframeRegexp', '%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/)%'); //allow YouTube and Vimeo$purifier = new HTMLPurifier($config);
1072
1073 return new HTMLPurifier($config);
1074 }
1060} 1075}
diff --git a/inc/poche/Tools.class.php b/inc/poche/Tools.class.php
index a130e94b..7f064020 100755
--- a/inc/poche/Tools.class.php
+++ b/inc/poche/Tools.class.php
@@ -59,8 +59,10 @@ class Tools
59 return $scriptname; 59 return $scriptname;
60 } 60 }
61 61
62 $host = (isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']));
63
62 return 'http' . ($https ? 's' : '') . '://' 64 return 'http' . ($https ? 's' : '') . '://'
63 . $_SERVER["HTTP_HOST"] . $serverport . $scriptname; 65 . $host . $serverport . $scriptname;
64 } 66 }
65 67
66 public static function redirect($url = '') 68 public static function redirect($url = '')