aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--application/LinkDB.php124
-rw-r--r--index.php10
-rw-r--r--tests/LinkDBTest.php4
-rw-r--r--tests/utils/ReferenceLinkDB.php20
4 files changed, 82 insertions, 76 deletions
diff --git a/application/LinkDB.php b/application/LinkDB.php
index 82763618..1e16fef1 100644
--- a/application/LinkDB.php
+++ b/application/LinkDB.php
@@ -28,7 +28,7 @@
28class LinkDB implements Iterator, Countable, ArrayAccess 28class LinkDB implements Iterator, Countable, ArrayAccess
29{ 29{
30 // Links are stored as a PHP serialized string 30 // Links are stored as a PHP serialized string
31 private $datastore; 31 private $_datastore;
32 32
33 // Datastore PHP prefix 33 // Datastore PHP prefix
34 protected static $phpPrefix = '<?php /* '; 34 protected static $phpPrefix = '<?php /* ';
@@ -39,23 +39,23 @@ class LinkDB implements Iterator, Countable, ArrayAccess
39 // List of links (associative array) 39 // List of links (associative array)
40 // - key: link date (e.g. "20110823_124546"), 40 // - key: link date (e.g. "20110823_124546"),
41 // - value: associative array (keys: title, description...) 41 // - value: associative array (keys: title, description...)
42 private $links; 42 private $_links;
43 43
44 // List of all recorded URLs (key=url, value=linkdate) 44 // List of all recorded URLs (key=url, value=linkdate)
45 // for fast reserve search (url-->linkdate) 45 // for fast reserve search (url-->linkdate)
46 private $urls; 46 private $_urls;
47 47
48 // List of linkdate keys (for the Iterator interface implementation) 48 // List of linkdate keys (for the Iterator interface implementation)
49 private $keys; 49 private $_keys;
50 50
51 // Position in the $this->keys array (for the Iterator interface) 51 // Position in the $this->_keys array (for the Iterator interface)
52 private $position; 52 private $_position;
53 53
54 // Is the user logged in? (used to filter private links) 54 // Is the user logged in? (used to filter private links)
55 private $loggedIn; 55 private $_loggedIn;
56 56
57 // Hide public links 57 // Hide public links
58 private $hidePublicLinks; 58 private $_hidePublicLinks;
59 59
60 /** 60 /**
61 * Creates a new LinkDB 61 * Creates a new LinkDB
@@ -66,11 +66,11 @@ class LinkDB implements Iterator, Countable, ArrayAccess
66 */ 66 */
67 function __construct($datastore, $isLoggedIn, $hidePublicLinks) 67 function __construct($datastore, $isLoggedIn, $hidePublicLinks)
68 { 68 {
69 $this->datastore = $datastore; 69 $this->_datastore = $datastore;
70 $this->loggedIn = $isLoggedIn; 70 $this->_loggedIn = $isLoggedIn;
71 $this->hidePublicLinks = $hidePublicLinks; 71 $this->_hidePublicLinks = $hidePublicLinks;
72 $this->checkDB(); 72 $this->_checkDB();
73 $this->readdb(); 73 $this->_readDB();
74 } 74 }
75 75
76 /** 76 /**
@@ -78,7 +78,7 @@ class LinkDB implements Iterator, Countable, ArrayAccess
78 */ 78 */
79 public function count() 79 public function count()
80 { 80 {
81 return count($this->links); 81 return count($this->_links);
82 } 82 }
83 83
84 /** 84 /**
@@ -87,7 +87,7 @@ class LinkDB implements Iterator, Countable, ArrayAccess
87 public function offsetSet($offset, $value) 87 public function offsetSet($offset, $value)
88 { 88 {
89 // TODO: use exceptions instead of "die" 89 // TODO: use exceptions instead of "die"
90 if (!$this->loggedIn) { 90 if (!$this->_loggedIn) {
91 die('You are not authorized to add a link.'); 91 die('You are not authorized to add a link.');
92 } 92 }
93 if (empty($value['linkdate']) || empty($value['url'])) { 93 if (empty($value['linkdate']) || empty($value['url'])) {
@@ -96,8 +96,8 @@ class LinkDB implements Iterator, Countable, ArrayAccess
96 if (empty($offset)) { 96 if (empty($offset)) {
97 die('You must specify a key.'); 97 die('You must specify a key.');
98 } 98 }
99 $this->links[$offset] = $value; 99 $this->_links[$offset] = $value;
100 $this->urls[$value['url']]=$offset; 100 $this->_urls[$value['url']]=$offset;
101 } 101 }
102 102
103 /** 103 /**
@@ -105,7 +105,7 @@ class LinkDB implements Iterator, Countable, ArrayAccess
105 */ 105 */
106 public function offsetExists($offset) 106 public function offsetExists($offset)
107 { 107 {
108 return array_key_exists($offset, $this->links); 108 return array_key_exists($offset, $this->_links);
109 } 109 }
110 110
111 /** 111 /**
@@ -113,13 +113,13 @@ class LinkDB implements Iterator, Countable, ArrayAccess
113 */ 113 */
114 public function offsetUnset($offset) 114 public function offsetUnset($offset)
115 { 115 {
116 if (!$this->loggedIn) { 116 if (!$this->_loggedIn) {
117 // TODO: raise an exception 117 // TODO: raise an exception
118 die('You are not authorized to delete a link.'); 118 die('You are not authorized to delete a link.');
119 } 119 }
120 $url = $this->links[$offset]['url']; 120 $url = $this->_links[$offset]['url'];
121 unset($this->urls[$url]); 121 unset($this->_urls[$url]);
122 unset($this->links[$offset]); 122 unset($this->_links[$offset]);
123 } 123 }
124 124
125 /** 125 /**
@@ -127,7 +127,7 @@ class LinkDB implements Iterator, Countable, ArrayAccess
127 */ 127 */
128 public function offsetGet($offset) 128 public function offsetGet($offset)
129 { 129 {
130 return isset($this->links[$offset]) ? $this->links[$offset] : null; 130 return isset($this->_links[$offset]) ? $this->_links[$offset] : null;
131 } 131 }
132 132
133 /** 133 /**
@@ -135,7 +135,7 @@ class LinkDB implements Iterator, Countable, ArrayAccess
135 */ 135 */
136 function current() 136 function current()
137 { 137 {
138 return $this->links[$this->keys[$this->position]]; 138 return $this->_links[$this->_keys[$this->_position]];
139 } 139 }
140 140
141 /** 141 /**
@@ -143,7 +143,7 @@ class LinkDB implements Iterator, Countable, ArrayAccess
143 */ 143 */
144 function key() 144 function key()
145 { 145 {
146 return $this->keys[$this->position]; 146 return $this->_keys[$this->_position];
147 } 147 }
148 148
149 /** 149 /**
@@ -151,7 +151,7 @@ class LinkDB implements Iterator, Countable, ArrayAccess
151 */ 151 */
152 function next() 152 function next()
153 { 153 {
154 ++$this->position; 154 ++$this->_position;
155 } 155 }
156 156
157 /** 157 /**
@@ -161,9 +161,9 @@ class LinkDB implements Iterator, Countable, ArrayAccess
161 */ 161 */
162 function rewind() 162 function rewind()
163 { 163 {
164 $this->keys = array_keys($this->links); 164 $this->_keys = array_keys($this->_links);
165 rsort($this->keys); 165 rsort($this->_keys);
166 $this->position = 0; 166 $this->_position = 0;
167 } 167 }
168 168
169 /** 169 /**
@@ -171,7 +171,7 @@ class LinkDB implements Iterator, Countable, ArrayAccess
171 */ 171 */
172 function valid() 172 function valid()
173 { 173 {
174 return isset($this->keys[$this->position]); 174 return isset($this->_keys[$this->_position]);
175 } 175 }
176 176
177 /** 177 /**
@@ -179,14 +179,14 @@ class LinkDB implements Iterator, Countable, ArrayAccess
179 * 179 *
180 * If no DB file is found, creates a dummy DB. 180 * If no DB file is found, creates a dummy DB.
181 */ 181 */
182 private function checkDB() 182 private function _checkDB()
183 { 183 {
184 if (file_exists($this->datastore)) { 184 if (file_exists($this->_datastore)) {
185 return; 185 return;
186 } 186 }
187 187
188 // Create a dummy database for example 188 // Create a dummy database for example
189 $this->links = array(); 189 $this->_links = array();
190 $link = array( 190 $link = array(
191 'title'=>' Shaarli: the personal, minimalist, super-fast, no-database delicious clone', 191 'title'=>' Shaarli: the personal, minimalist, super-fast, no-database delicious clone',
192 'url'=>'https://github.com/shaarli/Shaarli/wiki', 192 'url'=>'https://github.com/shaarli/Shaarli/wiki',
@@ -199,7 +199,7 @@ You use the community supported version of the original Shaarli project, by Seba
199 'linkdate'=> date('Ymd_His'), 199 'linkdate'=> date('Ymd_His'),
200 'tags'=>'opensource software' 200 'tags'=>'opensource software'
201 ); 201 );
202 $this->links[$link['linkdate']] = $link; 202 $this->_links[$link['linkdate']] = $link;
203 203
204 $link = array( 204 $link = array(
205 'title'=>'My secret stuff... - Pastebin.com', 205 'title'=>'My secret stuff... - Pastebin.com',
@@ -209,60 +209,60 @@ You use the community supported version of the original Shaarli project, by Seba
209 'linkdate'=> date('Ymd_His', strtotime('-1 minute')), 209 'linkdate'=> date('Ymd_His', strtotime('-1 minute')),
210 'tags'=>'secretstuff' 210 'tags'=>'secretstuff'
211 ); 211 );
212 $this->links[$link['linkdate']] = $link; 212 $this->_links[$link['linkdate']] = $link;
213 213
214 // Write database to disk 214 // Write database to disk
215 // TODO: raise an exception if the file is not write-able 215 // TODO: raise an exception if the file is not write-able
216 file_put_contents( 216 file_put_contents(
217 $this->datastore, 217 $this->_datastore,
218 self::$phpPrefix.base64_encode(gzdeflate(serialize($this->links))).self::$phpSuffix 218 self::$phpPrefix.base64_encode(gzdeflate(serialize($this->_links))).self::$phpSuffix
219 ); 219 );
220 } 220 }
221 221
222 /** 222 /**
223 * Reads database from disk to memory 223 * Reads database from disk to memory
224 */ 224 */
225 private function readdb() 225 private function _readDB()
226 { 226 {
227 227
228 // Public links are hidden and user not logged in => nothing to show 228 // Public links are hidden and user not logged in => nothing to show
229 if ($this->hidePublicLinks && !$this->loggedIn) { 229 if ($this->_hidePublicLinks && !$this->_loggedIn) {
230 $this->links = array(); 230 $this->_links = array();
231 return; 231 return;
232 } 232 }
233 233
234 // Read data 234 // Read data
235 // Note that gzinflate is faster than gzuncompress. 235 // Note that gzinflate is faster than gzuncompress.
236 // See: http://www.php.net/manual/en/function.gzdeflate.php#96439 236 // See: http://www.php.net/manual/en/function.gzdeflate.php#96439
237 $this->links = array(); 237 $this->_links = array();
238 238
239 if (file_exists($this->datastore)) { 239 if (file_exists($this->_datastore)) {
240 $this->links = unserialize(gzinflate(base64_decode( 240 $this->_links = unserialize(gzinflate(base64_decode(
241 substr(file_get_contents($this->datastore), 241 substr(file_get_contents($this->_datastore),
242 strlen(self::$phpPrefix), -strlen(self::$phpSuffix))))); 242 strlen(self::$phpPrefix), -strlen(self::$phpSuffix)))));
243 } 243 }
244 244
245 // If user is not logged in, filter private links. 245 // If user is not logged in, filter private links.
246 if (!$this->loggedIn) { 246 if (!$this->_loggedIn) {
247 $toremove = array(); 247 $toremove = array();
248 foreach ($this->links as $link) { 248 foreach ($this->_links as $link) {
249 if ($link['private'] != 0) { 249 if ($link['private'] != 0) {
250 $toremove[] = $link['linkdate']; 250 $toremove[] = $link['linkdate'];
251 } 251 }
252 } 252 }
253 foreach ($toremove as $linkdate) { 253 foreach ($toremove as $linkdate) {
254 unset($this->links[$linkdate]); 254 unset($this->_links[$linkdate]);
255 } 255 }
256 } 256 }
257 257
258 // Keep the list of the mapping URLs-->linkdate up-to-date. 258 // Keep the list of the mapping URLs-->linkdate up-to-date.
259 $this->urls = array(); 259 $this->_urls = array();
260 foreach ($this->links as $link) { 260 foreach ($this->_links as $link) {
261 $this->urls[$link['url']] = $link['linkdate']; 261 $this->_urls[$link['url']] = $link['linkdate'];
262 } 262 }
263 263
264 // Escape links data 264 // Escape links data
265 foreach($this->links as &$link) { 265 foreach($this->_links as &$link) {
266 sanitizeLink($link); 266 sanitizeLink($link);
267 } 267 }
268 } 268 }
@@ -272,13 +272,13 @@ You use the community supported version of the original Shaarli project, by Seba
272 */ 272 */
273 public function savedb() 273 public function savedb()
274 { 274 {
275 if (!$this->loggedIn) { 275 if (!$this->_loggedIn) {
276 // TODO: raise an Exception instead 276 // TODO: raise an Exception instead
277 die('You are not authorized to change the database.'); 277 die('You are not authorized to change the database.');
278 } 278 }
279 file_put_contents( 279 file_put_contents(
280 $this->datastore, 280 $this->_datastore,
281 self::$phpPrefix.base64_encode(gzdeflate(serialize($this->links))).self::$phpSuffix 281 self::$phpPrefix.base64_encode(gzdeflate(serialize($this->_links))).self::$phpSuffix
282 ); 282 );
283 invalidateCaches(); 283 invalidateCaches();
284 } 284 }
@@ -288,8 +288,8 @@ You use the community supported version of the original Shaarli project, by Seba
288 */ 288 */
289 public function getLinkFromUrl($url) 289 public function getLinkFromUrl($url)
290 { 290 {
291 if (isset($this->urls[$url])) { 291 if (isset($this->_urls[$url])) {
292 return $this->links[$this->urls[$url]]; 292 return $this->_links[$this->_urls[$url]];
293 } 293 }
294 return false; 294 return false;
295 } 295 }
@@ -316,7 +316,7 @@ You use the community supported version of the original Shaarli project, by Seba
316 $search = mb_convert_case($searchterms, MB_CASE_LOWER, 'UTF-8'); 316 $search = mb_convert_case($searchterms, MB_CASE_LOWER, 'UTF-8');
317 $keys = array('title', 'description', 'url', 'tags'); 317 $keys = array('title', 'description', 'url', 'tags');
318 318
319 foreach ($this->links as $link) { 319 foreach ($this->_links as $link) {
320 $found = false; 320 $found = false;
321 321
322 foreach ($keys as $key) { 322 foreach ($keys as $key) {
@@ -352,7 +352,7 @@ You use the community supported version of the original Shaarli project, by Seba
352 $searchtags = explode(' ', $t); 352 $searchtags = explode(' ', $t);
353 $filtered = array(); 353 $filtered = array();
354 354
355 foreach ($this->links as $l) { 355 foreach ($this->_links as $l) {
356 $linktags = explode( 356 $linktags = explode(
357 ' ', 357 ' ',
358 ($casesensitive ? $l['tags']:mb_convert_case($l['tags'], MB_CASE_LOWER, 'UTF-8')) 358 ($casesensitive ? $l['tags']:mb_convert_case($l['tags'], MB_CASE_LOWER, 'UTF-8'))
@@ -380,7 +380,7 @@ You use the community supported version of the original Shaarli project, by Seba
380 } 380 }
381 381
382 $filtered = array(); 382 $filtered = array();
383 foreach ($this->links as $l) { 383 foreach ($this->_links as $l) {
384 if (startsWith($l['linkdate'], $day)) { 384 if (startsWith($l['linkdate'], $day)) {
385 $filtered[$l['linkdate']] = $l; 385 $filtered[$l['linkdate']] = $l;
386 } 386 }
@@ -395,7 +395,7 @@ You use the community supported version of the original Shaarli project, by Seba
395 public function filterSmallHash($smallHash) 395 public function filterSmallHash($smallHash)
396 { 396 {
397 $filtered = array(); 397 $filtered = array();
398 foreach ($this->links as $l) { 398 foreach ($this->_links as $l) {
399 if ($smallHash == smallHash($l['linkdate'])) { 399 if ($smallHash == smallHash($l['linkdate'])) {
400 // Yes, this is ugly and slow 400 // Yes, this is ugly and slow
401 $filtered[$l['linkdate']] = $l; 401 $filtered[$l['linkdate']] = $l;
@@ -412,7 +412,7 @@ You use the community supported version of the original Shaarli project, by Seba
412 public function allTags() 412 public function allTags()
413 { 413 {
414 $tags = array(); 414 $tags = array();
415 foreach ($this->links as $link) { 415 foreach ($this->_links as $link) {
416 foreach (explode(' ', $link['tags']) as $tag) { 416 foreach (explode(' ', $link['tags']) as $tag) {
417 if (!empty($tag)) { 417 if (!empty($tag)) {
418 $tags[$tag] = (empty($tags[$tag]) ? 1 : $tags[$tag] + 1); 418 $tags[$tag] = (empty($tags[$tag]) ? 1 : $tags[$tag] + 1);
@@ -431,7 +431,7 @@ You use the community supported version of the original Shaarli project, by Seba
431 public function days() 431 public function days()
432 { 432 {
433 $linkDays = array(); 433 $linkDays = array();
434 foreach (array_keys($this->links) as $day) { 434 foreach (array_keys($this->_links) as $day) {
435 $linkDays[substr($day, 0, 8)] = 0; 435 $linkDays[substr($day, 0, 8)] = 0;
436 } 436 }
437 $linkDays = array_keys($linkDays); 437 $linkDays = array_keys($linkDays);
diff --git a/index.php b/index.php
index 2b1426e9..d8fb3007 100644
--- a/index.php
+++ b/index.php
@@ -63,6 +63,11 @@ checkphpversion();
63error_reporting(E_ALL^E_WARNING); // See all error except warnings. 63error_reporting(E_ALL^E_WARNING); // See all error except warnings.
64//error_reporting(-1); // See all errors (for debugging only) 64//error_reporting(-1); // See all errors (for debugging only)
65 65
66// User configuration
67if (is_file($GLOBALS['config']['CONFIG_FILE'])) {
68 require_once $GLOBALS['config']['CONFIG_FILE'];
69}
70
66// Shaarli library 71// Shaarli library
67require_once 'application/LinkDB.php'; 72require_once 'application/LinkDB.php';
68require_once 'application/Utils.php'; 73require_once 'application/Utils.php';
@@ -103,9 +108,10 @@ if (empty($GLOBALS['titleLink'])) $GLOBALS['titleLink']='?';
103// I really need to rewrite Shaarli with a proper configuation manager. 108// I really need to rewrite Shaarli with a proper configuation manager.
104 109
105// Run config screen if first run: 110// Run config screen if first run:
106if (!is_file($GLOBALS['config']['CONFIG_FILE'])) install(); 111if (! is_file($GLOBALS['config']['CONFIG_FILE'])) {
112 install();
113}
107 114
108require $GLOBALS['config']['CONFIG_FILE']; // Read login/password hash into $GLOBALS.
109$GLOBALS['title'] = !empty($GLOBALS['title']) ? escape($GLOBALS['title']) : ''; 115$GLOBALS['title'] = !empty($GLOBALS['title']) ? escape($GLOBALS['title']) : '';
110$GLOBALS['titleLink'] = !empty($GLOBALS['titleLink']) ? escape($GLOBALS['titleLink']) : ''; 116$GLOBALS['titleLink'] = !empty($GLOBALS['titleLink']) ? escape($GLOBALS['titleLink']) : '';
111$GLOBALS['redirector'] = !empty($GLOBALS['redirector']) ? escape($GLOBALS['redirector']) : ''; 117$GLOBALS['redirector'] = !empty($GLOBALS['redirector']) ? escape($GLOBALS['redirector']) : '';
diff --git a/tests/LinkDBTest.php b/tests/LinkDBTest.php
index 8b0bd23b..d34ea4f5 100644
--- a/tests/LinkDBTest.php
+++ b/tests/LinkDBTest.php
@@ -103,7 +103,7 @@ class LinkDBTest extends PHPUnit_Framework_TestCase
103 unlink(self::$testDatastore); 103 unlink(self::$testDatastore);
104 $this->assertFileNotExists(self::$testDatastore); 104 $this->assertFileNotExists(self::$testDatastore);
105 105
106 $checkDB = self::getMethod('checkDB'); 106 $checkDB = self::getMethod('_checkDB');
107 $checkDB->invokeArgs($linkDB, array()); 107 $checkDB->invokeArgs($linkDB, array());
108 $this->assertFileExists(self::$testDatastore); 108 $this->assertFileExists(self::$testDatastore);
109 109
@@ -120,7 +120,7 @@ class LinkDBTest extends PHPUnit_Framework_TestCase
120 $datastoreSize = filesize(self::$testDatastore); 120 $datastoreSize = filesize(self::$testDatastore);
121 $this->assertGreaterThan(0, $datastoreSize); 121 $this->assertGreaterThan(0, $datastoreSize);
122 122
123 $checkDB = self::getMethod('checkDB'); 123 $checkDB = self::getMethod('_checkDB');
124 $checkDB->invokeArgs($linkDB, array()); 124 $checkDB->invokeArgs($linkDB, array());
125 125
126 // ensure the datastore is left unmodified 126 // ensure the datastore is left unmodified
diff --git a/tests/utils/ReferenceLinkDB.php b/tests/utils/ReferenceLinkDB.php
index 59ba671f..0b225720 100644
--- a/tests/utils/ReferenceLinkDB.php
+++ b/tests/utils/ReferenceLinkDB.php
@@ -4,9 +4,9 @@
4 */ 4 */
5class ReferenceLinkDB 5class ReferenceLinkDB
6{ 6{
7 private $links = array(); 7 private $_links = array();
8 private $publicCount = 0; 8 private $_publicCount = 0;
9 private $privateCount = 0; 9 private $_privateCount = 0;
10 10
11 /** 11 /**
12 * Populates the test DB with reference data 12 * Populates the test DB with reference data
@@ -81,13 +81,13 @@ class ReferenceLinkDB
81 'linkdate' => $date, 81 'linkdate' => $date,
82 'tags' => $tags, 82 'tags' => $tags,
83 ); 83 );
84 $this->links[$date] = $link; 84 $this->_links[$date] = $link;
85 85
86 if ($private) { 86 if ($private) {
87 $this->privateCount++; 87 $this->_privateCount++;
88 return; 88 return;
89 } 89 }
90 $this->publicCount++; 90 $this->_publicCount++;
91 } 91 }
92 92
93 /** 93 /**
@@ -97,7 +97,7 @@ class ReferenceLinkDB
97 { 97 {
98 file_put_contents( 98 file_put_contents(
99 $filename, 99 $filename,
100 '<?php /* '.base64_encode(gzdeflate(serialize($this->links))).' */ ?>' 100 '<?php /* '.base64_encode(gzdeflate(serialize($this->_links))).' */ ?>'
101 ); 101 );
102 } 102 }
103 103
@@ -106,7 +106,7 @@ class ReferenceLinkDB
106 */ 106 */
107 public function countLinks() 107 public function countLinks()
108 { 108 {
109 return $this->publicCount + $this->privateCount; 109 return $this->_publicCount + $this->_privateCount;
110 } 110 }
111 111
112 /** 112 /**
@@ -114,7 +114,7 @@ class ReferenceLinkDB
114 */ 114 */
115 public function countPublicLinks() 115 public function countPublicLinks()
116 { 116 {
117 return $this->publicCount; 117 return $this->_publicCount;
118 } 118 }
119 119
120 /** 120 /**
@@ -122,7 +122,7 @@ class ReferenceLinkDB
122 */ 122 */
123 public function countPrivateLinks() 123 public function countPrivateLinks()
124 { 124 {
125 return $this->privateCount; 125 return $this->_privateCount;
126 } 126 }
127} 127}
128?> 128?>