ebullient·works

[ About · Archive ]

TXP Hack: centralizing priv lookups

I use HTTP Auth for one of my Textpattern installations, and so, I wanted people that could get to the textpattern pages to have, by default, staff writer permissions.

Checking Privledges

In Textpattern 1.0 (rc1-3), check_privs returns a message if the requested privs are not present. There is no way to non-destructively check privledges.

I made the following changes to lib/txp_misc.php:

function check_privs()
{
  global $txp_user;
  $args = func_get_args();

  // Change check for privs to call new method, has_privs
  $result = call_user_func_array('has_privs', $args);

  if( !$result )
  {
    exit(pageTop('Restricted').
         '<p style="margin-top:3em;text-align:center">'.
         gTxt('restricted_area').'</p>');
  }
}

// New method - non-desructively checks for given privs
// Also sets privs retrieved from DB in a global to reduce DB load
function has_privs()
{
  global $myprivs, $txp_user;

  if ( !isset($myprivs) || empty($myprivs) )
  {
    $myprivs = safe_field('privs', 'txp_users', "name = '$txp_user'");

    // if we didn't find privs in the DB, assign default of 4 (Staff Writer)
    if ( empty($myprivs) && isset($_SERVER['REMOTE_USER']) 
      $myprivs = 4;
  }

  // Get requested privs, and test requested privs 
  // against assigned privs..

  $args = func_get_args();

  if ( in_array($myprivs,$args) )
    return true;

  return false;
}

Centralizing priv lookups.

The next part is to change lookups for privs (which look something like this:

$myprivs = safe_field('privs', 'txp_users', "name = '$txp_user'");

To call the new has_privs method instead.