Log in with username/password: lyceum/lyceum

root/branches/1.0/src/lib/functions.php

Revision 1253, 12.1 kB (checked in by jjb, 2 years ago)

#859, #869 Accounting for b var in 404 logic.

Line 
1 <?php
2
3 function trace($description, $information, $active=true){
4     if ($active && TRACE){
5         $time = date('i:s');
6         $web = ini_get('display_errors');
7         if ($web)
8             echo '<hr/>'.$time.' - <strong>'.$description.':</strong><br/><pre>'.$information.'</pre><hr/>';
9         else {
10             $message = "\n".$time." - [$description]: $information";
11             error_log($message, 3, TRACELOG);
12         }
13     }
14 }
15
16 function token_log($event, $information){
17         $time = date('i:s');
18         $message = "\n".$time." - [$event]: $information";
19         error_log($message, 3, TOKENLOG);
20 }
21
22 function assert_handler($file, $line, $code){
23     //TODO log error in log file when assertion fails
24     echo "
25         <hr>Assertion Failed<br/>
26         <u><b>File:</u></b> $file<br />
27         <u><b>Line:</u></b> $line<br />
28         <u><b>Code:</u></b> $code<br /><hr />";
29 }
30
31 function array_print($array, $prefix=''){
32     if (ini_get('display_errors'))
33         $break = '<br/>';
34     else
35         $break = "\n";
36     $out = "array:$break";
37     foreach($array as $key => $value){
38         $text = is_array($value) ? array_print($value, $prefix.'    ') : $value;
39         $out.=$prefix.$key.'->'.$text.$break;
40     }
41     return $out;
42 }
43
44 function hv($thing){//"has value"
45     return ( isset($thing) && (''!=$thing) );
46 }
47
48 function get_metavalues($user_id){
49     global $wpdb, $blog;
50     $blog_metavalues = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->usermeta WHERE blog = '$blog' AND user_id = '$user_id'");
51     $Lyceum_metavalues = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->usermeta WHERE meta_domain = 'system' AND user_id = '$user_id'");
52 //    trace('$blog_metavalues', array_print($blog_metavalues));
53 //    trace('$Lyceum_metavalues', array_print($Lyceum_metavalues));
54     arrayify($blog_metavalues);   
55     arrayify($Lyceum_metavalues);
56     $metavalues = array_merge($blog_metavalues, $Lyceum_metavalues);
57     return $metavalues;
58 }
59
60 function get_userblogs(){
61     global $user_ID, $wpdb, $table_prefix;
62     $blogs = $wpdb->get_results("
63         SELECT DISTINCT $wpdb->blogs.id, blognametable.option_value AS blogname, bloghometable.option_value AS home, status
64         FROM $wpdb->blogs
65             INNER JOIN $wpdb->options AS blognametable ON ($wpdb->blogs.id = blognametable.blog)
66             INNER JOIN $wpdb->options AS bloghometable ON ($wpdb->blogs.id = bloghometable.blog)
67             INNER JOIN $wpdb->usermeta ON ($wpdb->blogs.id = $wpdb->usermeta.blog)
68         WHERE
69             status = 'active' AND
70             meta_key = '{$table_prefix}capabilities' AND
71             blognametable.option_name = 'blogname' AND
72             bloghometable.option_name = 'home' AND
73             user_id = '$user_ID'
74     ");
75     return $blogs;
76 }
77
78 // Retrieves the $num last posts published on the entire system
79 function get_recent_posts($num){
80     global $wpdb;
81
82     $gmt_now = gmdate('Y-m-d H:i:s');
83
84     $post_ids = $wpdb->get_col(
85         "SELECT DISTINCT $wpdb->posts.ID
86         FROM $wpdb->posts
87             INNER JOIN $wpdb->post2cat ON (post_id = $wpdb->posts.ID)
88                 INNER JOIN $wpdb->categories ON (category_id = cat_ID )
89                     INNER JOIN $wpdb->blogs ON (blog = $wpdb->blogs.id)
90         WHERE
91             status = 'active' AND
92             post_status = 'publish' AND
93             post_password = '' AND
94             post_date_gmt < '$gmt_now'
95         ORDER BY post_date_gmt DESC
96         LIMIT $num
97     ");
98
99     $posts = array();
100     foreach($post_ids as $id)
101         $posts[] = get_post($id);
102     return $posts;
103 }
104
105 function rfc3339($date){
106     preg_match('/([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]) ([0-9][0-9]:[0-9][0-9]:[0-9][0-9])/', $date, $matches);
107     return $matches[1].'T'.$matches[2].'Z';
108 }
109
110 //TODO: specify optiondomain?
111 function get_admin_option_array($optiontype){
112     global $wpdb;
113     return explode(',', $wpdb->get_var("SELECT `option_value` FROM `$wpdb->options` WHERE `option_name` = '$optiontype'"));   
114 }
115
116 function set_admin_option_array($optiontype, $newarray){
117     global $wpdb;
118     $value = implode(',', $newarray);
119     $wpdb->query("UPDATE `$wpdb->options` SET option_value = '$value' WHERE `option_name` = '$optiontype'");   
120 }
121
122 function get_admin_ips() {
123     return get_admin_option_array('admin_ips');
124 }
125
126 function add_admin_ip($newip){
127     global $wpdb;
128     $ips = get_admin_ips();
129     $ips[]=$newip;
130     $value = implode(',', $ips);
131     $wpdb->query("UPDATE `$wpdb->options` SET option_value = '$value' WHERE `option_name` = 'admin_ips'");
132 }
133
134 function check_admin_ip(){
135     global $wpdb;
136     return array_search($_SERVER['REMOTE_ADDR'], get_admin_ips());
137 }
138
139 function comments_post_name(){
140     global $wpdb;
141     return $wpdb->get_var("SELECT `option_value` FROM `$wpdb->options` WHERE `option_name`='wp-comments-post_hash' AND `option_domain`='system'");
142 }
143
144 function delete_dir($dir) {
145     if(!$dh = @opendir($dir))
146         return;
147     while (($obj = readdir($dh))) {
148         if($obj=='.' || $obj=='..')
149             continue;
150         if (!@unlink($dir.'/'.$obj)) {
151             delete_dir($dir.'/'.$obj);
152             } else {
153                 $file_deleted++;
154             }
155         }
156         if (@rmdir($dir))
157             $dir_deleted++;
158 }
159
160 function empty_dir($dir){
161     if(!$dh = @opendir($dir))
162         return;
163     while (($obj = readdir($dh))) {
164         if(in_array( $obj, array('.', '..', '.svn')))
165             continue;
166         if (!@unlink($dir.'/'.$obj)) {
167             delete_dir($dir.'/'.$obj);
168             } else {
169                 $file_deleted++;
170             }
171         }
172 }
173
174 function arrayify(&$thing){
175     $thing = $thing ? $thing : array();
176 }
177
178 function lyceum_session_reset(){
179     setcookie(session_name(), '', time()-42000, '/''.'.MAINDOMAIN);
180     session_unset();
181     session_destroy();
182 }
183
184 function lyceum_no_posts_message() {
185     global $blog, $blogdata;
186
187     echo '<h2 class="center">' . "This blog does not have any posts." . '</h2>';
188     echo '<p class="center">';
189
190     if ( current_user_can('edit_posts') )
191         echo '<a href="' . get_settings('home') . "/admin/post.php\">" . __('Click here to start blogging.') . '</a>';
192     else
193         echo '<a href="' . LURL . "\">" . __('Click here to see other content on ' . get_settings('site_title') . '.') . '</a>';
194
195     echo '</p>';
196 }
197
198 function blog_post_count(){
199     global $wpdb;
200     return $wpdb->get_post_var('count(*)', "post_status = 'publish'");
201 }
202
203 function bloginput(){
204     global $blogdata;
205     return "<input type=\"hidden\" name=\"b\" value=\"$blogdata->slug\" />";
206 }
207
208 function tokeninput($targetscript, $action='default', $id=0){
209     $token = formtoken($targetscript, $action, $id);
210     return "<input type=\"hidden\" name=\"token\" value=\"$token\" />";
211 }
212
213 function formtoken($targetscript, $action='default', $id=0) {
214     global $userdata;
215     $name = "$targetscript-$action-$id";
216     arrayify($_SESSION['formtokens']);                // This could be done better -jjb
217     $token = sha1(uniqid(rand(), TRUE));
218     $key = sha1($targetscript.$action.$id.$userdata->ID);
219     $_SESSION['formtokens'][$key][$token] = time();
220 //trace('generating token: $token, $targetscript, $action, $id, user, $key', "$token, $targetscript, $action, $id, $userdata->ID, $key");
221     return $token;
222 }
223
224 function tokenIsValid ($token, $targetscript, $action='default', $id=0, $keep=false) {
225     global $userdata;
226 //trace('$_SESSION', array_print($_SESSION));
227     $key = sha1($targetscript.$action.$id.$userdata->ID);
228 //trace('checking token: $token, $targetscript, $action, $id, user, $key', "$token, $targetscript, $action, $id, $userdata->ID, $key");
229     if (!array_key_exists($token, $_SESSION['formtokens'][$key])){
230         token_log('Token does not exist',
231             "Key: " . $key . "\n" .
232             "Token: " . $token . "\n"
233         );
234         return false;
235     }
236     $current_time = time();
237     $token_age = $current_time - $_SESSION['formtokens'][$key][$token];
238
239     if ($token_age >= 86400){//86400 seconds = 24 hours
240         token_log('Token age failure',
241             "Key: " . $key . "\n" .
242             "Token: " . $token . "\n" .
243             "Current time: " . $current_time . "\n" .
244             "Token age: " . $token_age . "\n"
245         );
246         return false;
247     }
248
249     if (!$keep)
250         unset($_SESSION['formtokens'][$key][$token]);
251     return true;
252 }
253
254 function validateToken( $token, $targetscript, $action='default', $id=0, $keep=false ){
255     if (!tokenIsValid( $token, $targetscript, $action, $id, $keep ))
256         badTokenMessage();
257 }
258
259 function badTokenMessage(){
260     die("Your tokens have timed out. <a href='{$_SERVER['HTTP_REFERER']}'>Reload</a> the page to reset your tokens. (this link might not take you anywhere useful.). The contents of your request is printed below-- It has not been saved to the system! You should save this if it does not exist elsewhere!<pre>". array_print($_REQUEST) . '</pre>');
261 }
262
263 function formOpenTag($attributes=''){
264     global $id;
265     // $home = SUBDOMAINS ? '' : WEBROOT;
266     // $cpn = comments_post_name();
267     //
268     // echo "<form action='$home/$cpn' method='post' id='commentform' $attributes>";
269     echo bloginput();//i think this is never needed
270     echo tokeninput(comments_post_name(), 'default', $id);   
271 }
272
273 // returns true if slug is lowercase alphanumeric & slug isn't blacklisted
274 function validateSlug($slug){
275     $denied = get_admin_option_array('slug_blacklist');
276     $denied[] = '';
277
278     foreach ($denied as $badslug)
279         if (strcmp(strtolower($slug),$badslug) == 0)
280             return false;
281     if (0 != strcmp($slug,strtolower($slug)))
282         return false;
283     return preg_match('/^[\w_-]*$/',$slug);
284 }
285
286 function username_is_blacklisted($username){
287     $denied = get_admin_option_array('username_blacklist');
288     $denied[] = '';
289
290     foreach ($denied as $badusername)
291         if (strcmp(strtolower($username), $badusername) == 0)
292             return true;
293     
294     return false;
295 }
296
297 function slug_from_postid($postid){
298     global $wpdb;
299     return $wpdb->get_var("
300         SELECT
301             slug
302             FROM $wpdb->blogs
303                 INNER JOIN $wpdb->categories ON (id = blog)
304                     INNER JOIN $wpdb->post2cat ON (category_id = cat_ID)
305             WHERE
306                 post_id = '$postid'
307             LIMIT 1
308     ");
309 }
310
311 function slug_from_blog_id($blog_id){
312     global $wpdb;
313     return $wpdb->get_var("SELECT slug FROM blogs WHERE id = '$blog_id'");
314 }
315
316 function url_from_blog_id($blog_id){
317     $slug = slug_from_blog_id($blog_id);
318     return
319         PROTOCOL .
320         ( SUBDOMAINS ? $slug . '.' : '' ) .
321         MAINDOMAIN . '/' .
322         ( SUBDOMAINS ? '' : $slug . '/'  );
323 }
324
325 function delete_blog($blog){
326     global $wpdb;
327
328     //  delete comments
329     $wpdb->query("
330         DELETE $wpdb->comments FROM $wpdb->comments
331             INNER JOIN $wpdb->post2cat ON (comment_post_ID = post_id)
332                 INNER JOIN $wpdb->categories ON (category_id = cat_ID)
333         WHERE
334             blog = '$blog'
335     ");
336
337     //  postmeta records
338     $wpdb->query("
339         DELETE $wpdb->postmeta FROM $wpdb->postmeta
340             INNER JOIN $wpdb->post2cat ON ($wpdb->postmeta.post_id = $wpdb->post2cat.post_id)
341                 INNER JOIN $wpdb->categories ON (category_id = cat_ID)
342         WHERE
343             blog = '$blog'
344     ");
345
346     //  postsearch
347     $wpdb->query("
348         DELETE $wpdb->postsearch FROM $wpdb->postsearch
349             INNER JOIN $wpdb->post2cat ON ($wpdb->postsearch.post_id = $wpdb->post2cat.post_id)
350                 INNER JOIN $wpdb->categories ON (category_id = cat_ID)
351         WHERE
352             blog = '$blog'
353     ");
354
355     //  posts
356     $wpdb->query("
357         DELETE $wpdb->posts FROM $wpdb->posts
358             INNER JOIN $wpdb->post2cat ON (post_id = ID)
359                 INNER JOIN $wpdb->categories ON (category_id = cat_ID)
360         WHERE
361             blog = '$blog'
362     ");
363
364     //  category<->post join records
365     $wpdb->query("
366         DELETE from $wpdb->post2cat USING $wpdb->post2cat
367             INNER JOIN $wpdb->categories ON (category_id = cat_ID)
368         WHERE
369             blog = '$blog'
370     ");
371
372     //  categories
373     $wpdb->query("
374         DELETE from $wpdb->categories
375         WHERE blog = '$blog'
376     ");
377     
378     //  options
379     $wpdb->query("
380         DELETE from $wpdb->options
381         WHERE
382             blog = '$blog' AND
383             option_domain = 'blog'
384     ");
385
386     //  links
387     $wpdb->query("
388     DELETE from $wpdb->links USING $wpdb->links
389         INNER JOIN $wpdb->linkcategories ON (cat_id = link_category)
390     WHERE
391         blog = '$blog'
392     ");
393
394     //  link categories
395     $wpdb->query("
396         DELETE from $wpdb->linkcategories
397         WHERE blog = '$blog'
398     ");
399
400     //  usermeta
401     $wpdb->query("
402         DELETE FROM $wpdb->usermeta WHERE blog = '$blog'
403     ");
404
405     // blog record
406     $wpdb->query("
407         DELETE FROM $wpdb->blogs WHERE id = '$blog'
408     ");   
409 }
410
411 function delete_user($username){
412     global $wpdb;
413
414     $user = $wpdb->get_var("SELECT ID from $wpdb->users WHERE user_login = '$username'");
415
416     //  comments
417     $wpdb->query("
418         DELETE FROM $wpdb->comments WHERE user_id = '$user'
419     ");
420     
421     //  posts and pages
422     $wpdb->query("
423         DELETE FROM $wpdb->posts WHERE post_author = '$user'
424     ");
425
426     //  usermeta
427     $wpdb->query("
428         DELETE FROM $wpdb->usermeta WHERE user_id = '$user'
429     ");
430
431     //  user
432     $wpdb->query("
433         DELETE FROM $wpdb->users WHERE ID = '$user'
434     ");
435 }
436
437 function lyceum_404(){
438     header("HTTP/1.1 404 Not Found");
439 }
440
441 function remove_token_arg($url){
442     return preg_replace('/&?token=[^&]+/', '', $url);
443 }
444
445 function remove_b_var_from_query_string($qs){
446     return preg_replace('/b=[^&]*/', '', $qs);
447 }
448
449 function get_url_arg_pairs($url) {
450     $parsed_url = parse_url($url);
451     $args = $parsed_url['query'];
452     $arr  = array();   
453     foreach (explode('&', $args) as $i) {
454         list($name,$value) = explode('=', $i, 2);
455         $arr[$name] = $value;
456     }   
457     return $arr;
458 }
459
460 ?>
461
Note: See TracBrowser for help on using the browser.
Log in with username/password: lyceum/lyceum