<!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][6185] trunk/bp-core/bp-core-caps.php: Improves current_user_can( 'bp_moderate' ) implementation for 1.6 release</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, #logmsg > ol { margin-left: 0; 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/6185">6185</a></dd>
<dt>Author</dt> <dd>boonebgorges</dd>
<dt>Date</dt> <dd>2012-07-18 18:16:32 +0000 (Wed, 18 Jul 2012)</dd>
</dl>

<h3>Log Message</h3>
<pre>Improves current_user_can( 'bp_moderate' ) implementation for 1.6 release

The newly introduced bp_moderate cap must be manually added to the
Administrator role on order for it to work properly under the current
implementation of BP caps, wherein they are not stored in the database like
other caps.

This is a workaround, which will be reverted for BP 1.7.

Allows other caps passing through bp_current_user_can() to be evaluated
properly, without being overridden for super admins.

Fixes <a href="http://buddypress.trac.wordpress.org/ticket/4296">#4296</a></pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkbpcorebpcorecapsphp">trunk/bp-core/bp-core-caps.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkbpcorebpcorecapsphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-core/bp-core-caps.php (6184 => 6185)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-core/bp-core-caps.php        2012-07-18 18:09:01 UTC (rev 6184)
+++ trunk/bp-core/bp-core-caps.php        2012-07-18 18:16:32 UTC (rev 6185)
</span><span class="lines">@@ -379,10 +379,6 @@
</span><span class="cx">  */
</span><span class="cx"> function bp_current_user_can( $capability, $blog_id = 0 ) {
</span><span class="cx"> 
</span><del>-        // @todo: remove this when implemented
-        if ( is_super_admin() )
-                return true;
-
</del><span class="cx">         // Use root blog if no ID passed
</span><span class="cx">         if ( empty( $blog_id ) )
</span><span class="cx">                 $blog_id = bp_get_root_blog_id();
</span><span class="lines">@@ -392,4 +388,39 @@
</span><span class="cx">         return (bool) apply_filters( 'bp_current_user_can', $retval, $capability, $blog_id );
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+/**
+ * Temporary implementation of 'bp_moderate' cap
+ *
+ * In BuddyPress 1.6, the 'bp_moderate' cap was introduced. In order to enforce that
+ * bp_current_user_can( 'bp_moderate' ) always returns true for Administrators, we must manually
+ * add the 'bp_moderate' cap to the list of user caps for Admins.
+ *
+ * Note that this level of enforcement is only necessary in the case of non-Multisite. This is
+ * because WordPress automatically assigns every capability - and thus 'bp_moderate' - to Super
+ * Admins on a Multisite installation. See WP_User::has_cap().
+ *
+ * This implementation of 'bp_moderate' is temporary, until BuddyPress properly matches caps to
+ * roles and stores them in the database. Plugin authors: Do not use this function.
+ *
+ * @since BuddyPress (1.6)
+ * @see WP_User::has_cap()
+ *
+ * @param array $allcaps The caps that WP associates with the given role
+ * @param array $caps The caps being tested for in WP_User::has_cap()
+ * @param array $args Miscellaneous arguments passed to the user_has_cap filter
+ * @return array $allcaps The user's cap list, with 'bp_moderate' appended, if relevant
+ */
+function _bp_enforce_bp_moderate_cap_for_admins( $allcaps, $caps, $args ) {
+        if ( in_array( 'bp_moderate', $caps ) &amp;&amp;   // We only care if checking for bp_moderate
+             !in_array( 'do_not_allow', $caps ) &amp;&amp; // 'do_not_allow' overrides everything else
+             !is_multisite() &amp;&amp;                    // Check not necessary on Multisite
+             isset( $allcaps['delete_users'] ) )   // Mimicking WP's check for Administrator status
+        {
+                $allcaps['bp_moderate'] = true;
+        }
+
+        return $allcaps;
+}
+add_filter( 'user_has_cap', '_bp_enforce_bp_moderate_cap_for_admins', 10, 3 );
+
</ins><span class="cx"> ?&gt;
</span></span></pre>
</div>
</div>

</body>
</html>