array( 'group_id' => 'g.id', 'group' => 'g.name COLLATE utf8_general_ci', 'group_name' => 'g.name', 'parent' => 'g.parent COLLATE utf8_general_ci', 'parent_name' => 'g.parent', 'created_at' => 'UNIX_TIMESTAMP(g.ctime)', 'last_modified' => 'UNIX_TIMESTAMP(g.mtime)' ), 'group_membership' => array( 'group_id' => 'gm.group_id', 'user' => 'gm.username COLLATE utf8_general_ci', 'user_name' => 'gm.username', 'created_at' => 'UNIX_TIMESTAMP(gm.ctime)', 'last_modified' => 'UNIX_TIMESTAMP(gm.mtime)' ) ); /** * The table aliases being applied * * @var array */ protected $tableAliases = array( 'group' => 'g', 'group_membership' => 'gm' ); /** * The statement columns being provided * * @var array */ protected $statementColumns = array( 'group' => array( 'group_id' => 'id', 'group_name' => 'name', 'parent_name' => 'parent', 'created_at' => 'ctime', 'last_modified' => 'mtime' ), 'group_membership' => array( 'group_id' => 'group_id', 'user_name' => 'username', 'created_at' => 'ctime', 'last_modified' => 'mtime' ) ); /** * The columns which are not permitted to be queried * * @var array */ protected $filterColumns = array('group', 'parent', 'user'); /** * Initialize this database user group backend */ protected function init() { if (! $this->ds->getTablePrefix()) { $this->ds->setTablePrefix('icingaweb_'); } } /** * Insert a table row with the given data * * @param string $table * @param array $bind */ public function insert($table, array $bind) { $bind['created_at'] = date('Y-m-d H:i:s'); parent::insert($table, $bind); } /** * Update table rows with the given data, optionally limited by using a filter * * @param string $table * @param array $bind * @param Filter $filter */ public function update($table, array $bind, Filter $filter = null) { $bind['last_modified'] = date('Y-m-d H:i:s'); parent::update($table, $bind, $filter); } /** * Return the groups the given user is a member of * * @param User $user * * @return array */ public function getMemberships(User $user) { $groups = array(); foreach ($this->ds->select()->from($this->prependTablePrefix('group'), array('name', 'parent')) as $group) { // Using the raw query here due to the non-existent necessity to join, convert, or... $groups[$group->name] = $group->parent; } $membershipQuery = $this ->select() ->from('group_membership', array('group_name')) ->where('user_name', $user->getUsername()); $memberships = array(); foreach ($membershipQuery as $membership) { $memberships[] = $membership->group_name; $parent = $groups[$membership->group_name]; while ($parent !== null) { $memberships[] = $parent; // Usually a parent is an existing group, but since we do not have a constraint on our table.. $parent = isset($groups[$parent]) ? $groups[$parent] : null; } } return $memberships; } /** * Join group into group_membership * * @param RepositoryQuery $query */ protected function joinGroup(RepositoryQuery $query) { $query->getQuery()->join( $this->requireTable('group'), 'gm.group_id = g.id', array() ); } /** * Join group_membership into group * * @param RepositoryQuery $query */ protected function joinGroupMembership(RepositoryQuery $query) { $query->getQuery()->join( $this->requireTable('group_membership'), 'g.id = gm.group_id', array() ); } }