-
Côme Chilliet authored
issue #5799
fed43ce1
<?php
/*
This code is part of FusionDirectory (http://www.fusiondirectory.org/)
Copyright (C) 2003 Cajus Pollmeier
Copyright (C) 2011-2016 FusionDirectory
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*/
class ObjectsAttribute extends GenericDialogAttribute
{
protected $dialogClass = 'ObjectSelectDialog';
protected $types = array();
function getFilterBlackList ()
{
return array(
'dn' => array_merge($this->getValue(), $this->plugin->used_workstations, array($this->plugin->dn))
);
}
protected function fillDisplayValueFrom ($i, $attrs)
{
if ($attrs) {
foreach (ogroup::$objectTypes as $code => $objectType) {
try {
if (objects::isOfType($attrs, $objectType)) {
$infos = objects::infos($objectType);
$this->types[$i] = $code;
$this->displays[$i] = $attrs[$infos['nameAttr']][0];
if (strtolower($objectType) == 'user') {
if (isset($attrs['description'][0])) {
$this->displays[$i] .= ' ['.$attrs['uid'][0].' - '.$attrs['description'][0].']';
} else {
$this->displays[$i] .= ' ['.$attrs['uid'][0].']';
}
} elseif (isset($attrs['description'][0])) {
$this->displays[$i] .= ' ['.$attrs['description'][0].']';
}
break;
}
} catch (NonExistingObjectTypeException $e) {
@DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, $e->getMessage(), "Objecttype");
unset(ogroup::$objectTypes[$code]);
}
}
if (!isset($this->displays[$i])) {
trigger_error('Unkown type for "'.$this->value[$i].'"');
$this->displays[$i] = sprintf(_('Unknown type : %s'), $this->value[$i]);
$this->types[$i] = 'I';
}
} else {
if (($attrs === NULL) && $this->isTemplate()) {
$this->displays[$i] = $this->value[$i];
$this->types[$i] = 'I';
} else {
$this->displays[$i] = sprintf(_('Non existing dn: %s'), $this->value[$i]);
$this->types[$i] = 'I';
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
}
}
}
function renderOnlyFormInput()
{
if (($this->size < 15) && ($this->size < count($this->value))) {
$this->size = min(15, count($this->value));
}
$id = $this->getHtmlId();
$display = '<select multiple="multiple" name="row'.$id.'[]" id="row'.$id.'" size="'.$this->size.'"'.
($this->disabled ? ' disabled="disabled"' : '').
' >'."\n";
foreach ($this->getDisplayValues() as $key => $value) {
try {
$infos = array();
if ($this->types[$key] !== 'I') {
$infos = objects::infos(ogroup::$objectTypes[$this->types[$key]]);
}
} catch (NonExistingObjectTypeException $e) {
die('No type for '.$key.' '.$value);
}
if (isset($infos['icon'])) {
$img = $infos['icon'];
} else {
$img = 'images/empty.png';
}
$display .= '<option value="'.$key.'" class="select"'.
' style="background-image:url(\''.get_template_path($img).'\');"'.
'>'.$value."</option>\n";
}
$display .= '</select><br/>'."\n";
return $display;
}
function ldapAttributesToGet()
{
return array(
'objectClass',
'cn',
'sn',
'ou',
'uid',
'givenName',
'description',
);
}
function listObjectTypes()
{
/* Refresh types and displays */
$this->getDisplayValues();
return '['.join(array_unique($this->types)).']';
}
function getTypedValues ()
{
$values = $this->getValue();
$ret = array();
foreach ($values as $i => $v) {
if (!isset($ret[$this->types[$i]])) {
$ret[$this->types[$i]] = array();
}
$ret[$this->types[$i]][] = $v;
}
return $ret;
}
protected function removeValue ($row)
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
{
parent::removeValue($row);
unset($this->types[$row]);
}
}
class ObjectSelectDialog extends GenericSelectDialog
{
protected $dialogClass = 'objectSelect';
}
class ogroup extends simplePlugin
{
var $objectclasses = array('groupOfNames', 'gosaGroupOfNames');
var $used_workstations = array();
protected $savedTypedMembers;
static $objectTypes = array(
'U' => 'user',
'G' => 'ogroup',
'A' => 'application',
'S' => 'server',
'W' => 'workstation',
'T' => 'terminal',
'F' => 'phone',
'P' => 'printer',
'D' => 'simpleSecurityObject',
);
static function plInfo()
{
return array(
'plShortName' => _('Object group'),
'plDescription' => _('Object group information'),
'plSelfModify' => FALSE,
'plPriority' => 1,
'plObjectType' => array('ogroup' => array(
'name' => _('Group'),
'description' => _('Group'),
'ou' => get_ou('ogroupRDN'),
'filter' => 'objectClass=groupOfNames',
'icon' => 'geticon.php?context=types&icon=resource-group&size=16',
'tabClass' => 'ogrouptabs',
)),
'plForeignKeys' => array(
'member' => array(
array('user'),
array('ogroup'),
array('application'),
array('serverGeneric'),
array('workstationGeneric'),
array('terminalGeneric'),
array('phoneGeneric'),
array('printGeneric'),
),
'owner' => array(
array('user'),
)
),
'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo())
);
}
static function getAttributesInfo ()
{
return array(
'main' => array(
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
'name' => _('Properties'),
'attrs' => array(
new BaseSelectorAttribute(get_ou('ogroupRDN')),
new StringAttribute(
_('Name'), _('Name of this group'),
'cn', TRUE,
'', '', (strict_uid_mode() ? '/^[a-z0-9_-]+$/' : '/^[a-z0-9_.-]+$/i')
),
new TextAreaAttribute(
_('Description'), _('Short description of this group'),
'description', FALSE
),
new HiddenAttribute('gosaGroupObjects'),
new UserAttribute(
_('Owner'), _('Owner'),
'owner', FALSE
),
)
),
'members' => array(
'name' => _('Member objects'),
'attrs' => array(
new ObjectsAttribute(
'', _('Objects member of this group'),
'member', TRUE,
array(), 'dn'
)
)
),
'system_trust' => array(
'name' => _('System trust'),
'icon' => 'geticon.php?context=status&icon=locked&size=16',
'attrs' => array(
new SelectAttribute(
_('Trust mode'), _('Type of authorization for those hosts'),
'trustMode', FALSE,
array('', 'fullaccess', 'byhost'),
'',
array(_('disabled'), _('full access'), _('allow access to these hosts'))
),
new SystemsAttribute(
'', _('Only allow this group to connect to this list of hosts'),
'host', FALSE
)
)
)
);
}
function __construct ($dn = NULL, $object = NULL, $parent = NULL, $mainTab = FALSE)
{
parent::__construct($dn, $object, $parent, $mainTab);
$this->attributesAccess['trustMode']->setInLdap(FALSE);
$this->attributesAccess['trustMode']->setManagedAttributes(
array(
'multiplevalues' => array('notbyhost' => array('','fullaccess')),
'erase' => array(
'notbyhost' => array('host')
)
)
);
if ((count($this->host) == 1) && ($this->host[0] == '*')) {
$this->trustMode = 'fullaccess';
} elseif (count($this->host) > 0) {
$this->trustMode = 'byhost';
}
/* Detect all workstations, which are already assigned to an object group
- Those objects will be hidden in the add object dialog.
281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
- Check() will complain if such a system is assigned to this object group.*/
$this->used_workstations = array();
try {
$ws_dns = array_keys(objects::ls(array('workstation','terminal')));
$res = objects::ls('ogroup', array('member' => '*'), NULL, '(&(member=*)(|(gosaGroupObjects=[W])(gosaGroupObjects=[T])))');
} catch (NonExistingObjectTypeException $e) {
/* If workstation/terminal objectType is not existing, systems plugin is missing so there are no systems */
$ws_dns = array();
$res = array();
}
foreach ($res as $odn => $og) {
if ($odn == $this->dn) {
continue;
}
$this->used_workstations = array_merge($this->used_workstations, array_intersect($ws_dns, $og['member']));
}
$this->reload();
$this->savedTypedMembers = $this->attributesAccess['member']->getTypedValues();
}
/*! \brief This function returns an LDAP filter for this plugin object classes
*/
function getObjectClassFilter ()
{
return '(objectClass=groupOfNames)';
}
function is_this_account($attrs)
{
$this->objectclasses = array('groupOfNames');
$found = parent::is_this_account($attrs);
$this->objectclasses = array('groupOfNames', 'gosaGroupOfNames');
return $found;
}
function prepare_save()
{
$this->reload();
$errors = parent::prepare_save();
if ($this->trustMode == 'fullaccess') {
$this->attrs['host'] = array('*');
}
/* Trust accounts */
if (($this->trustMode != "") && !in_array('hostObject', $this->attrs['objectClass'])) {
$this->attrs['objectClass'][] = 'hostObject';
} elseif (($this->trustMode == "") && (($key = array_search('hostObject', $this->attrs['objectClass'])) !== FALSE)) {
unset($this->attrs['objectClass'][$key]);
}
return $errors;
}
function reload()
{
$this->gosaGroupObjects = $this->attributesAccess['member']->listObjectTypes();
}
function check()
{
$message = parent::check();
$this->reload();
if (preg_match('/W/', $this->gosaGroupObjects) && preg_match('/T/', $this->gosaGroupObjects)) {
$message[] = _('Putting both workstations and terminals in the same group is not allowed');
}
return $message;
}
351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
function ldap_save()
{
global $ui;
$errors = array();
if (isset($this->attrs['member'])) {
$userMembers = array();
$savedMembers = array();
$members = $this->attributesAccess['member']->getTypedValues();
if (isset($members['U'])) {
$userMembers = $members['U'];
}
if (isset($this->savedTypedMembers['U'])) {
$savedMembers = $this->savedTypedMembers['U'];
}
$addingMembers = array_diff($userMembers, $savedMembers);
$removingMembers = array_diff($savedMembers, $userMembers);
foreach ($addingMembers as $dn) {
if (strpos($ui->get_permissions($dn, 'user/user', 'groupsMembership', $this->acl_skip_write()), 'w') === FALSE) {
$errors[] = msgPool::permModify($dn, 'groupsMembership');
}
}
foreach ($removingMembers as $dn) {
if (strpos($ui->get_permissions($dn, 'user/user', 'groupsMembership', $this->acl_skip_write()), 'w') === FALSE) {
$errors[] = msgPool::permModify($dn, 'groupsMembership');
}
}
}
if (!empty($errors)) {
return $errors;
}
return parent::ldap_save();
}
function getGroupObjectTypes()
{
$this->reload();
return $this->gosaGroupObjects;
}
}
?>