Source for file MDB2.php
Documentation is available at MDB2.php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
* A framework for authentication and authorization in PHP applications
* LiveUser is an authentication/permission framework designed
* to be flexible and easily extendable.
* Since it is impossible to have a
* "one size fits all" it takes a container
* approach which should enable it to
* be versatile enough to meet most needs.
* LICENSE: This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* @category authentication
* @author Markus Wolff <wolff@21st.de>
* @author Helgi Þormar Þorbjörnsson <dufuz@php.net>
* @author Lukas Smith <smith@pooteeweet.org>
* @author Arnaud Limbourg <arnaud@php.net>
* @author Pierre-Alain Joye <pajoye@php.net>
* @author Bjoern Kraus <krausbn@php.net>
* @copyright 2002-2006 Markus Wolff
* @license http://www.gnu.org/licenses/lgpl.txt
* @version CVS: $Id: MDB2.php,v 1.33 2006/04/07 22:20:57 lsmith Exp $
* @link http://pear.php.net/LiveUser
* Require parent class definition.
require_once 'LiveUser/Perm/Storage/SQL.php';
* MDB2 container for permission handling
* This is a PEAR::MDB2 backend driver for the LiveUser class.
* A PEAR::MDB2 connection object can be passed to the constructor to reuse an
* existing connection. Alternatively, a DSN can be passed to open a new one.
* - File "Liveuser.php" (contains the parent class "LiveUser")
* - Array of connection options or a PEAR::MDB2 connection object must be
* passed to the constructor.
* Example: array('dsn' => 'mysql://user:pass@host/db_name')
* &$conn (PEAR::MDB2 connection object)
* @category authentication
* @author Lukas Smith <smith@pooteeweet.org>
* @author Bjoern Kraus <krausbn@php.net>
* @copyright 2002-2006 Markus Wolff
* @license http://www.gnu.org/licenses/lgpl.txt
* @version Release: @package_version@
* @link http://pear.php.net/LiveUser
* Database connection functions
var $function = 'connect';
* determines of the use of sequences should be forced
* Initialize the storage container
* @param array Array with the storage configuration
* @return bool true on success, false on failure.
function init(&$storageConf)
parent ::init ($storageConf);
if (!MDB2 ::isConnection ($this->dbc) && !is_null($this->dsn)) {
$this->options['portability'] = MDB2_PORTABILITY_ALL;
if ($this->function == 'singleton') {
$dbc = & MDB2 ::singleton ($this->dsn, $this->options);
$dbc = & MDB2 ::connect ($this->dsn, $this->options);
if (PEAR ::isError ($dbc)) {
array ('container' => 'could not connect: '. $dbc->getMessage (),
'debug' => $dbc->getUserInfo ()));
if (!MDB2 ::isConnection ($this->dbc)) {
array ('container' => 'storage layer configuration missing'));
* map an auth user to a perm user
* @param int $auth_user_id
* @param string $containerName
* @return array requested data or false on failure
function mapUser($auth_user_id, $containerName)
' . $this->alias['perm_user_id'] . ' AS perm_user_id,
' . $this->alias['perm_type'] . ' AS perm_type
' . $this->alias['auth_user_id'] . ' = '.
$this->dbc->quote ($auth_user_id, $this->fields['auth_user_id']). '
' . $this->alias['auth_container_name'] . ' = '.
$this->dbc->quote ($containerName, $this->fields['auth_container_name']);
$this->fields['perm_user_id'],
$result = $this->dbc->queryRow ($query, $types, MDB2_FETCHMODE_ASSOC );
if (PEAR ::isError ($result)) {
'error in query' . $result->getMessage () . '-' . $result->getUserInfo ());
* Reads all rights of current user into a
* two-dimensional associative array, having the
* area names as the key of the 1st dimension.
* Group rights and invididual rights are being merged
* @param int perm user id
* @return array requested data or false on failure
' . $this->alias['right_id'] . ',
' . $this->alias['right_level'] . '
' . $this->alias['perm_user_id'] . ' = '.
$this->dbc->quote ($perm_user_id, $this->fields['perm_user_id']);
$result = $this->dbc->queryAll ($query, $types, MDB2_FETCHMODE_ORDERED , true );
if (PEAR ::isError ($result)) {
'error in query' . $result->getMessage () . '-' . $result->getUserInfo ());
* read the areas in which a user is an area admin
* @param int perm user id
* @return array requested data or false on failure
// get all areas in which the user is area admin
R.' . $this->alias['right_id'] . ' AS right_id,
'. $this->prefix. $this->alias['area_admin_areas']. ' AAA,
AAA.' . $this->alias['perm_user_id'] . ' = '.
$this->dbc->quote ($perm_user_id, $this->fields['perm_user_id']);
$result = $this->dbc->queryAll ($query, $types, MDB2_FETCHMODE_ORDERED , true );
if (PEAR ::isError ($result)) {
'error in query' . $result->getMessage () . '-' . $result->getUserInfo ());
* Reads all the group ids in that the user is also a member of
* (all groups that are subgroups of these are also added recursively)
* @param int perm user id
* @return array requested data or false on failure
GU.' . $this->alias['group_id'] . '
GU.' . $this->alias['group_id'] . ' = G. ' . $this->alias['group_id'] . '
GU.' . $this->alias['perm_user_id'] . ' = '.
$this->dbc->quote ($perm_user_id, $this->fields['perm_user_id']);
G.' . $this->alias['is_active'] . '=' .
$this->dbc->quote (true , $this->fields['is_active']);
$result = $this->dbc->queryCol ($query, $this->fields['group_id']);
if (PEAR ::isError ($result)) {
'error in query' . $result->getMessage () . '-' . $result->getUserInfo ());
* and put them in the array
* @return array requested data or false on failure
GR.' . $this->alias['right_id'] . ',
MAX(GR.' . $this->alias['right_level'] . ')
GR.' . $this->alias['group_id'] . ' IN('.
$this->dbc->datatype ->implodeArray ($group_ids, $this->fields['group_id']). ')
GR.' . $this->alias['right_id'] . '';
$result = $this->dbc->queryAll ($query, $types, MDB2_FETCHMODE_ORDERED , true );
if (PEAR ::isError ($result)) {
'error in query' . $result->getMessage () . '-' . $result->getUserInfo ());
* Read the sub groups of the new groups that are not part of the group ids
* @param array new group ids
* @return array requested data or false on failure
DISTINCT SG.' . $this->alias['subgroup_id'] . '
SG.' . $this->alias['subgroup_id'] . ' = G.' .
$this->alias['group_id'] . '
SG.' . $this->alias['group_id'] . ' IN ('.
$this->dbc->datatype ->implodeArray ($newGroupIds, $this->fields['group_id']). ')
SG.' . $this->alias['subgroup_id'] . ' NOT IN ('.
$this->dbc->datatype ->implodeArray ($group_ids, $this->fields['subgroup_id']). ')';
G.' . $this->alias['is_active'] . '=' .
$this->dbc->quote (true , $this->fields['is_active']);
$result = $this->dbc->queryCol ($query, $this->fields['group_id']);
if (PEAR ::isError ($result)) {
'error in query' . $result->getMessage () . '-' . $result->getUserInfo ());
* Read out the rights from the userrights or grouprights table
* that imply other rights along with their level
* @param string name of the table
* @return array requested data or false on failure
TR.' . $this->alias['right_level'] . ',
TR.' . $this->alias['right_id'] . '
TR.' . $this->alias['right_id'] . ' = R.' . $this->alias['right_id'] . '
R.' . $this->alias['right_id'] . ' IN ('.
$this->dbc->datatype ->implodeArray (array_keys($rightIds), $this->fields['right_id']). ')
R.' . $this->alias['has_implied'] . '='.
$this->dbc->quote (true , $this->fields['has_implied']);
$result = $this->dbc->queryAll ($query, $types, MDB2_FETCHMODE_ORDERED , true , false , true );
if (PEAR ::isError ($result)) {
'error in query' . $result->getMessage () . '-' . $result->getUserInfo ());
* Read out the implied rights with a given level from the implied_rights table
* @param array current right ids
* @param string current level
* @return array requested data or false on failure
RI.' . $this->alias['implied_right_id'] . ' AS right_id,
'. $currentLevel. ' AS right_level,
R.' . $this->alias['has_implied'] . ' AS has_implied
RI.' . $this->alias['implied_right_id'] . ' = R.' . $this->alias['right_id'] . '
RI.' . $this->alias['right_id'] . ' IN ('.
$this->dbc->datatype ->implodeArray ($currentRights, $this->fields['right_id']). ')';
$result = $this->dbc->queryAll ($query, $types, MDB2_FETCHMODE_ASSOC );
if (PEAR ::isError ($result)) {
'error in query' . $result->getMessage () . '-' . $result->getUserInfo ());
Documentation generated on Mon, 28 Jan 2008 03:30:25 -0500 by phpDocumentor 1.4.0. PEAR Logo Copyright © PHP Group 2004.
|