<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[BuddyPress][7014] branches/1.7: Audit of parameter sanitization in Groups and Core database classes</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://buddypress.trac.wordpress.org/changeset/7014">7014</a></dd>
<dt>Author</dt> <dd>boonebgorges</dd>
<dt>Date</dt> <dd>2013-05-07 23:42:23 +0000 (Tue, 07 May 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>Audit of parameter sanitization in Groups and Core database classes

- Uses wp_parse_id_list() to sanitize parameters of integer arrays
- Implements a more consistent approach to LIKE clause sanitization

See <a href="http://buddypress.trac.wordpress.org/ticket/4989">#4989</a>

Props johnjamesjacoby</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branches17bpcorebpcoreclassesphp">branches/1.7/bp-core/bp-core-classes.php</a></li>
<li><a href="#branches17bpgroupsbpgroupsclassesphp">branches/1.7/bp-groups/bp-groups-classes.php</a></li>
<li><a href="#branches17bptemplatesbplegacybuddypressfunctionsphp">branches/1.7/bp-templates/bp-legacy/buddypress-functions.php</a></li>
<li><a href="#branches17bpthemesbpdefault_incajaxphp">branches/1.7/bp-themes/bp-default/_inc/ajax.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branches17bpcorebpcoreclassesphp"></a>
<div class="modfile"><h4>Modified: branches/1.7/bp-core/bp-core-classes.php (7013 => 7014)</h4>
<pre class="diff"><span>
<span class="info">--- branches/1.7/bp-core/bp-core-classes.php 2013-05-07 21:57:17 UTC (rev 7013)
+++ branches/1.7/bp-core/bp-core-classes.php    2013-05-07 23:42:23 UTC (rev 7014)
</span><span class="lines">@@ -836,7 +836,7 @@
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $search_terms ) && bp_is_active( 'xprofile' ) ) {
</span><del>-                       $search_terms             = like_escape( $wpdb->escape( $search_terms ) );
</del><ins>+                        $search_terms             = esc_sql( like_escape( trim( $search_terms ) ) );
</ins><span class="cx">                   $sql['where_searchterms'] = "AND spd.value LIKE '%%$search_terms%%'";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="lines">@@ -953,10 +953,16 @@
</span><span class="cx">                  }
</span><span class="cx">          }
</span><span class="cx"> 
</span><del>-               $letter     = like_escape( $wpdb->escape( $letter ) );
</del><ins>+                $letter     = esc_sql( like_escape( trim( $letter ) ) );
</ins><span class="cx">           $status_sql = bp_core_get_status_sql( 'u.' );
</span><span class="cx"> 
</span><del>-               $exclude_sql = ( !empty( $exclude ) ) ? " AND u.ID NOT IN ({$exclude})" : "";
</del><ins>+                if ( !empty( $exclude ) ) {
+                       $exclude     = wp_parse_id_list( $r['exclude'] );
+                       $exclude     = $wpdb->escape( implode( ',', $exclude ) );
+                       $exclude_sql = " AND u.id NOT IN ({$exclude})";
+               } else {
+                       $exclude_sql = '';
+               }
</ins><span class="cx"> 
</span><span class="cx">          $total_users_sql = apply_filters( 'bp_core_users_by_letter_count_sql', $wpdb->prepare( "SELECT COUNT(DISTINCT u.ID) FROM {$wpdb->users} u LEFT JOIN {$bp->profile->table_name_data} pd ON u.ID = pd.user_id LEFT JOIN {$bp->profile->table_name_fields} pf ON pd.field_id = pf.id WHERE {$status_sql} AND pf.name = %s {$exclude_sql} AND pd.value LIKE '{$letter}%%'  ORDER BY pd.value ASC", bp_xprofile_fullname_field_name() ) );
</span><span class="cx">          $paged_users_sql = apply_filters( 'bp_core_users_by_letter_sql',       $wpdb->prepare( "SELECT DISTINCT u.ID as id, u.user_registered, u.user_nicename, u.user_login, u.user_email FROM {$wpdb->users} u LEFT JOIN {$bp->profile->table_name_data} pd ON u.ID = pd.user_id LEFT JOIN {$bp->profile->table_name_fields} pf ON pd.field_id = pf.id WHERE {$status_sql} AND pf.name = %s {$exclude_sql} AND pd.value LIKE '{$letter}%%' ORDER BY pd.value ASC{$pag_sql}", bp_xprofile_fullname_field_name() ) );
</span><span class="lines">@@ -1045,7 +1051,7 @@
</span><span class="cx">          $user_ids = array();
</span><span class="cx">          $pag_sql  = $limit && $page ? $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * intval( $limit ) ), intval( $limit ) ) : '';
</span><span class="cx"> 
</span><del>-               $search_terms = like_escape( $wpdb->escape( $search_terms ) );
</del><ins>+                $search_terms = esc_sql( like_escape( trim( $search_terms ) ) );
</ins><span class="cx">           $status_sql   = bp_core_get_status_sql( 'u.' );
</span><span class="cx"> 
</span><span class="cx">          $total_users_sql = apply_filters( 'bp_core_search_users_count_sql', "SELECT COUNT(DISTINCT u.ID) as id FROM {$wpdb->users} u LEFT JOIN {$bp->profile->table_name_data} pd ON u.ID = pd.user_id WHERE {$status_sql} AND pd.value LIKE '%%{$search_terms}%%' ORDER BY pd.value ASC", $search_terms );
</span></span></pre></div>
<a id="branches17bpgroupsbpgroupsclassesphp"></a>
<div class="modfile"><h4>Modified: branches/1.7/bp-groups/bp-groups-classes.php (7013 => 7014)</h4>
<pre class="diff"><span>
<span class="info">--- branches/1.7/bp-groups/bp-groups-classes.php     2013-05-07 21:57:17 UTC (rev 7013)
+++ branches/1.7/bp-groups/bp-groups-classes.php        2013-05-07 23:42:23 UTC (rev 7014)
</span><span class="lines">@@ -221,7 +221,7 @@
</span><span class="cx">          if ( empty( $user_id ) )
</span><span class="cx">                  $user_id = bp_displayed_user_id();
</span><span class="cx"> 
</span><del>-               $filter = like_escape( $wpdb->escape( $filter ) );
</del><ins>+                $filter = esc_sql( like_escape( $filter ) );
</ins><span class="cx"> 
</span><span class="cx">          if ( !empty( $limit ) && !empty( $page ) )
</span><span class="cx">                  $pag_sql = $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) );
</span><span class="lines">@@ -240,18 +240,21 @@
</span><span class="cx">          return array( 'groups' => $paged_groups, 'total' => $total_groups );
</span><span class="cx">  }
</span><span class="cx"> 
</span><ins>+       /**
+        * @todo Deprecate in favor of get()
+        */
</ins><span class="cx">   function search_groups( $filter, $limit = null, $page = null, $sort_by = false, $order = false ) {
</span><span class="cx">          global $wpdb, $bp;
</span><span class="cx"> 
</span><del>-               $filter = like_escape( $wpdb->escape( $filter ) );
</del><ins>+                $filter = esc_sql( like_escape( $filter ) );
</ins><span class="cx"> 
</span><span class="cx">          if ( !empty( $limit ) && !empty( $page ) )
</span><span class="cx">                  $pag_sql = $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) );
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $sort_by ) && !empty( $order ) ) {
</span><del>-                       $sort_by   = $wpdb->escape( $sort_by );
-                       $order     = $wpdb->escape( $order );
-                       $order_sql = "ORDER BY $sort_by $order";
</del><ins>+                        $sort_by   = esc_sql( $sort_by );
+                       $order     = esc_sql( $order );
+                       $order_sql = "ORDER BY {$sort_by} {$order}";
</ins><span class="cx">           }
</span><span class="cx"> 
</span><span class="cx">          if ( !bp_current_user_can( 'bp_moderate' ) )
</span><span class="lines">@@ -363,7 +366,7 @@
</span><span class="cx">                  $sql['hidden'] = " AND g.status != 'hidden'";
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $search_terms ) ) {
</span><del>-                       $search_terms = like_escape( $wpdb->escape( $search_terms ) );
</del><ins>+                        $search_terms = esc_sql( like_escape( $search_terms ) );
</ins><span class="cx">                   $sql['search'] = " AND ( g.name LIKE '%%{$search_terms}%%' OR g.description LIKE '%%{$search_terms}%%' )";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="lines">@@ -371,18 +374,14 @@
</span><span class="cx">                  $sql['user'] = $wpdb->prepare( " AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0", $user_id );
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $include ) ) {
</span><del>-                       if ( is_array( $include ) )
-                               $include = implode( ',', $include );
-
-                       $include = $wpdb->escape( $include );
</del><ins>+                        $include        = wp_parse_id_list( $r['include'] );
+                       $include        = $wpdb->escape( implode( ',', $include ) );
</ins><span class="cx">                   $sql['include'] = " AND g.id IN ({$include})";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $exclude ) ) {
</span><del>-                       if ( is_array( $exclude ) )
-                               $exclude = implode( ',', $exclude );
-
-                       $exclude = $wpdb->escape( $exclude );
</del><ins>+                        $exclude        = wp_parse_id_list( $r['exclude'] );
+                       $exclude        = $wpdb->escape( implode( ',', $exclude ) );
</ins><span class="cx">                   $sql['exclude'] = " AND g.id NOT IN ({$exclude})";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="lines">@@ -479,17 +478,18 @@
</span><span class="cx">                  $hidden_sql = " AND g.status != 'hidden'";
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $search_terms ) ) {
</span><del>-                       $search_terms = like_escape( $wpdb->escape( $search_terms ) );
</del><ins>+                        $search_terms = esc_sql( like_escape( trim( $search_terms ) ) );
</ins><span class="cx">                   $search_sql = " AND ( g.name LIKE '%%{$search_terms}%%' OR g.description LIKE '%%{$search_terms}%%' )";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $exclude ) ) {
</span><del>-                       $exclude = $wpdb->escape( $exclude );
</del><ins>+                        $exclude     = wp_parse_id_list( $exclude );
+                       $exclude     = $wpdb->escape( implode( ',', $exclude ) );
</ins><span class="cx">                   $exclude_sql = " AND g.id NOT IN ({$exclude})";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $user_id ) ) {
</span><del>-                       $user_id = $wpdb->escape( $user_id );
</del><ins>+                        $user_id      = absint( $wpdb->escape( $user_id ) );
</ins><span class="cx">                   $paged_groups = $wpdb->get_results( "SELECT DISTINCT g.*, gm1.meta_value as total_member_count, gm2.meta_value as last_activity FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name_groupmeta} gm3, {$bp->groups->table_name_members} m, {$bbdb->forums} f, {$bp->groups->table_name} g WHERE g.id = m.group_id AND g.id = gm1.group_id AND g.id = gm2.group_id AND g.id = gm3.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count' AND (gm3.meta_key = 'forum_id' AND gm3.meta_value = f.forum_id) AND f.topics > 0 {$hidden_sql} {$search_sql} AND m.user_id = {$user_id} AND m.is_confirmed = 1 AND m.is_banned = 0 {$exclude_sql} ORDER BY f.topics DESC {$pag_sql}" );
</span><span class="cx">                  $total_groups = $wpdb->get_var( "SELECT COUNT(DISTINCT g.id) FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name_groupmeta} gm3, {$bbdb->forums} f, {$bp->groups->table_name} g WHERE g.id = gm1.group_id AND g.id = gm2.group_id AND g.id = gm3.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count' AND (gm3.meta_key = 'forum_id' AND gm3.meta_value = f.forum_id) AND f.topics > 0 {$hidden_sql} {$search_sql} AND m.user_id = {$user_id} AND m.is_confirmed = 1 AND m.is_banned = 0 {$exclude_sql}" );
</span><span class="cx">          } else {
</span><span class="lines">@@ -520,12 +520,13 @@
</span><span class="cx">                  $hidden_sql = " AND g.status != 'hidden'";
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $search_terms ) ) {
</span><del>-                       $search_terms = like_escape( $wpdb->escape( $search_terms ) );
</del><ins>+                        $search_terms = esc_sql( like_escape( trim( $search_terms ) ) );
</ins><span class="cx">                   $search_sql = " AND ( g.name LIKE '%%{$search_terms}%%' OR g.description LIKE '%%{$search_terms}%%' )";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $exclude ) ) {
</span><del>-                       $exclude = $wpdb->escape( $exclude );
</del><ins>+                        $exclude     = wp_parse_id_list( $exclude );
+                       $exclude     = $wpdb->escape( implode( ',', $exclude ) );
</ins><span class="cx">                   $exclude_sql = " AND g.id NOT IN ({$exclude})";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="lines">@@ -562,14 +563,15 @@
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $exclude ) ) {
</span><del>-                       $exclude = $wpdb->escape( $exclude );
</del><ins>+                        $exclude     = wp_parse_id_list( $exclude );
+                       $exclude     = $wpdb->escape( implode( ',', $exclude ) );
</ins><span class="cx">                   $exclude_sql = " AND g.id NOT IN ({$exclude})";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="cx">          if ( !bp_current_user_can( 'bp_moderate' ) )
</span><span class="cx">                  $hidden_sql = " AND status != 'hidden'";
</span><span class="cx"> 
</span><del>-               $letter = like_escape( $wpdb->escape( $letter ) );
</del><ins>+                $letter = esc_sql( like_escape( $letter ) );
</ins><span class="cx"> 
</span><span class="cx">          if ( !empty( $limit ) && !empty( $page ) ) {
</span><span class="cx">                  $pag_sql      = $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) );
</span><span class="lines">@@ -601,12 +603,13 @@
</span><span class="cx">                  $hidden_sql = "AND g.status != 'hidden'";
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $search_terms ) ) {
</span><del>-                       $search_terms = like_escape( $wpdb->escape( $search_terms ) );
</del><ins>+                        $search_terms = esc_sql( like_escape( trim( $search_terms ) ) );
</ins><span class="cx">                   $search_sql = " AND ( g.name LIKE '%%{$search_terms}%%' OR g.description LIKE '%%{$search_terms}%%' )";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $exclude ) ) {
</span><del>-                       $exclude = $wpdb->escape( $exclude );
</del><ins>+                        $exclude     = wp_parse_id_list( $exclude );
+                       $exclude     = $wpdb->escape( implode( ',', $exclude ) );
</ins><span class="cx">                   $exclude_sql = " AND g.id NOT IN ({$exclude})";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="lines">@@ -634,6 +637,10 @@
</span><span class="cx">          if ( empty( $group_ids ) )
</span><span class="cx">                  return $paged_groups;
</span><span class="cx"> 
</span><ins>+               // Sanitize group IDs
+               $group_ids = wp_parse_id_list( $group_ids );
+               $group_ids = implode( ',', $group_ids );
+
</ins><span class="cx">           // Fetch the logged in users status within each group
</span><span class="cx">          $user_status = $wpdb->get_col( $wpdb->prepare( "SELECT group_id FROM {$bp->groups->table_name_members} WHERE user_id = %d AND group_id IN ( {$group_ids} ) AND is_confirmed = 1 AND is_banned = 0", bp_loggedin_user_id() ) );
</span><span class="cx">          for ( $i = 0, $count = count( $paged_groups ); $i < $count; ++$i ) {
</span><span class="lines">@@ -735,8 +742,8 @@
</span><span class="cx">          $sql['from']   = "FROM {$bbdb->topics} AS t INNER JOIN {$bp->groups->table_name_groupmeta} AS gm ON t.forum_id = gm.meta_value INNER JOIN {$bp->groups->table_name} AS g ON gm.group_id = g.id";
</span><span class="cx">          $sql['where']  = "WHERE gm.meta_key = 'forum_id' {$status_sql} AND t.topic_status = '0' AND t.topic_sticky != '2'";
</span><span class="cx"> 
</span><del>-               if ( $search_terms ) {
-                       $st = like_escape( $search_terms );
</del><ins>+                if ( !empty( $search_terms ) ) {
+                       $st = esc_sql( like_escape( $search_terms ) );
</ins><span class="cx">                   $sql['where'] .= " AND (  t.topic_title LIKE '%{$st}%' )";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="lines">@@ -997,7 +1004,7 @@
</span><span class="cx">                  $pag_sql = $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) );
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $filter ) ) {
</span><del>-                       $filter = like_escape( $wpdb->escape( $filter ) );
</del><ins>+                        $filter     = esc_sql( like_escape( $filter ) );
</ins><span class="cx">                   $filter_sql = " AND ( g.name LIKE '%%{$filter}%%' OR g.description LIKE '%%{$filter}%%' )";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="lines">@@ -1019,7 +1026,7 @@
</span><span class="cx">                  $pag_sql = $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) );
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $filter ) ) {
</span><del>-                       $filter = like_escape( $wpdb->escape( $filter ) );
</del><ins>+                        $filter     = esc_sql( like_escape( $filter ) );
</ins><span class="cx">                   $filter_sql = " AND ( g.name LIKE '%%{$filter}%%' OR g.description LIKE '%%{$filter}%%' )";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="lines">@@ -1041,7 +1048,7 @@
</span><span class="cx">                  $pag_sql = $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) );
</span><span class="cx"> 
</span><span class="cx">          if ( !empty( $filter ) ) {
</span><del>-                       $filter = like_escape( $wpdb->escape( $filter ) );
</del><ins>+                        $filter     = esc_sql( like_escape( trim( $filter ) ) );
</ins><span class="cx">                   $filter_sql = " AND ( g.name LIKE '%%{$filter}%%' OR g.description LIKE '%%{$filter}%%' )";
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="lines">@@ -1072,7 +1079,13 @@
</span><span class="cx"> 
</span><span class="cx">          $pag_sql = ( !empty( $limit ) && !empty( $page ) ) ? $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) ) : '';
</span><span class="cx"> 
</span><del>-               $exclude_sql = !empty( $exclude ) ? $wpdb->prepare( " AND g.id NOT IN (%s)", $exclude ) : '';
</del><ins>+                if ( !empty( $exclude ) ) {
+                       $exclude     = wp_parse_id_list( $exclude );
+                       $exclude     = $wpdb->escape( implode( ',', $exclude ) );
+                       $exclude_sql = " AND g.id NOT IN ({$exclude})";
+               } else {
+                       $exclude_sql = '';
+               }
</ins><span class="cx"> 
</span><span class="cx">          $paged_groups = $wpdb->get_results( $wpdb->prepare( "SELECT g.*, gm1.meta_value as total_member_count, gm2.meta_value as last_activity FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.id = m.group_id AND g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count' AND m.is_confirmed = 0 AND m.inviter_id != 0 AND m.invite_sent = 1 AND m.user_id = %d {$exclude_sql} ORDER BY m.date_modified ASC {$pag_sql}", $user_id ) );
</span><span class="cx">          $total_groups = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id AND m.is_confirmed = 0 AND m.inviter_id != 0 AND m.invite_sent = 1 AND m.user_id = %d {$exclude_sql} ORDER BY date_modified ASC", $user_id ) );
</span><span class="lines">@@ -1175,14 +1188,14 @@
</span><span class="cx">          return $wpdb->query( $wpdb->prepare( "SELECT id FROM {$bp->groups->table_name_members} WHERE user_id = %d AND group_id = %d AND is_confirmed = 0 AND is_banned = 0 AND inviter_id = 0", $user_id, $group_id ) );
</span><span class="cx">  }
</span><span class="cx"> 
</span><del>-       function get_random_groups( $user_id, $total_groups = 5 ) {
</del><ins>+        function get_random_groups( $user_id = 0, $total_groups = 5 ) {
</ins><span class="cx">           global $wpdb, $bp;
</span><span class="cx"> 
</span><span class="cx">          // If the user is logged in and viewing their random groups, we can show hidden and private groups
</span><span class="cx">          if ( bp_is_my_profile() ) {
</span><del>-                       return $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT group_id FROM {$bp->groups->table_name_members} WHERE user_id = %d AND is_confirmed = 1 AND is_banned = 0 ORDER BY rand() LIMIT $total_groups", $user_id ) );
</del><ins>+                        return $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT group_id FROM {$bp->groups->table_name_members} WHERE user_id = %d AND is_confirmed = 1 AND is_banned = 0 ORDER BY rand() LIMIT %d", $user_id, $total_groups ) );
</ins><span class="cx">           } else {
</span><del>-                       return $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT m.group_id FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id AND g.status != 'hidden' AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0 ORDER BY rand() LIMIT $total_groups", $user_id ) );
</del><ins>+                        return $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT m.group_id FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id AND g.status != 'hidden' AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0 ORDER BY rand() LIMIT %d", $user_id, $total_groups ) );
</ins><span class="cx">           }
</span><span class="cx">  }
</span><span class="cx"> 
</span><span class="lines">@@ -1227,7 +1240,8 @@
</span><span class="cx"> 
</span><span class="cx">          $exclude_sql = '';
</span><span class="cx">          if ( !empty( $exclude ) ) {
</span><del>-                       $exclude = implode( ',', wp_parse_id_list( $exclude ) );
</del><ins>+                        $exclude     = wp_parse_id_list( $exclude );
+                       $exclude     = $wpdb->escape( implode( ',', $exclude ) );
</ins><span class="cx">                   $exclude_sql = " AND m.user_id NOT IN ({$exclude})";
</span><span class="cx">          }
</span><span class="cx"> 
</span></span></pre></div>
<a id="branches17bptemplatesbplegacybuddypressfunctionsphp"></a>
<div class="modfile"><h4>Modified: branches/1.7/bp-templates/bp-legacy/buddypress-functions.php (7013 => 7014)</h4>
<pre class="diff"><span>
<span class="info">--- branches/1.7/bp-templates/bp-legacy/buddypress-functions.php     2013-05-07 21:57:17 UTC (rev 7013)
+++ branches/1.7/bp-templates/bp-legacy/buddypress-functions.php        2013-05-07 23:42:23 UTC (rev 7014)
</span><span class="lines">@@ -414,7 +414,7 @@
</span><span class="cx"> 
</span><span class="cx">  // If page and search_terms have been passed via the AJAX post request, use those.
</span><span class="cx">  if ( ! empty( $_POST['page'] ) && '-1' != $_POST['page'] )
</span><del>-               $qs[] = 'page=' . $_POST['page'];
</del><ins>+                $qs[] = 'page=' . absint( $_POST['page'] );
</ins><span class="cx"> 
</span><span class="cx">  $object_search_text = bp_get_search_default_text( $object );
</span><span class="cx">          if ( ! empty( $_POST['search_terms'] ) && $object_search_text != $_POST['search_terms'] && 'false' != $_POST['search_terms'] && 'undefined' != $_POST['search_terms'] )
</span></span></pre></div>
<a id="branches17bpthemesbpdefault_incajaxphp"></a>
<div class="modfile"><h4>Modified: branches/1.7/bp-themes/bp-default/_inc/ajax.php (7013 => 7014)</h4>
<pre class="diff"><span>
<span class="info">--- branches/1.7/bp-themes/bp-default/_inc/ajax.php  2013-05-07 21:57:17 UTC (rev 7013)
+++ branches/1.7/bp-themes/bp-default/_inc/ajax.php     2013-05-07 23:42:23 UTC (rev 7014)
</span><span class="lines">@@ -124,7 +124,7 @@
</span><span class="cx"> 
</span><span class="cx">  // If page and search_terms have been passed via the AJAX post request, use those.
</span><span class="cx">  if ( ! empty( $_POST['page'] ) && '-1' != $_POST['page'] )
</span><del>-               $qs[] = 'page=' . $_POST['page'];
</del><ins>+                $qs[] = 'page=' . absint( $_POST['page'] );
</ins><span class="cx"> 
</span><span class="cx">  $object_search_text = bp_get_search_default_text( $object );
</span><span class="cx">          if ( ! empty( $_POST['search_terms'] ) && $object_search_text != $_POST['search_terms'] && 'false' != $_POST['search_terms'] && 'undefined' != $_POST['search_terms'] )
</span></span></pre>
</div>
</div>

</body>
</html>