1 |
dpavlin |
2 |
<?php |
2 |
|
|
// vim: ts=4 foldcolumn=4 foldmethod=marker |
3 |
|
|
/** |
4 |
|
|
* Utility functions used from other scripts |
5 |
|
|
* |
6 |
|
|
* This file is part of Reblog, |
7 |
|
|
* a derivative work of Feed On Feeds. |
8 |
|
|
* |
9 |
|
|
* Distributed under the Gnu Public License. |
10 |
|
|
* |
11 |
|
|
* @package Refeed |
12 |
|
|
* @license http://opensource.org/licenses/gpl-license.php GNU Public License |
13 |
|
|
* @author Michal Migurski <mike@stamen.com> |
14 |
|
|
* @author Michael Frumin <mfrumin@eyebeam.org> |
15 |
|
|
* @copyright ©2004 Michael Frumin, Michal Migurski |
16 |
|
|
* @link http://reblog.org Reblog |
17 |
|
|
* @link http://feedonfeeds.com Feed On Feeds |
18 |
|
|
* @version $Revision: 1.14 $ |
19 |
|
|
*/ |
20 |
|
|
|
21 |
|
|
/* |
22 |
|
|
function ref_can_boolean_search() |
23 |
|
|
{ |
24 |
|
|
if(isset($GLOBALS['REF_MYSQL_SUPPORTS_BOOLEAN_SEARCH'])) |
25 |
|
|
return $GLOBALS['REF_MYSQL_SUPPORTS_BOOLEAN_SEARCH']; |
26 |
|
|
|
27 |
|
|
$q = sprintf("SELECT * |
28 |
|
|
FROM %s AS it |
29 |
|
|
WHERE id = 1 |
30 |
|
|
AND MATCH (it.title, it.link, it.content, it.dccreator, it.dcsubject) AGAINST ('test' IN BOOLEAN MODE)", |
31 |
|
|
REF_ITEM_TABLE); |
32 |
|
|
|
33 |
|
|
$res = $GLOBALS['REF_DBH']->query($q); |
34 |
|
|
$GLOBALS['REF_MYSQL_SUPPORTS_BOOLEAN_SEARCH'] = (DB::isError($res) ? false : true); |
35 |
|
|
|
36 |
|
|
return $GLOBALS['REF_MYSQL_SUPPORTS_BOOLEAN_SEARCH']; |
37 |
|
|
} |
38 |
|
|
*/ |
39 |
|
|
|
40 |
|
|
/** |
41 |
|
|
* Interpret an array looking for object literals. |
42 |
|
|
* |
43 |
|
|
* if any of the elements in the parameters array look like |
44 |
|
|
* {"jsonclass":["constructor", [param1, ], "prop1": ...} where |
45 |
|
|
* "constructor" is a valid class name, they are automatically |
46 |
|
|
* replaced by instances of that class per the class-hinting |
47 |
|
|
* section of the JSON spec. |
48 |
|
|
* |
49 |
|
|
* Old style, soon to be deprecated: |
50 |
|
|
* |
51 |
|
|
* if any of the elements in the parameters array look like |
52 |
|
|
* {type:'...', args:{...}}, they are assumed to represent objects |
53 |
|
|
* to be instantiated according the $class_mappings list. |
54 |
|
|
* |
55 |
|
|
* Mapped classes all assume a single, associative array constructor argument. |
56 |
|
|
* |
57 |
|
|
* @param array $params Array of parameters, modified recursively in-place |
58 |
|
|
* @param array $class_mappings Array of type:class mappings. |
59 |
|
|
* Keys are types, values are classes. |
60 |
|
|
* |
61 |
|
|
* @see http://json-rpc.org/specs.xhtml |
62 |
|
|
*/ |
63 |
|
|
function class_hints(&$params, $class_mappings=array()) |
64 |
|
|
{ |
65 |
|
|
if(is_array($params)) |
66 |
|
|
foreach($params as $p => $param) |
67 |
|
|
if(isset($param['jsonclass']) && class_exists($param['jsonclass'][0]) && is_array($param['jsonclass'][1])) { |
68 |
|
|
// new-style JSON-RPC class hinting |
69 |
|
|
$class = $param['jsonclass'][0]; |
70 |
|
|
$args = array(); |
71 |
|
|
|
72 |
|
|
foreach($param['jsonclass'][1] as $a => $arg) |
73 |
|
|
$args[$a] = preg_replace('#\s+#s', ' ', var_export($arg, 1)); |
74 |
|
|
|
75 |
|
|
eval('$params[$p] = new '.$class.'('.join(', ', $args).');'); |
76 |
|
|
|
77 |
|
|
foreach($param as $name => $value) |
78 |
|
|
if($name != 'jsonclass') |
79 |
|
|
$params[$p]->$name = $value; |
80 |
|
|
|
81 |
|
|
} elseif(isset($param['type']) && isset($class_mappings[$param['type']])) { |
82 |
|
|
// old-style reblog alpha class hinting, soon to be deprecated |
83 |
|
|
$params[$p] = new $class_mappings[$param['type']]($param['args']); |
84 |
|
|
|
85 |
|
|
} else { |
86 |
|
|
// otherwise, we may want to look deeper |
87 |
|
|
class_hints($params[$p], $class_mappings); |
88 |
|
|
|
89 |
|
|
} |
90 |
|
|
} |
91 |
|
|
|
92 |
|
|
/** |
93 |
|
|
* Initialize globals to be used by Reblog |
94 |
|
|
* |
95 |
|
|
* @param RF_Controller $controller Assigned to $GLOBALS['REBLOG_CONTROLLER'] |
96 |
|
|
* @param RF_User $user Assigned to $GLOBALS['REBLOG_USER'] |
97 |
|
|
* @param Smarty $view Assigned to $GLOBALS['REBLOG_VIEW'] |
98 |
|
|
*/ |
99 |
|
|
function initialize_globals(&$controller, &$user, &$view) |
100 |
|
|
{ |
101 |
|
|
$GLOBALS['REBLOG_CONTROLLER'] =& $controller; |
102 |
|
|
$GLOBALS['REBLOG_USER'] =& $user; |
103 |
|
|
$GLOBALS['REBLOG_VIEW'] =& $view; |
104 |
|
|
} |
105 |
|
|
|
106 |
|
|
/** |
107 |
|
|
* Initialize session variables. |
108 |
|
|
* |
109 |
|
|
* @param array $ARGS Associative array of arguments, if any - set to $_REQUEST if omitted. |
110 |
|
|
* @uses REF_USE_KEYBOARD Assigned to _SESSION[use_kb] if use_kb is empty and this is not |
111 |
|
|
*/ |
112 |
|
|
function initialize_session_variables($ARGS=null) |
113 |
|
|
{ |
114 |
|
|
if(!is_array($ARGS)) |
115 |
|
|
$ARGS =& $_REQUEST; |
116 |
|
|
|
117 |
|
|
$_SESSION['feed_sort'] = isset($ARGS['feed_sort']) |
118 |
|
|
? $ARGS['feed_sort'] |
119 |
|
|
: $_SESSION['feed_sort']; |
120 |
|
|
|
121 |
|
|
$_SESSION['use_kb'] = isset($_SESSION['use_kb']) |
122 |
|
|
? $_SESSION['use_kb'] |
123 |
|
|
: (defined('REF_USE_KEYBOARD') |
124 |
|
|
? REF_USE_KEYBOARD |
125 |
|
|
: 0); |
126 |
|
|
} |
127 |
|
|
|
128 |
|
|
/** |
129 |
|
|
* Initialize timezone |
130 |
|
|
* |
131 |
|
|
* @uses REBLOG_TIMEZONE Assigned to TZ environment variable |
132 |
|
|
* @return boolean Return value of putenv() |
133 |
|
|
*/ |
134 |
|
|
function initialize_timezone() |
135 |
|
|
{ |
136 |
|
|
if(defined('REBLOG_TIMEZONE')) |
137 |
|
|
return putenv('TZ='.REBLOG_TIMEZONE); |
138 |
|
|
|
139 |
|
|
if(defined('REF_TIMEZONE')) |
140 |
|
|
return putenv('TZ='.REF_TIMEZONE); |
141 |
|
|
} |
142 |
|
|
|
143 |
|
|
/** |
144 |
|
|
* Get a path for the session cookie |
145 |
|
|
* |
146 |
|
|
* Starting at the current directory, iterate up parent directories |
147 |
|
|
* until we reach the top ("/") or find ourselves at the Refeed root |
148 |
|
|
* directory. |
149 |
|
|
* |
150 |
|
|
* @param string $root_path Refeed root directory in filesystem |
151 |
|
|
* @return string Absolute path for session cookie use |
152 |
|
|
*/ |
153 |
|
|
function get_refeed_root($root_path = '') |
154 |
|
|
{ |
155 |
|
|
if(defined('REBLOG_REFEED_ROOT_PATH') && REBLOG_REFEED_ROOT_PATH) { |
156 |
|
|
return REBLOG_REFEED_ROOT_PATH; |
157 |
|
|
} |
158 |
|
|
|
159 |
|
|
if(php_sapi_name() == 'cli') { |
160 |
|
|
return null; |
161 |
|
|
} |
162 |
|
|
|
163 |
|
|
if(empty($root_path)) { |
164 |
|
|
return "http://{$_SERVER['HTTP_HOST']}" . rtrim(dirname($_SERVER['SCRIPT_NAME']), '/'); |
165 |
|
|
} |
166 |
|
|
|
167 |
|
|
$session_path = dirname($_SERVER['SCRIPT_NAME']); |
168 |
|
|
|
169 |
|
|
for($current_path = dirname($_SERVER['SCRIPT_FILENAME']); |
170 |
|
|
$current_path != '/' && strtolower($current_path) != strtolower($root_path); |
171 |
|
|
$current_path = dirname($current_path)) { |
172 |
|
|
|
173 |
|
|
$session_path = dirname($session_path); |
174 |
|
|
} |
175 |
|
|
|
176 |
|
|
return $session_path; |
177 |
|
|
} |
178 |
|
|
|
179 |
|
|
/** |
180 |
|
|
* Get a DSN for the database connection. |
181 |
|
|
* |
182 |
|
|
* @return string database connection string, like "mysql://user:pass@host/name" |
183 |
|
|
* |
184 |
|
|
* @uses REBLOG_DSN |
185 |
|
|
*/ |
186 |
|
|
function get_configured_dsn() |
187 |
|
|
{ |
188 |
|
|
if(defined('REBLOG_DSN')) |
189 |
|
|
return REBLOG_DSN; |
190 |
|
|
|
191 |
|
|
// old-style configuration vars |
192 |
|
|
if(defined('REF_DB_USER') && defined('REF_DB_PASS') && defined('REF_DB_HOST') && defined('REF_DB_DBNAME')) |
193 |
|
|
return sprintf('mysql://%s:%s@%s/%s', REF_DB_USER, REF_DB_PASS, REF_DB_HOST, REF_DB_DBNAME); |
194 |
|
|
|
195 |
|
|
return ''; |
196 |
|
|
} |
197 |
|
|
|
198 |
|
|
/** |
199 |
|
|
* Get a GUID prefix |
200 |
|
|
* |
201 |
|
|
* @return string GUID prefix |
202 |
|
|
* |
203 |
|
|
* @uses REBLOG_GUID_PREFIX |
204 |
|
|
*/ |
205 |
|
|
function get_configured_guid_prefix() |
206 |
|
|
{ |
207 |
|
|
if(defined('REBLOG_GUID_PREFIX')) |
208 |
|
|
return REBLOG_GUID_PREFIX; |
209 |
|
|
|
210 |
|
|
// old-style configuration vars |
211 |
|
|
if(defined('REF_GUID_TAG_PREFIX')) |
212 |
|
|
return REF_GUID_TAG_PREFIX; |
213 |
|
|
|
214 |
|
|
return ''; |
215 |
|
|
} |
216 |
|
|
|
217 |
|
|
/** |
218 |
|
|
* Get a cache directory prefix |
219 |
|
|
* |
220 |
|
|
* @return string absolute local path to cache directory |
221 |
|
|
* |
222 |
|
|
* @uses REBLOG_CACHE_DIR |
223 |
|
|
*/ |
224 |
|
|
function get_configured_cache_dir() |
225 |
|
|
{ |
226 |
|
|
if(defined('REBLOG_CACHE_DIR')) |
227 |
|
|
return REBLOG_CACHE_DIR; |
228 |
|
|
|
229 |
|
|
// old-style configuration vars |
230 |
|
|
if(defined('REF_CACHE_DIR')) |
231 |
|
|
return REF_CACHE_DIR; |
232 |
|
|
|
233 |
|
|
return realpath(dirname(__FILE__).'..'.DIRECTORY_SEPARATOR.'..').DIRECTORY_SEPARATOR.'cache'; |
234 |
|
|
} |
235 |
|
|
|
236 |
|
|
/** |
237 |
|
|
* Get a HTTP username & password |
238 |
|
|
* |
239 |
|
|
* @return array Two-element array with username & password strings |
240 |
|
|
* |
241 |
|
|
* @uses REBLOG_HTTPAUTH_NAME |
242 |
|
|
* @uses REBLOG_HTTPAUTH_PASS |
243 |
|
|
*/ |
244 |
|
|
function get_configured_httpauth() |
245 |
|
|
{ |
246 |
|
|
if(defined('REBLOG_HTTPAUTH_NAME') && defined('REBLOG_HTTPAUTH_PASS')) |
247 |
|
|
return array(REBLOG_HTTPAUTH_NAME, REBLOG_HTTPAUTH_PASS); |
248 |
|
|
|
249 |
|
|
// old-style configuration vars |
250 |
|
|
if(defined('REF_HTTPAUTH_NAME') && defined('REF_HTTPAUTH_PASS')) |
251 |
|
|
return array(REF_HTTPAUTH_NAME, REF_HTTPAUTH_PASS); |
252 |
|
|
|
253 |
|
|
return array('', ''); |
254 |
|
|
} |
255 |
|
|
|
256 |
|
|
/** |
257 |
|
|
* Get a user agent and cache age for Magpie |
258 |
|
|
* |
259 |
|
|
* @return array Two-element array with user-agent & cache age values |
260 |
|
|
* |
261 |
|
|
* @uses REBLOG_HTTP_USER_AGENT |
262 |
|
|
* @uses REBLOG_FEED_CACHE_AGE |
263 |
|
|
*/ |
264 |
|
|
function get_configured_magpiestuff() |
265 |
|
|
{ |
266 |
|
|
if(defined('REBLOG_HTTP_USER_AGENT') && defined('REBLOG_FEED_CACHE_AGE')) |
267 |
|
|
return array(REBLOG_HTTP_USER_AGENT, REBLOG_FEED_CACHE_AGE); |
268 |
|
|
|
269 |
|
|
// old-style configuration vars |
270 |
|
|
if(defined('REF_HTTP_USER_AGENT') && defined('REF_FEED_CACHE_AGE')) |
271 |
|
|
return array(REF_HTTP_USER_AGENT, REF_FEED_CACHE_AGE); |
272 |
|
|
|
273 |
|
|
return array('', 60 * 15); |
274 |
|
|
} |
275 |
|
|
|
276 |
|
|
/** |
277 |
|
|
* Get a lifetime for the session cookie |
278 |
|
|
* |
279 |
|
|
* @return int lifetime |
280 |
|
|
* |
281 |
|
|
* @uses REBLOG_SESSION_LIFETIME |
282 |
|
|
*/ |
283 |
|
|
function get_configured_cookielifetime() |
284 |
|
|
{ |
285 |
|
|
if(defined('REBLOG_SESSION_LIFETIME')) |
286 |
|
|
return REBLOG_SESSION_LIFETIME; |
287 |
|
|
|
288 |
|
|
// old-style configuration vars |
289 |
|
|
if(defined('REF_SESSION_LIFETIME')) |
290 |
|
|
return REF_SESSION_LIFETIME; |
291 |
|
|
|
292 |
|
|
return 60 * 60 * 24 * 365 * 30; |
293 |
|
|
} |
294 |
|
|
|
295 |
|
|
/** |
296 |
|
|
* Get a default version for the outgoing feed |
297 |
|
|
* |
298 |
|
|
* @return string Version of outgoing feed |
299 |
|
|
* |
300 |
|
|
* @uses REF_DEFAULT_RSS_VERSION |
301 |
|
|
*/ |
302 |
|
|
function get_configured_feedversion() |
303 |
|
|
{ |
304 |
|
|
if(defined('REBLOG_FEED_VERSION')) |
305 |
|
|
return REBLOG_FEED_VERSION; |
306 |
|
|
|
307 |
|
|
// old-style configuration vars |
308 |
|
|
if(defined('REF_DEFAULT_RSS_VERSION')) |
309 |
|
|
switch(REF_DEFAULT_RSS_VERSION) { |
310 |
|
|
case 1: |
311 |
|
|
return 'rss1.0'; |
312 |
|
|
case 2: |
313 |
|
|
return 'rss2.0'; |
314 |
|
|
} |
315 |
|
|
|
316 |
|
|
return 'rss2.0'; |
317 |
|
|
} |
318 |
|
|
|
319 |
|
|
/** |
320 |
|
|
* Print a diagnostic or progress report using whatever format is |
321 |
|
|
* appropriate to the current SAPI. |
322 |
|
|
* |
323 |
|
|
* @param string $trace A string to print |
324 |
|
|
*/ |
325 |
|
|
function print_trace($trace) |
326 |
|
|
{ |
327 |
|
|
if(php_sapi_name() == 'cli') { |
328 |
|
|
echo strip_tags($trace)."\n"; |
329 |
|
|
|
330 |
|
|
} else { |
331 |
|
|
echo '<p>'.$trace.'</p>'; |
332 |
|
|
|
333 |
|
|
} |
334 |
|
|
} |
335 |
|
|
|
336 |
|
|
|
337 |
|
|
|
338 |
|
|
// CDATAFY |
339 |
|
|
function ref_cdata_escape($s) |
340 |
|
|
{ |
341 |
|
|
return str_replace("]]>", " ] ] >", $s); |
342 |
|
|
} |
343 |
|
|
|
344 |
|
|
// ARRAYIFYING |
345 |
|
|
|
346 |
|
|
|
347 |
|
|
// HELPER |
348 |
|
|
|
349 |
|
|
function ref_find_links($content) |
350 |
|
|
{ |
351 |
|
|
$n = preg_match_all("/<a [^\>]*href\=[\'\"]*([^\"\'\s]+)[\'\"]*[^\>]*\>/i", $content, $matches, PREG_SET_ORDER); |
352 |
|
|
|
353 |
|
|
$res = array(); |
354 |
|
|
|
355 |
|
|
foreach($matches as $m) { |
356 |
|
|
$res[] = $m[1]; |
357 |
|
|
} |
358 |
|
|
|
359 |
|
|
return $res; |
360 |
|
|
} |
361 |
|
|
|
362 |
|
|
|
363 |
|
|
// DATE/TIME CONVERSIONS |
364 |
|
|
function ref_unix_timestamp2iso8601($ts) |
365 |
|
|
{ |
366 |
|
|
return date("Y-m-d\TH:i:sO",$ts); |
367 |
|
|
} |
368 |
|
|
|
369 |
|
|
function ref_unix_timestamp2rfc822($ts) |
370 |
|
|
{ |
371 |
|
|
return date("r",$ts); |
372 |
|
|
} |
373 |
|
|
|
374 |
|
|
function ref_rfc8222unix_timestamp($rfc822) |
375 |
|
|
{ |
376 |
|
|
return strtotime($rfc822); |
377 |
|
|
} |
378 |
|
|
|
379 |
|
|
function ref_iso86012unix_timestamp($iso8601) |
380 |
|
|
{ |
381 |
|
|
return parse_w3cdtf($iso8601); |
382 |
|
|
} |
383 |
|
|
|
384 |
|
|
?> |