]> CyberLeo.Net >> Repos - Github/YOURLS.git/blob - includes/functions.php
Adding case for 'infos' in yourls_header()
[Github/YOURLS.git] / includes / functions.php
1 <?php\r
2 /*\r
3  * YOURLS\r
4  * Function library\r
5  */\r
6 \r
7 if (defined('YOURLS_DEBUG') && YOURLS_DEBUG == true) {\r
8         error_reporting(E_ALL);\r
9 } else {\r
10         error_reporting(E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING);\r
11 }\r
12 \r
13 // function to convert an integer (1337) to a string (3jk). Input integer processed as a string to beat PHP's int max value\r
14 function yourls_int2string( $id ) {\r
15         $str = yourls_base2base(trim(strval($id)), 10, YOURLS_URL_CONVERT);\r
16         if (YOURLS_URL_CONVERT <= 37)\r
17                 $str = strtolower($str);\r
18         return $str;\r
19 }\r
20 \r
21 // function to convert a string (3jk) to an integer (1337)\r
22 function yourls_string2int( $str ) {\r
23         if (YOURLS_URL_CONVERT <= 37)\r
24                 $str = strtolower($str);\r
25         return yourls_base2base(trim($str), YOURLS_URL_CONVERT, 10);\r
26 }\r
27 \r
28 // Make sure a link keyword (ie "1fv" as in "site.com/1fv") is valid.\r
29 function yourls_sanitize_string($in) {\r
30         if (YOURLS_URL_CONVERT <= 37)\r
31                 $in = strtolower($in);\r
32         return substr(preg_replace('/[^a-zA-Z0-9]/', '', $in), 0, 199);\r
33 }\r
34 \r
35 // A few sanity checks on the URL\r
36 function yourls_sanitize_url($url) {\r
37         // make sure there's only one 'http://' at the beginning (prevents pasting a URL right after the default 'http://')\r
38         $url = str_replace('http://http://', 'http://', $url);\r
39 \r
40         // make sure there's a protocol, add http:// if not\r
41         if ( !preg_match('!^([a-zA-Z]+://)!', $url ) )\r
42                 $url = 'http://'.$url;\r
43         \r
44         $url = yourls_clean_url($url);\r
45         \r
46         return substr( $url, 0, 199 );\r
47 }\r
48 \r
49 // Function to filter all invalid characters from a URL. Stolen from WP's clean_url()\r
50 function yourls_clean_url( $url ) {\r
51         $url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $url);\r
52         $strip = array('%0d', '%0a', '%0D', '%0A');\r
53         $url = yourls_deep_replace($strip, $url);\r
54         $url = str_replace(';//', '://', $url);\r
55         \r
56         return $url;\r
57 }\r
58 \r
59 // Perform a replacement while a string is found, eg $subject = '%0%0%0DDD', $search ='%0D' -> $result =''\r
60 // Stolen from WP's _deep_replace\r
61 function yourls_deep_replace($search, $subject){\r
62         $found = true;\r
63         while($found) {\r
64                 $found = false;\r
65                 foreach( (array) $search as $val ) {\r
66                         while(strpos($subject, $val) !== false) {\r
67                                 $found = true;\r
68                                 $subject = str_replace($val, '', $subject);\r
69                         }\r
70                 }\r
71         }\r
72         \r
73         return $subject;\r
74 }\r
75 \r
76 \r
77 // Make sure an integer is a valid integer (PHP's intval() limits to too small numbers)\r
78 // TODO FIXME FFS: unused ?\r
79 function yourls_sanitize_int($in) {\r
80         return ( substr(preg_replace('/[^0-9]/', '', strval($in) ), 0, 20) );\r
81 }\r
82 \r
83 // Make sure a integer is safe\r
84 // Note: this is not checking for integers, since integers on 32bits system are way too limited\r
85 // TODO: find a way to validate as integer\r
86 function yourls_intval($in) {\r
87         return mysql_real_escape_string($in);\r
88 }\r
89 \r
90 // Escape a string\r
91 function yourls_escape( $in ) {\r
92         return mysql_real_escape_string($in);\r
93 }\r
94 \r
95 // Check to see if a given keyword is reserved (ie reserved URL or an existing page)\r
96 // Returns bool\r
97 function yourls_keyword_is_reserved( $keyword ) {\r
98         global $yourls_reserved_URL;\r
99         \r
100         if ( in_array( $keyword, $yourls_reserved_URL)\r
101                 or file_exists(dirname(dirname(__FILE__))."/pages/$keyword.php")\r
102                 or is_dir(dirname(dirname(__FILE__))."/$keyword")\r
103         )\r
104                 return true;\r
105         \r
106         return false;\r
107 }\r
108 \r
109 // Function: Get IP Address. Returns a DB safe string.\r
110 function yourls_get_IP() {\r
111         if(!empty($_SERVER['HTTP_CLIENT_IP'])) {\r
112                 $ip_address = $_SERVER['HTTP_CLIENT_IP'];\r
113         } else if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {\r
114                 $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];\r
115         } else if(!empty($_SERVER['REMOTE_ADDR'])) {\r
116                 $ip_address = $_SERVER['REMOTE_ADDR'];\r
117         } else {\r
118                 $ip_address = '';\r
119         }\r
120         if(strpos($ip_address, ',') !== false) {\r
121                 $ip_address = explode(',', $ip_address);\r
122                 $ip_address = $ip_address[0];\r
123         }\r
124         \r
125         $ip_address = preg_replace( '/[^0-9a-fA-F:., ]/', '', $ip_address );\r
126 \r
127         return $ip_address;\r
128 }\r
129 \r
130 // Add the "Edit" row\r
131 function yourls_table_edit_row( $keyword ) {\r
132         global $ydb;\r
133         \r
134         $table = YOURLS_DB_TABLE_URL;\r
135         $keyword = yourls_sanitize_string( $keyword );\r
136         $id = yourls_string2int( $keyword ); // used as HTML #id\r
137         $url = $ydb->get_row("SELECT `url` FROM `$table` WHERE `keyword` = '$keyword';");\r
138         $safe_url = stripslashes( $url->url );\r
139         $www = YOURLS_SITE;\r
140         \r
141         if( $url ) {\r
142                 $return = <<<RETURN\r
143 <tr id="edit-$id" class="edit-row"><td colspan="5"><strong>Original URL</strong>:<input type="text" id="edit-url-$id" name="edit-url-$id" value="$safe_url" class="text" size="100" /> <strong>Short URL</strong>: $www/<input type="text" id="edit-keyword-$id" name="edit-keyword-$id" value="$keyword" class="text" size="10" /></td><td colspan="1"><input type="button" id="edit-submit-$id" name="edit-submit-$id" value="Save" title="Save new values" class="button" onclick="edit_save('$id');" />&nbsp;<input type="button" id="edit-close-$id" name="edit-close-$id" value="X" title="Cancel editing" class="button" onclick="hide_edit('$id');" /><input type="hidden" id="old_keyword_$id" value="$keyword"/></td></tr>\r
144 RETURN;\r
145         } else {\r
146                 $return = '<tr><td colspan="6">Error, URL not found</td></tr>';\r
147         }\r
148         \r
149         return $return;\r
150 }\r
151 \r
152 // Add a link row\r
153 function yourls_table_add_row( $keyword, $url, $ip, $clicks, $timestamp ) {\r
154         $keyword = yourls_sanitize_string( $keyword );\r
155         $id = yourls_string2int( $keyword ); // used as HTML #id\r
156         $date = date( 'M d, Y H:i', $timestamp+( YOURLS_HOURS_OFFSET * 3600) );\r
157         $clicks = number_format($clicks);\r
158         $www = YOURLS_SITE;\r
159         $shorturl = YOURLS_SITE.'/'.$keyword;\r
160         \r
161         return <<<ROW\r
162 <tr id="id-$id"><td id="keyword-$id"><a href="$shorturl">$shorturl</a></td><td id="url-$id"><a href="$url" title="$url">$url</a></td><td id="timestamp-$id">$date</td><td>$ip</td><td>$clicks</td><td class="actions"><input type="button" id="edit-button-$id" name="edit-button" value="Edit" class="button" onclick="edit('$id');" />&nbsp;<input type="button" id="delete-button-$id" name="delete-button" value="Del" class="button" onclick="remove('$id');" /><input type="hidden" id="keyword_$id" value="$keyword"/></td></tr>\r
163 ROW;\r
164 }\r
165 \r
166 // Get next id a new link will have if no custom keyword provided\r
167 function yourls_get_next_decimal() {\r
168         return (int)yourls_get_option( 'next_id' );\r
169 }\r
170 \r
171 // Update id for next link with no custom keyword\r
172 function yourls_update_next_decimal( $int = '' ) {\r
173         $int = ( $int == '' ) ? yourls_get_next_decimal() + 1 : (int)$int ;\r
174         return yourls_update_option( 'next_id', $int );\r
175 }\r
176 \r
177 // Delete a link in the DB\r
178 function yourls_delete_link_by_keyword( $keyword ) {\r
179         global $ydb;\r
180 \r
181         $table = YOURLS_DB_TABLE_URL;\r
182         $keyword = yourls_sanitize_string( $keyword );\r
183         return $ydb->query("DELETE FROM `$table` WHERE `keyword` = '$keyword';");\r
184 }\r
185 \r
186 // SQL query to insert a new link in the DB. Needs sanitized data. Returns boolean for success or failure of the inserting\r
187 function yourls_insert_link_in_db($url, $keyword) {\r
188         global $ydb;\r
189 \r
190         $table = YOURLS_DB_TABLE_URL;\r
191         $timestamp = date('Y-m-d H:i:s');\r
192         $ip = yourls_get_IP();\r
193         $insert = $ydb->query("INSERT INTO `$table` VALUES('$keyword', '$url', '$timestamp', '$ip', 0);");\r
194         \r
195         return (bool)$insert;\r
196 }\r
197 \r
198 // Add a new link in the DB, either with custom keyword, or find one\r
199 function yourls_add_new_link( $url, $keyword = '' ) {\r
200         global $ydb;\r
201 \r
202         if ( !$url || $url == 'http://' || $url == 'https://' ) {\r
203                 $return['status'] = 'fail';\r
204                 $return['code'] = 'error:nourl';\r
205                 $return['message'] = 'Missing URL input';\r
206                 return $return;\r
207         }\r
208 \r
209         $table = YOURLS_DB_TABLE_URL;\r
210         $url = mysql_real_escape_string( yourls_sanitize_url($url) );\r
211         $strip_url = stripslashes($url);\r
212         $url_exists = $ydb->get_row("SELECT keyword,url FROM `$table` WHERE `url` = '".$strip_url."';");\r
213         $ip = yourls_get_IP();\r
214         $return = array();\r
215 \r
216         // New URL : store it\r
217         if( !$url_exists ) {\r
218 \r
219                 // Custom keyword provided\r
220                 if ( $keyword ) {\r
221                         $keyword = mysql_real_escape_string(yourls_sanitize_string($keyword));\r
222                         if ( !yourls_keyword_is_free($keyword) ) {\r
223                                 // This shorturl either reserved or taken already\r
224                                 $return['status'] = 'fail';\r
225                                 $return['code'] = 'error:keyword';\r
226                                 $return['message'] = 'Short URL '.$keyword.' already exists in database or is reserved';\r
227                         } else {\r
228                                 // all clear, store !\r
229                                 yourls_insert_link_in_db($url, $keyword);\r
230                                 $return['url'] = array('keyword' => $keyword, 'url' => $strip_url, 'date' => date('Y-m-d H:i:s'), 'ip' => $ip );\r
231                                 $return['status'] = 'success';\r
232                                 $return['message'] = $strip_url.' added to database';\r
233                                 $return['html'] = yourls_table_add_row( $keyword, $url, $ip, 0, time() );\r
234                                 $return['shorturl'] = YOURLS_SITE .'/'. $keyword;\r
235                         }\r
236 \r
237                 // Create random keyword        \r
238                 } else {\r
239                         $timestamp = date('Y-m-d H:i:s');\r
240                         $id = yourls_get_next_decimal();\r
241                         $ok = false;\r
242                         do {\r
243                                 $keyword = yourls_int2string( $id );\r
244                                 $free = yourls_keyword_is_free($keyword);\r
245                                 $add_url = @yourls_insert_link_in_db($url, $keyword);\r
246                                 $ok = ($free && $add_url);\r
247                                 if ( $ok === false && $add_url === 1 ) {\r
248                                         // we stored something, but shouldn't have (ie reserved id)\r
249                                         $delete = yourls_delete_link_by_keyword( $keyword );\r
250                                         $return['extra_info'] .= '(deleted '.$keyword.')';\r
251                                 } else {\r
252                                         // everything ok, populate needed vars\r
253                                         $return['url'] = array('keyword' => $keyword, 'url' => $strip_url, 'date' => $timestamp, 'ip' => $ip );\r
254                                         $return['status'] = 'success';\r
255                                         $return['message'] = $strip_url.' added to database';\r
256                                         $return['html'] = yourls_table_add_row( $keyword, $url, $ip, 0, time() );\r
257                                         $return['shorturl'] = YOURLS_SITE .'/'. $keyword;\r
258                                 }\r
259                                 $id++;\r
260                         } while (!$ok);\r
261                         @yourls_update_next_decimal($id);\r
262                 }\r
263         } else {\r
264                 // URL was already stored\r
265                 $return['status'] = 'fail';\r
266                 $return['code'] = 'error:url';\r
267                 $return['message'] = $strip_url.' already exists in database';\r
268                 $return['shorturl'] = YOURLS_SITE .'/'. $url_exists->keyword;\r
269         }\r
270 \r
271         return $return;\r
272 }\r
273 \r
274 \r
275 // Edit a link\r
276 function yourls_edit_link($url, $keyword, $newkeyword='') {\r
277         global $ydb;\r
278 \r
279         $table = YOURLS_DB_TABLE_URL;\r
280         $url = mysql_real_escape_string(yourls_sanitize_url($url));\r
281         $keyword = yourls_sanitize_string( $keyword );\r
282         $newkeyword = yourls_sanitize_string( $newkeyword );\r
283         $strip_url = stripslashes($url);\r
284         $old_url = $ydb->get_var("SELECT `url` FROM `$table` WHERE `keyword` = '$keyword';");\r
285         \r
286         // Check if new URL is not here already\r
287         if ($old_url != $url) {\r
288                 $new_url_already_there = intval($ydb->get_var("SELECT COUNT(keyword) FROM `$table` WHERE `url` = '$strip_url';"));\r
289         } else {\r
290                 $new_url_already_there = false;\r
291         }\r
292         \r
293         // Check if the new keyword is not here already\r
294         if ( $newkeyword != $keyword ) {\r
295                 $keyword_is_ok = yourls_keyword_is_free( $newkeyword );\r
296         } else {\r
297                 $keyword_is_ok = true;\r
298         }\r
299         \r
300         // All clear, update\r
301         if ( !$new_url_already_there && $keyword_is_ok ) {\r
302                 $timestamp4screen = date( 'Y M d H:i', time()+( yourls_HOURS_OFFSET * 3600) );\r
303                 $timestamp4db = date('Y-m-d H:i:s', time()+( yourls_HOURS_OFFSET * 3600) );\r
304                 $update_url = $ydb->query("UPDATE `$table` SET `url` = '$url', `timestamp` = '$timestamp4db', `keyword` = '$newkeyword' WHERE `keyword` = '$keyword';");\r
305                 if( $update_url ) {\r
306                         $return['url'] = array( 'keyword' => $newkeyword, 'shorturl' => YOURLS_SITE.'/'.$newkeyword, 'url' => $strip_url, 'date' => $timestamp4screen);\r
307                         $return['status'] = 'success';\r
308                         $return['message'] = 'Link updated in database';\r
309                 } else {\r
310                         $return['status'] = 'fail';\r
311                         $return['message'] = 'Error updating '.$strip_url.' (Short URL: '.$keyword.') to database';\r
312                 }\r
313         \r
314         // Nope\r
315         } else {\r
316                 $return['status'] = 'fail';\r
317                 $return['message'] = 'URL or keyword already exists in database';\r
318         }\r
319         \r
320         return $return;\r
321 }\r
322 \r
323 \r
324 // Check if keyword id is free (ie not already taken, and not reserved)\r
325 function yourls_keyword_is_free( $keyword ) {\r
326         global $ydb;\r
327 \r
328         $table = YOURLS_DB_TABLE_URL;\r
329         if ( yourls_keyword_is_reserved($keyword) )\r
330                 return false;\r
331                 \r
332         $already_exists = $ydb->get_var("SELECT COUNT(`keyword`) FROM `$table` WHERE `keyword` = '$keyword';");\r
333         if ( $already_exists )\r
334                 return false;\r
335 \r
336         return true;\r
337 }\r
338 \r
339 \r
340 // Display a page\r
341 function yourls_page( $page ) {\r
342         $include = dirname(dirname(__FILE__))."/pages/$page.php";\r
343         if (!file_exists($include)) {\r
344                 die("Page '$page' not found");\r
345         }\r
346         include($include);\r
347         die();  \r
348 }\r
349 \r
350 // Connect to DB\r
351 function yourls_db_connect() {\r
352         global $ydb;\r
353 \r
354         if (!defined('YOURLS_DB_USER')\r
355                 or !defined('YOURLS_DB_PASS')\r
356                 or !defined('YOURLS_DB_NAME')\r
357                 or !defined('YOURLS_DB_HOST')\r
358                 or !class_exists('ezSQL_mysql')\r
359         ) die ('DB config/class missing');\r
360         \r
361         $ydb =  new ezSQL_mysql(YOURLS_DB_USER, YOURLS_DB_PASS, YOURLS_DB_NAME, YOURLS_DB_HOST);\r
362         if ( $ydb->last_error )\r
363                 die( $ydb->last_error );\r
364         \r
365         if ( defined('YOURLS_DEBUG') && YOURLS_DEBUG === true )\r
366                 $ydb->show_errors = true;\r
367         \r
368         // return $ydb;\r
369 }\r
370 \r
371 // Return JSON output. Compatible with PHP prior to 5.2\r
372 function yourls_json_encode($array) {\r
373         if (function_exists('json_encode')) {\r
374                 return json_encode($array);\r
375         } else {\r
376                 require_once(dirname(__FILE__).'/functions-json.php');\r
377                 return yourls_array_to_json($array);\r
378         }\r
379 }\r
380 \r
381 // Return XML output.\r
382 function yourls_xml_encode($array) {\r
383         require_once(dirname(__FILE__).'/functions-xml.php');\r
384         $converter= new yourls_array2xml;\r
385         return $converter->array2xml($array);\r
386 }\r
387 \r
388 // Return long URL associated with keyword. Optional $notfound = string default message if nothing found\r
389 function yourls_get_longurl( $keyword, $notfound = false ) {\r
390         global $ydb;\r
391         $keyword = yourls_sanitize_string( $keyword );\r
392         $table = YOURLS_DB_TABLE_URL;\r
393         $url = stripslashes($ydb->get_var("SELECT `url` FROM `$table` WHERE `keyword` = '$keyword'"));\r
394         \r
395         if( $url )\r
396                 return $url;\r
397                 \r
398         return $notfound;       \r
399 }\r
400 \r
401 // Update click count on a short URL\r
402 function yourls_update_clicks( $keyword ) {\r
403         global $ydb;\r
404         $keyword = yourls_sanitize_string( $keyword );\r
405         $table = YOURLS_DB_TABLE_URL;\r
406         return $ydb->query("UPDATE `$table` SET `clicks` = clicks + 1 WHERE `keyword` = '$keyword'");\r
407 }\r
408 \r
409 \r
410 \r
411 // Return array for API stat requests\r
412 function yourls_api_stats( $filter, $limit ) {\r
413         global $ydb;\r
414 \r
415         switch( $filter ) {\r
416                 case 'bottom':\r
417                         $sort_by = 'clicks';\r
418                         $sort_order = 'asc';\r
419                         break;\r
420                 case 'last':\r
421                         $sort_by = 'timestamp';\r
422                         $sort_order = 'desc';\r
423                         break;\r
424                 case 'rand':\r
425                 case 'random':\r
426                         $sort_by = 'RAND()';\r
427                         $sort_order = '';\r
428                         break;\r
429                 case 'top':\r
430                 default:\r
431                         $sort_by = 'clicks';\r
432                         $sort_order = 'desc';\r
433                         break;\r
434         }\r
435         \r
436         $limit = intval( $limit );\r
437         $table_url = YOURLS_DB_TABLE_URL;\r
438         $results = $ydb->get_results("SELECT * FROM $table_url WHERE 1=1 ORDER BY $sort_by $sort_order LIMIT 0, $limit;");\r
439 \r
440         $return = array();\r
441         $i = 1;\r
442 \r
443         foreach ($results as $res) {\r
444                 $return['links']['link_'.$i++] = array(\r
445                         'shorturl' => YOURLS_SITE .'/'. $res->keyword,\r
446                         'url' => $res->url,\r
447                         'timestamp' => $res->timestamp,\r
448                         'ip' => $res->ip,\r
449                         'clicks' => $res->clicks\r
450                 );\r
451         }\r
452 \r
453         $return['stats'] = yourls_get_db_stats();\r
454 \r
455         return $return;\r
456 }\r
457 \r
458 \r
459 // Get total number of URLs and sum of clicks. Input: optional "AND WHERE" clause. Returns array\r
460 function yourls_get_db_stats( $where = '' ) {\r
461         global $ydb;\r
462         $table_url = YOURLS_DB_TABLE_URL;\r
463 \r
464         $totals = $ydb->get_row("SELECT COUNT(keyword) as count, SUM(clicks) as sum FROM $table_url WHERE 1=1 $where");\r
465         return array( 'total_links' => $totals->count, 'total_clicks' => $totals->sum );\r
466 }\r
467 \r
468 // Return API result. Dies after this\r
469 function yourls_api_output( $mode, $return ) {\r
470         switch ( $mode ) {\r
471                 case 'json':\r
472                         header('Content-type: application/json');\r
473                         echo yourls_json_encode($return);\r
474                         break;\r
475                 \r
476                 case 'xml':\r
477                         header('Content-type: application/xml');\r
478                         echo yourls_xml_encode($return);\r
479                         break;\r
480                         \r
481                 case 'simple':\r
482                 default:\r
483                         echo $return['shorturl'];\r
484                         break;\r
485         }\r
486         die();\r
487 }\r
488 \r
489 // Display HTML head and <body> tag\r
490 function yourls_html_head( $context = 'index' ) {\r
491         // Load components as needed\r
492         switch ( $context ) {\r
493                 case 'bookmark':\r
494                 case 'infos':\r
495                         $share = true;\r
496                         $insert = true;\r
497                         $tablesorter = true;\r
498                         break;\r
499                         \r
500                 case 'index':\r
501                         $share = false;\r
502                         $insert = true;\r
503                         $tablesorter = true;\r
504                         break;\r
505                 \r
506                 case 'install':\r
507                 case 'login':\r
508                 case 'new':\r
509                 case 'tools':\r
510                 case 'upgrade':\r
511                         $share = false;\r
512                         $insert = false;\r
513                         $tablesorter = false;\r
514                         break;\r
515         }\r
516         \r
517         ?>\r
518 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
519 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\r
520 <head>\r
521         <title>YOURLS &raquo; Your Own URL Shortener | <?php echo YOURLS_SITE; ?></title>\r
522         <link rel="icon" type="image/gif" href="<?php echo YOURLS_SITE; ?>/images/favicon.gif" />\r
523         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\r
524         <meta name="copyright" content="Copyright &copy; 2008-<?php echo date('Y'); ?> YOURS" />\r
525         <meta name="author" content="Ozh Richard, Lester Chan" />\r
526         <meta name="description" content="Insert URL &laquo; YOURLS &raquo; Your Own URL Shortener' | <?php echo YOURLS_SITE; ?>" />\r
527         <script src="<?php echo YOURLS_SITE; ?>/js/jquery-1.3.2.min.js" type="text/javascript"></script>\r
528         <link rel="stylesheet" href="<?php echo YOURLS_SITE; ?>/css/style.css" type="text/css" media="screen" />\r
529         <?php if ($tablesorter) { ?>\r
530                 <link rel="stylesheet" href="<?php echo YOURLS_SITE; ?>/css/tablesorter.css" type="text/css" media="screen" />\r
531                 <script src="<?php echo YOURLS_SITE; ?>/js/jquery.tablesorter.min.js" type="text/javascript"></script>\r
532         <?php } ?>\r
533         <?php if ($insert) { ?>\r
534                 <script src="<?php echo YOURLS_SITE; ?>/js/insert.js" type="text/javascript"></script>\r
535         <?php } ?>\r
536         <?php if ($share) { ?>\r
537                 <script src="<?php echo YOURLS_SITE; ?>/js/share.js" type="text/javascript"></script>\r
538         <?php } ?>\r
539 </head>\r
540 <body class="<?php echo $context; ?>">\r
541         <?php\r
542 }\r
543 \r
544 // Display HTML footer (including closing body & html tags)\r
545 function yourls_html_footer() {\r
546         global $ydb;\r
547         \r
548         $num_queries = $ydb->num_queries > 1 ? $ydb->num_queries.' queries' : $ydb->num_queries.' query';\r
549         ?>\r
550         <div id="footer"><p>Powered by <a href="http://yourls.org/" title="YOURLS">YOURLS</a> v<?php echo YOURLS_VERSION; echo ' &ndash; '.$num_queries; ?></p></div>\r
551         <?php if( defined('YOURLS_DEBUG') && YOURLS_DEBUG == true ) {\r
552                 echo '<p>'. $ydb->all_queries .'<p>';\r
553         } ?>\r
554         </body>\r
555         </html>\r
556         <?php\r
557 }\r
558 \r
559 // Display "Add new URL" box\r
560 function yourls_html_addnew( $url = '', $keyword = '' ) {\r
561         $url = $url ? $url : 'http://';\r
562         ?>\r
563         <div id="new_url">\r
564                 <div>\r
565                         <form id="new_url_form" action="" method="get">\r
566                                 <div><strong>Enter the URL</strong>:<input type="text" id="add-url" name="url" value="<?php echo $url; ?>" class="text" size="90" />\r
567                                 Optional: <strong>Custom short URL</strong>:<input type="text" id="add-keyword" name="keyword" value="<?php echo $keyword; ?>" maxlength="12" class="text" size="8" />\r
568                                 <input type="button" id="add-button" name="add-button" value="Shorten The URL" class="button" onclick="add();" /></div>\r
569                         </form>\r
570                         <div id="feedback" style="display:none"></div>\r
571                 </div>\r
572         </div>\r
573         <?php\r
574 }\r
575 \r
576 // Display main table's footer\r
577 function yourls_html_tfooter( $params = array() ) {\r
578         extract( $params ); // extract $search_text, $page, $search_in_sql ...\r
579 \r
580         ?>\r
581         <tfoot>\r
582                 <tr>\r
583                         <th colspan="4" style="text-align: left;">\r
584                                 <form action="" method="get">\r
585                                         <div>\r
586                                                 <div style="float:right;">\r
587                                                         <input type="submit" id="submit-sort" value="Filter" class="button primary" />\r
588                                                         &nbsp;\r
589                                                         <input type="button" id="submit-clear-filter" value="Clear Filter" class="button" onclick="window.parent.location.href = 'index.php'" />\r
590                                                 </div>\r
591 \r
592                                                 Search&nbsp;for&nbsp;\r
593                                                 <input type="text" name="s_search" class="text" size="20" value="<?php echo $search_text; ?>" />\r
594                                                 &nbsp;in&nbsp;\r
595                                                 <select name="s_in" size="1">\r
596                                                         <!-- <option value="id"<?php if($search_in_sql == 'id') { echo ' selected="selected"'; } ?>>ID</option> -->\r
597                                                         <option value="url"<?php if($search_in_sql == 'url') { echo ' selected="selected"'; } ?>>URL</option>\r
598                                                         <option value="ip"<?php if($search_in_sql == 'ip') { echo ' selected="selected"'; } ?>>IP</option>\r
599                                                 </select>\r
600                                                 &ndash;&nbsp;Order&nbsp;by&nbsp;\r
601                                                 <select name="s_by" size="1">\r
602                                                         <option value="id"<?php if($sort_by_sql == 'id') { echo ' selected="selected"'; } ?>>ID</option>\r
603                                                         <option value="url"<?php if($sort_by_sql == 'url') { echo ' selected="selected"'; } ?>>URL</option>\r
604                                                         <option value="timestamp"<?php if($sort_by_sql == 'timestamp') { echo ' selected="selected"'; } ?>>Date</option>\r
605                                                         <option value="ip"<?php if($sort_by_sql == 'ip') { echo ' selected="selected"'; } ?>>IP</option>\r
606                                                         <option value="clicks"<?php if($sort_by_sql == 'clicks') { echo ' selected="selected"'; } ?>>Clicks</option>\r
607                                                 </select>\r
608                                                 <select name="s_order" size="1">\r
609                                                         <option value="asc"<?php if($sort_order_sql == 'asc') { echo ' selected="selected"'; } ?>>Ascending</option>\r
610                                                         <option value="desc"<?php if($sort_order_sql == 'desc') { echo ' selected="selected"'; } ?>>Descending</option>\r
611                                                 </select>\r
612                                                 &ndash;&nbsp;Show&nbsp;\r
613                                                 <input type="text" name="perpage" class="text" size="2" value="<?php echo $perpage; ?>" />&nbsp;rows<br/>\r
614                                                 \r
615                                                 Show links with\r
616                                                 <select name="link_filter" size="1">\r
617                                                         <option value="more"<?php if($link_filter === 'more') { echo ' selected="selected"'; } ?>>more</option>\r
618                                                         <option value="less"<?php if($link_filter === 'less') { echo ' selected="selected"'; } ?>>less</option>\r
619                                                 </select>\r
620                                                 than\r
621                                                 <input type="text" name="link_limit" class="text" size="4" value="<?php echo $link_limit; ?>" />clicks\r
622 \r
623                                                 \r
624                                         </div>\r
625                                 </form>\r
626                         </th>\r
627                         <th colspan="3" style="text-align: right;">\r
628                                 Pages (<?php echo $total_pages; ?>):\r
629                                 <?php\r
630                                         if ($page >= 4) {\r
631                                                 echo '<b><a href="'.$base_page.'?s_by='.$sort_by_sql.'&amp;s_order='.$sort_order_sql.$search_url.'&amp;perpage='.$perpage.'&amp;page=1'.'" title="Go to First Page">&laquo; First</a></b> ... ';\r
632                                         }\r
633                                         if($page > 1) {\r
634                                                 echo ' <b><a href="'.$base_page.'?s_by='.$sort_by_sql.'&amp;s_order='.$sort_order_sql.$search_url.'&amp;perpage='.$perpage.'&amp;page='.($page-1).'" title="&laquo; Go to Page '.($page-1).'">&laquo;</a></b> ';\r
635                                         }\r
636                                         for($i = $page - 2 ; $i  <= $page +2; $i++) {\r
637                                                 if ($i >= 1 && $i <= $total_pages) {\r
638                                                         if($i == $page) {\r
639                                                                 echo "<strong>[$i]</strong> ";\r
640                                                         } else {\r
641                                                                 echo '<a href="'.$base_page.'?s_by='.$sort_by_sql.'&amp;s_order='.$sort_order_sql.$search_url.'&amp;perpage='.$perpage.'&amp;page='.($i).'" title="Page '.$i.'">'.$i.'</a> ';\r
642                                                         }\r
643                                                 }\r
644                                         }\r
645                                         if($page < $total_pages) {\r
646                                                 echo ' <b><a href="'.$base_page.'?s_by='.$sort_by_sql.'&amp;s_order='.$sort_order_sql.$search_url.'&amp;perpage='.$perpage.'&amp;page='.($page+1).'" title="Go to Page '.($page+1).' &raquo;">&raquo;</a></b> ';\r
647                                         }\r
648                                         if (($page+2) < $total_pages) {\r
649                                                 echo ' ... <b><a href="'.$base_page.'?s_by='.$sort_by_sql.'&amp;s_order='.$sort_order_sql.$search_url.'&amp;perpage='.$perpage.'&amp;page='.($total_pages).'" title="Go to Last Page">Last &raquo;</a></b>';\r
650                                         }\r
651                                 ?>\r
652                         </th>\r
653                 </tr>\r
654         </tfoot>\r
655         <?php\r
656 }\r
657 \r
658 // Display the Quick Share box of the tools.php page\r
659 function yourls_share_box( $longurl, $shorturl, $title='', $text='' ) {\r
660         $text = ( $text ? '"'.$text.'" ' : '' );\r
661         $title = ( $title ? "$title " : '' );\r
662         $share = htmlspecialchars_decode( $title.$text.$shorturl );\r
663         $_share = rawurlencode( $share );\r
664         $_url = rawurlencode( $shorturl );\r
665         $count = 140 - strlen( $share );\r
666         ?>\r
667         \r
668         <div id="shareboxes">\r
669 \r
670                 <div id="copybox" class="share">\r
671                 <h2>Your short link</h2>\r
672                         <p><input id="copylink" class="text" size="40" value="<?php echo $shorturl; ?>" /></p>\r
673                         <p><small>Original link: <a href="<?php echo $longurl; ?>"><?php echo $longurl; ?></a></small></p>\r
674                 </div>\r
675 \r
676                 <div id="sharebox" class="share">\r
677                         <h2>Quick Share</h2>\r
678                         <div id="tweet">\r
679                                 <span id="charcount"><?php echo $count; ?></span>\r
680                                 <textarea id="tweet_body"><?php echo $share; ?></textarea>\r
681                         </div>\r
682                         <p id="share_links">Share with \r
683                                 <a id="share_tw" href="http://twitter.com/home?status=<?php echo $_share; ?>" title="Tweet this!" onclick="share('tw');return false">Twitter</a>\r
684                                 <a id="share_fb" href="http://www.facebook.com/share.php?u=<?php echo $_url; ?>" title="Share on Facebook" onclick="share('fb');return false;">Facebook</a>\r
685                                 <a id="share_ff" href="http://friendfeed.com/share/bookmarklet/frame#title=<?php echo $_share; ?>" title="Share on Friendfeed" onclick="javascript:share('ff');return false;">FriendFeed</a>\r
686                         </p>\r
687                         </div>\r
688                 </div>\r
689         \r
690         </div>\r
691         \r
692         <?php\r
693 }\r
694 \r
695 // Get number of SQL queries performed\r
696 function yourls_get_num_queries() {\r
697         global $ydb;\r
698 \r
699         return $ydb->num_queries;\r
700 }\r
701 \r
702 // Compat http_build_query for PHP4\r
703 if (!function_exists('http_build_query')) {\r
704         function http_build_query($data, $prefix=null, $sep=null) {\r
705                 return yourls_http_build_query($data, $prefix, $sep);\r
706         }\r
707 }\r
708 \r
709 // from php.net (modified by Mark Jaquith to behave like the native PHP5 function)\r
710 function yourls_http_build_query($data, $prefix=null, $sep=null, $key='', $urlencode=true) {\r
711         $ret = array();\r
712 \r
713         foreach ( (array) $data as $k => $v ) {\r
714                 if ( $urlencode)\r
715                         $k = urlencode($k);\r
716                 if ( is_int($k) && $prefix != null )\r
717                         $k = $prefix.$k;\r
718                 if ( !empty($key) )\r
719                         $k = $key . '%5B' . $k . '%5D';\r
720                 if ( $v === NULL )\r
721                         continue;\r
722                 elseif ( $v === FALSE )\r
723                         $v = '0';\r
724 \r
725                 if ( is_array($v) || is_object($v) )\r
726                         array_push($ret,yourls_http_build_query($v, '', $sep, $k, $urlencode));\r
727                 elseif ( $urlencode )\r
728                         array_push($ret, $k.'='.urlencode($v));\r
729                 else\r
730                         array_push($ret, $k.'='.$v);\r
731         }\r
732 \r
733         if ( NULL === $sep )\r
734                 $sep = ini_get('arg_separator.output');\r
735 \r
736         return implode($sep, $ret);\r
737 }\r
738 \r
739 // Returns a sanitized a user agent string. Given what I found on http://www.user-agents.org/ it should be OK.\r
740 function yourls_get_user_agent() {\r
741         if ( !isset( $_SERVER['HTTP_USER_AGENT'] ) )\r
742                 return '-';\r
743         \r
744         $ua = strip_tags( html_entity_decode( $_SERVER['HTTP_USER_AGENT'] ));\r
745         $ua = preg_replace('![^0-9a-zA-Z\':., /{}\(\)\[\]\+@&\!\?;_\-=~\*\#]!', '', $ua );\r
746                 \r
747         return substr( $ua, 0, 254 );\r
748 }\r
749 \r
750 // Redirect to another page\r
751 function yourls_redirect( $location, $code = 301 ) {\r
752         // Anti fool check: cannot redirect to the URL we currently are on\r
753         if( preg_replace('!^[^:]+://!', '', $location) != $_SERVER["SERVER_NAME"].$_SERVER['REQUEST_URI'] ) {\r
754                 $protocol = $_SERVER["SERVER_PROTOCOL"];\r
755                 if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol )\r
756                         $protocol = 'HTTP/1.0';\r
757 \r
758                 $code = intval( $code );\r
759                 $desc = yourls_get_HTTP_status($code);\r
760 \r
761                 if ( php_sapi_name() != 'cgi-fcgi' )\r
762                                 header ("$protocol $code $desc"); // This causes problems on IIS and some FastCGI setups\r
763                 header("Location: $location");\r
764                 die();\r
765         }\r
766 }\r
767 \r
768 // Redirect to another page using Javascript\r
769 function yourls_redirect_javascript( $location ) {\r
770         echo <<<REDIR\r
771         <script type="text/javascript">\r
772         //window.location="$location";\r
773         </script>\r
774         <small>(if you are not redirected after 10 seconds, please <a href="$location">click here</a>)</small>\r
775 REDIR;\r
776 }\r
777 \r
778 // Return a HTTP status code\r
779 function yourls_get_HTTP_status( $code ) {\r
780         $code = intval( $code );\r
781         $headers_desc = array(\r
782                 100 => 'Continue',\r
783                 101 => 'Switching Protocols',\r
784                 102 => 'Processing',\r
785 \r
786                 200 => 'OK',\r
787                 201 => 'Created',\r
788                 202 => 'Accepted',\r
789                 203 => 'Non-Authoritative Information',\r
790                 204 => 'No Content',\r
791                 205 => 'Reset Content',\r
792                 206 => 'Partial Content',\r
793                 207 => 'Multi-Status',\r
794                 226 => 'IM Used',\r
795 \r
796                 300 => 'Multiple Choices',\r
797                 301 => 'Moved Permanently',\r
798                 302 => 'Found',\r
799                 303 => 'See Other',\r
800                 304 => 'Not Modified',\r
801                 305 => 'Use Proxy',\r
802                 306 => 'Reserved',\r
803                 307 => 'Temporary Redirect',\r
804 \r
805                 400 => 'Bad Request',\r
806                 401 => 'Unauthorized',\r
807                 402 => 'Payment Required',\r
808                 403 => 'Forbidden',\r
809                 404 => 'Not Found',\r
810                 405 => 'Method Not Allowed',\r
811                 406 => 'Not Acceptable',\r
812                 407 => 'Proxy Authentication Required',\r
813                 408 => 'Request Timeout',\r
814                 409 => 'Conflict',\r
815                 410 => 'Gone',\r
816                 411 => 'Length Required',\r
817                 412 => 'Precondition Failed',\r
818                 413 => 'Request Entity Too Large',\r
819                 414 => 'Request-URI Too Long',\r
820                 415 => 'Unsupported Media Type',\r
821                 416 => 'Requested Range Not Satisfiable',\r
822                 417 => 'Expectation Failed',\r
823                 422 => 'Unprocessable Entity',\r
824                 423 => 'Locked',\r
825                 424 => 'Failed Dependency',\r
826                 426 => 'Upgrade Required',\r
827 \r
828                 500 => 'Internal Server Error',\r
829                 501 => 'Not Implemented',\r
830                 502 => 'Bad Gateway',\r
831                 503 => 'Service Unavailable',\r
832                 504 => 'Gateway Timeout',\r
833                 505 => 'HTTP Version Not Supported',\r
834                 506 => 'Variant Also Negotiates',\r
835                 507 => 'Insufficient Storage',\r
836                 510 => 'Not Extended'\r
837         );\r
838 \r
839         if ( isset( $headers_desc[$code] ) )\r
840                 return $headers_desc[$code];\r
841         else\r
842                 return '';\r
843 }\r
844 \r
845 \r
846 // Log a redirect (for stats)\r
847 function yourls_log_redirect( $keyword ) {\r
848         global $ydb;\r
849         $table = YOURLS_DB_TABLE_LOG;\r
850         \r
851         $keyword = yourls_sanitize_string( $keyword );\r
852         $referrer = ( isset( $_SERVER['HTTP_REFERER'] ) ? yourls_sanitize_url( $_SERVER['HTTP_REFERER'] ) : 'direct' );\r
853         $ua = yourls_get_user_agent();\r
854         $ip = yourls_get_IP();\r
855         $location = yourls_get_location( $ip );\r
856         \r
857         return $ydb->query( "INSERT INTO `$table` VALUES ('', NOW(), '$keyword', '$referrer', '$ua', '$ip', '$location')" );\r
858 }\r
859 \r
860 // Converts an IP to a 2 letter country code, using GeoIP database if available in includes/geo/\r
861 function yourls_get_location( $ip = '', $default = '' ) {\r
862         if ( !file_exists( dirname(__FILE__).'/geo/GeoIP.dat') || !file_exists( dirname(__FILE__).'/geo/geoip.inc') )\r
863                 return $default;\r
864 \r
865         if ( $ip = '' )\r
866                 $ip = yourls_get_IP();\r
867                 \r
868         require_once( dirname(__FILE__).'/geo/geoip.inc') ;\r
869         $gi = geoip_open( dirname(__FILE__).'/geo/GeoIP.dat', GEOIP_STANDARD);\r
870         $location = geoip_country_code_by_addr($gi, $ip);\r
871         geoip_close($gi);\r
872 \r
873         return $location;\r
874 }\r
875 \r
876 // Check if an upgrade is needed\r
877 function yourls_upgrade_is_needed() {\r
878         // check YOURLS_VERSION && YOURLS_DB_VERSION exist && match values stored in YOURLS_DB_TABLE_OPTIONS\r
879         list( $currentver, $currentsql ) = yourls_get_current_version_from_sql();\r
880 \r
881         // Using floatval() to get 1.4 from 1.4-alpha\r
882         if( ( $currentver < floatval( YOURLS_VERSION ) ) || ( $currentsql < floatval( YOURLS_DB_VERSION ) ) )   \r
883                 return true;\r
884                 \r
885         return false;\r
886 }\r
887 \r
888 // Get current version & db version as stored in the options DB\r
889 function yourls_get_current_version_from_sql() {\r
890         $currentver = yourls_get_option( 'version' );\r
891         $currentsql = yourls_get_option( 'db_version' );\r
892         if( !$currentver )\r
893                 $currentver = '1.3';\r
894         if( !$currentsql )\r
895                 $currentsql = '100';\r
896                 \r
897         return array( $currentver, $currentsql);\r
898 }\r
899 \r
900 // Read an option from DB (or from cache if available). Return value or $default if not found\r
901 function yourls_get_option( $option_name, $default = false ) {\r
902         global $ydb;\r
903         if ( !isset( $ydb->option[$option_name] ) ) {\r
904                 $table = YOURLS_DB_TABLE_OPTIONS;\r
905                 $option_name = yourls_escape( $option_name );\r
906                 $row = $ydb->get_row( "SELECT `option_value` FROM `$table` WHERE `option_name` = '$option_name' LIMIT 1" );\r
907                 if ( is_object( $row) ) { // Has to be get_row instead of get_var because of funkiness with 0, false, null values\r
908                         $value = $row->option_value;\r
909                 } else { // option does not exist, so we must cache its non-existence\r
910                         $value = $default;\r
911                 }\r
912                 $ydb->option[$option_name] = yourls_maybe_unserialize( $value );\r
913         }\r
914 \r
915         return $ydb->option[$option_name];\r
916 }\r
917 \r
918 // Read all options from DB at once\r
919 function yourls_get_all_options() {\r
920         global $ydb;\r
921         $table = YOURLS_DB_TABLE_OPTIONS;\r
922         \r
923         $allopt = $ydb->get_results("SELECT `option_name`, `option_value` FROM `$table` WHERE 1=1");\r
924         \r
925         foreach( $allopt as $option ) {\r
926                 $ydb->option[$option->option_name] = yourls_maybe_unserialize( $option->option_value );\r
927         }\r
928 }\r
929 \r
930 // Update (add if doesn't exist) an option to DB\r
931 function yourls_update_option( $option_name, $newvalue ) {\r
932         global $ydb;\r
933         $table = YOURLS_DB_TABLE_OPTIONS;\r
934 \r
935         $safe_option_name = yourls_escape( $option_name );\r
936 \r
937         $oldvalue = yourls_get_option( $safe_option_name );\r
938 \r
939         // If the new and old values are the same, no need to update.\r
940         if ( $newvalue === $oldvalue )\r
941                 return false;\r
942 \r
943         if ( false === $oldvalue ) {\r
944                 yourls_add_option( $option_name, $newvalue );\r
945                 return true;\r
946         }\r
947 \r
948         $_newvalue = yourls_escape( yourls_maybe_serialize( $newvalue ) );\r
949 \r
950         $ydb->query( "UPDATE `$table` SET `option_value` = '$_newvalue' WHERE `option_name` = '$option_name'");\r
951 \r
952         if ( $ydb->rows_affected == 1 ) {\r
953                 $ydb->option[$option_name] = $newvalue;\r
954                 return true;\r
955         }\r
956         return false;\r
957 }\r
958 \r
959 // Add an option to the DB\r
960 function yourls_add_option( $name, $value = '' ) {\r
961         global $ydb;\r
962         $table = YOURLS_DB_TABLE_OPTIONS;\r
963         $safe_name = yourls_escape( $name );\r
964 \r
965         // Make sure the option doesn't already exist. We can check the 'notoptions' cache before we ask for a db query\r
966         if ( false !== yourls_get_option( $safe_name ) )\r
967                 return;\r
968 \r
969         $_value = yourls_escape( yourls_maybe_serialize( $value ) );\r
970 \r
971         $ydb->query( "INSERT INTO `$table` (`option_name`, `option_value`) VALUES ('$name', '$_value')" );\r
972         $ydb->option[$name] = $value;\r
973         return;\r
974 }\r
975 \r
976 \r
977 // Delete an option from the DB\r
978 function yourls_delete_option( $name ) {\r
979         global $ydb;\r
980         $table = YOURLS_DB_TABLE_OPTIONS;\r
981         $name = yourls_escape( $name );\r
982 \r
983         // Get the ID, if no ID then return\r
984         $option = $ydb->get_row( "SELECT option_id FROM `$table` WHERE `option_name` = '$name'" );\r
985         if ( is_null($option) || !$option->option_id )\r
986                 return false;\r
987         $ydb->query( "DELETE FROM `$table` WHERE `option_name` = '$name'" );\r
988         return true;\r
989 }\r
990 \r
991 \r
992 \r
993 // Serialize data if needed. Stolen from WordPress\r
994 function yourls_maybe_serialize( $data ) {\r
995         if ( is_array( $data ) || is_object( $data ) )\r
996                 return serialize( $data );\r
997 \r
998         if ( yourls_is_serialized( $data ) )\r
999                 return serialize( $data );\r
1000 \r
1001         return $data;\r
1002 }\r
1003 \r
1004 // Check value to find if it was serialized. Stolen from WordPress\r
1005 function yourls_is_serialized( $data ) {\r
1006         // if it isn't a string, it isn't serialized\r
1007         if ( !is_string( $data ) )\r
1008                 return false;\r
1009         $data = trim( $data );\r
1010         if ( 'N;' == $data )\r
1011                 return true;\r
1012         if ( !preg_match( '/^([adObis]):/', $data, $badions ) )\r
1013                 return false;\r
1014         switch ( $badions[1] ) {\r
1015                 case 'a' :\r
1016                 case 'O' :\r
1017                 case 's' :\r
1018                         if ( preg_match( "/^{$badions[1]}:[0-9]+:.*[;}]\$/s", $data ) )\r
1019                                 return true;\r
1020                         break;\r
1021                 case 'b' :\r
1022                 case 'i' :\r
1023                 case 'd' :\r
1024                         if ( preg_match( "/^{$badions[1]}:[0-9.E-]+;\$/", $data ) )\r
1025                                 return true;\r
1026                         break;\r
1027         }\r
1028         return false;\r
1029 }\r
1030 \r
1031 // Unserialize value only if it was serialized. Stolen from WP\r
1032 function yourls_maybe_unserialize( $original ) {\r
1033         if ( yourls_is_serialized( $original ) ) // don't attempt to unserialize data that wasn't serialized going in\r
1034                 return @unserialize( $original );\r
1035         return $original;\r
1036 }\r