diff --git a/lam/lib/modules/windowsGroup.inc b/lam/lib/modules/windowsGroup.inc
index ae9281ba..8074a6c9 100644
--- a/lam/lib/modules/windowsGroup.inc
+++ b/lam/lib/modules/windowsGroup.inc
@@ -108,7 +108,7 @@ class windowsGroup extends baseModule {
),
'description' => array(
"Headline" => _('Description'), 'attr' => 'description',
- "Text" => _('Group description. If left empty group name will be used.')
+ "Text" => _('Please enter a descriptive text for this group.')
),
'info' => array(
"Headline" => _('Notes'), 'attr' => 'info',
@@ -166,12 +166,6 @@ class windowsGroup extends baseModule {
'help' => 'info',
'example' => _('Domain administrators'),
),
- array(
- 'name' => 'windowsGroup_mail',
- 'description' => _('Email address'),
- 'help' => 'mail',
- 'example' => _('group@company.com'),
- ),
array(
'name' => 'windowsGroup_scope',
'description' => _('Group scope'),
@@ -195,6 +189,14 @@ class windowsGroup extends baseModule {
'example' => 'uid=user1,o=test;uid=user2,o=test',
),
);
+ if (!$this->isBooleanConfigOptionSet('windowsGroup_hidemail')) {
+ $return['upload_columns'][] = array(
+ 'name' => 'windowsGroup_mail',
+ 'description' => _('Email address'),
+ 'help' => 'mail',
+ 'example' => _('group@company.com'),
+ );
+ }
// available PDF fields
$return['PDF_fields'] = array(
'cn' => _('Group name'),
diff --git a/lam/lib/modules/windowsHost.inc b/lam/lib/modules/windowsHost.inc
new file mode 100644
index 00000000..b9b53a73
--- /dev/null
+++ b/lam/lib/modules/windowsHost.inc
@@ -0,0 +1,381 @@
+ "high");
+ // LDAP filter
+ $return["ldap_filter"] = array('or' => "(objectClass=computer)");
+ // alias name
+ $return["alias"] = _("Windows");
+ // module dependencies
+ $return['dependencies'] = array('depends' => array(), 'conflicts' => array());
+ // managed object classes
+ $return['objectClasses'] = array('computer');
+ // managed attributes
+ $return['attributes'] = array('cn', 'description', 'location', 'sAMAccountName', 'managedBy', 'operatingSystem', 'operatingSystemVersion', 'dNSHostName');
+ // help Entries
+ $return['help'] = array(
+ 'cn' => array(
+ "Headline" => _('Host name'), 'attr' => 'cn, sAMAccountName',
+ "Text" => _('Please enter the host\'s name.')
+ ),
+ 'description' => array(
+ "Headline" => _('Description'), 'attr' => 'description',
+ "Text" => _('Please enter a descriptive text for this host.')
+ ),
+ 'location' => array(
+ "Headline" => _('Location'), 'attr' => 'location',
+ "Text" => _('This is the host\'s location (e.g. Munich, server room 3).')
+ ),
+ 'managedBy' => array(
+ "Headline" => _('Managed by'), 'attr' => 'managedBy',
+ "Text" => _('The host is managed by this contact person.')
+ ),
+ );
+ // upload fields
+ $return['upload_columns'] = array(
+ array(
+ 'name' => 'windowsHost_name',
+ 'description' => _('Host name'),
+ 'help' => 'cn',
+ 'example' => _('PC01'),
+ 'required' => true
+ ),
+ array(
+ 'name' => 'windowsHost_description',
+ 'description' => _('Description'),
+ 'help' => 'description',
+ ),
+ array(
+ 'name' => 'windowsHost_location',
+ 'description' => _('Location'),
+ 'help' => 'location',
+ 'example' => _('MyCity'),
+ ),
+ array(
+ 'name' => 'windowsHost_managedBy',
+ 'description' => _('Managed by'),
+ 'help' => 'managedBy',
+ 'example' => 'cn=user1,o=test',
+ ),
+ );
+ // available PDF fields
+ $return['PDF_fields'] = array(
+ 'cn' => _('Host name'),
+ 'description' => _('Description'),
+ 'location' => _('Location'),
+ 'managedBy' => _('Managed by'),
+ );
+ return $return;
+ }
+
+ /**
+ * This function fills the $messages variable with output messages from this module.
+ */
+ public function load_Messages() {
+ $this->messages['cn'][0] = array('ERROR', _('Host name'), _('Host name contains invalid characters. Valid characters are: a-z, A-Z, 0-9 and .-_ !'));
+ $this->messages['cn'][1] = array('ERROR', _('Account %s:') . ' windowsHost_cn', _('Host name contains invalid characters. Valid characters are: a-z, A-Z, 0-9 and .-_ !'));
+ }
+
+ /**
+ * Returns the HTML meta data for the main account page.
+ *
+ * @return htmlElement HTML meta data
+ */
+ public function display_html_attributes() {
+ $container = new htmlTable();
+ $this->addSimpleInputTextField($container, 'cn', _('Host name'), true);
+ $this->addSimpleInputTextField($container, 'description', _('Description'), false);
+ $this->addSimpleInputTextField($container, 'location', _('Location'), false);
+ // managed by
+ $container->addElement(new htmlOutputText(_('Managed by')));
+ $managedBy = '-';
+ if (isset($this->attributes['managedBy'][0])) {
+ $managedBy = $this->attributes['managedBy'][0];
+ }
+ $container->addElement(new htmlOutputText(getAbstractDN($managedBy)));
+ $container->addElement(new htmlHelpLink('managedBy'), true);
+ $container->addElement(new htmlOutputText(''));
+ $managedByButtons = new htmlGroup();
+ $managedByButtons->addElement(new htmlAccountPageButton(get_class($this), 'managedBy', 'edit', _('Change')));
+ if (isset($this->attributes['managedBy'][0])) {
+ $managedByButtons->addElement(new htmlSpacer('5px', null));
+ $managedByButtons->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'removeManagedBy', _('Remove')));
+ }
+ $container->addElement($managedByButtons, true);
+ return $container;
+ }
+
+ /**
+ * Processes user input of the primary module page.
+ * It checks if all input values are correct and updates the associated LDAP attributes.
+ *
+ * @return array list of info/error messages
+ */
+ public function process_attributes() {
+ $return = array();
+ // cn
+ $this->attributes['cn'][0] = $_POST['cn'];
+ $this->attributes['sAMAccountName'][0] = $_POST['cn'] . '$';
+ if (!get_preg($_POST['cn'], 'hostname')) {
+ $return[] = $this->messages['cn'][0];
+ }
+ // description
+ $this->attributes['description'][0] = $_POST['description'];
+ // location
+ $this->attributes['location'][0] = $_POST['location'];
+ // managed by
+ if (isset($_POST['form_subpage_' . get_class($this) . '_attributes_removeManagedBy'])) {
+ unset($this->attributes['managedBy']);
+ }
+ return $return;
+ }
+
+ /**
+ * This function will create the meta HTML code to show a page to change the member attribute.
+ *
+ * @return htmlElement HTML meta data
+ */
+ function display_html_managedBy() {
+ $return = new htmlTable();
+ // show possible managers
+ $options = array();
+ $filter = get_ldap_filter('user');
+ $entries = searchLDAPByFilter($filter, array('dn'), array('user'));
+ for ($i = 0; $i < sizeof($entries); $i++) {
+ $entries[$i] = $entries[$i]['dn'];
+ }
+ // sort by DN
+ usort($entries, 'compareDN');
+ for ($i = 0; $i < sizeof($entries); $i++) {
+ $options[getAbstractDN($entries[$i])] = $entries[$i];
+ }
+ $selected = array();
+ if (isset($this->attributes['managedBy'][0])) {
+ $selected = array($this->attributes['managedBy'][0]);
+ if (!in_array($selected[0], $options)) {
+ $options[getAbstractDN($selected[0])] = $selected[0];
+ }
+ }
+ $membersSelect = new htmlSelect('managedBy', $options, $selected);
+ $membersSelect->setHasDescriptiveElements(true);
+ $membersSelect->setRightToLeftTextDirection(true);
+ $membersSelect->setSortElements(false);
+ $membersSelect->setTransformSingleSelect(false);
+ $return->addElement($membersSelect, true);
+ $buttonTable = new htmlTable();
+ $buttonTable->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'set', _('Change')));
+ $buttonTable->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'cancel', _('Cancel')));
+ $return->addElement($buttonTable);
+ return $return;
+ }
+
+ /**
+ * Processes user input of the members page.
+ * It checks if all input values are correct and updates the associated LDAP attributes.
+ *
+ * @return array list of info/error messages
+ */
+ function process_managedBy() {
+ $return = array();
+ if (isset($_POST['form_subpage_' . get_class($this) . '_attributes_set'])) {
+ $this->attributes['managedBy'][] = $_POST['managedBy'];
+ }
+ return $return;
+ }
+
+ /**
+ * In this function the LDAP account is built up.
+ *
+ * @param array $rawAccounts list of hash arrays (name => value) from user input
+ * @param array $ids list of IDs for column position (e.g. "posixAccount_uid" => 5)
+ * @param array $partialAccounts list of hash arrays (name => value) which are later added to LDAP
+ * @param array $selectedModules list of selected account modules
+ * @return array list of error messages if any
+ */
+ public function build_uploadAccounts($rawAccounts, $ids, &$partialAccounts, $selectedModules) {
+ $errors = array();
+ for ($i = 0; $i < sizeof($rawAccounts); $i++) {
+ // add object class
+ if (!in_array('group', $partialAccounts[$i]['objectClass'])) $partialAccounts[$i]['objectClass'][] = 'group';
+ // cn + sAMAccountName
+ if ($rawAccounts[$i][$ids['windowsHost_name']] != "") {
+ if (get_preg($rawAccounts[$i][$ids['windowsHost_name']], 'groupname')) {
+ $partialAccounts[$i]['cn'] = $rawAccounts[$i][$ids['windowsHost_name']];
+ $partialAccounts[$i]['sAMAccountName'] = $rawAccounts[$i][$ids['windowsHost_name']];
+ }
+ else {
+ $errMsg = $this->messages['cn'][1];
+ array_push($errMsg, array($i));
+ $errors[] = $errMsg;
+ }
+ }
+ // description
+ if ($rawAccounts[$i][$ids['windowsHost_description']] != "") {
+ $partialAccounts[$i]['description'] = $rawAccounts[$i][$ids['windowsHost_description']];
+ }
+ // notes
+ if ($rawAccounts[$i][$ids['windowsHost_notes']] != "") {
+ $partialAccounts[$i]['info'] = $rawAccounts[$i][$ids['windowsHost_notes']];
+ }
+ // email
+ if ($rawAccounts[$i][$ids['windowsHost_mail']] != "") {
+ if (get_preg($rawAccounts[$i][$ids['windowsHost_mail']], 'email')) {
+ $partialAccounts[$i]['mail'] = $rawAccounts[$i][$ids['windowsHost_mail']];
+ }
+ else {
+ $errMsg = $this->messages['mail'][1];
+ array_push($errMsg, array($i));
+ $errors[] = $errMsg;
+ }
+ }
+ // add members
+ if ($rawAccounts[$i][$ids['windowsHost_members']] != "") {
+ $partialAccounts[$i]['member'] = explode(";", $rawAccounts[$i][$ids['windowsHost_members']]);
+ }
+ // group scope
+ if ($rawAccounts[$i][$ids['windowsHost_scope']] != "") {
+ if (in_array($rawAccounts[$i][$ids['windowsHost_scope']], $this->groupScopes)) {
+ switch ($rawAccounts[$i][$ids['windowsHost_scope']]) {
+ case windowsHost::SCOPE_DOMAIN_LOCAL:
+ $partialAccounts[$i]['groupType'] = 4;
+ break;
+ case windowsHost::SCOPE_GLOBAL:
+ $partialAccounts[$i]['groupType'] = 2;
+ break;
+ case windowsHost::SCOPE_UNIVERSAL:
+ $partialAccounts[$i]['groupType'] = 8;
+ break;
+ }
+ }
+ else {
+ $errMsg = $this->messages['groupScope'][0];
+ array_push($errMsg, array($i));
+ $errors[] = $errMsg;
+ }
+ }
+ else {
+ $partialAccounts[$i]['groupType'] = 2;
+ }
+ // group type
+ if ($rawAccounts[$i][$ids['windowsHost_type']] != "") {
+ if (in_array($rawAccounts[$i][$ids['windowsHost_type']], $this->groupTypes)) {
+ if ($rawAccounts[$i][$ids['windowsHost_type']] == windowsHost::TYPE_SECURITY) {
+ $partialAccounts[$i]['groupType'] = $partialAccounts[$i]['groupType'] - 2147483648;
+ }
+ }
+ else {
+ $errMsg = $this->messages['groupType'][0];
+ array_push($errMsg, array($i));
+ $errors[] = $errMsg;
+ }
+ }
+ else {
+ $partialAccounts[$i]['groupType'] = $partialAccounts[$i]['groupType'] - 2147483648;
+ }
+ }
+ return $errors;
+ }
+
+ /**
+ * Returns a list of PDF entries
+ */
+ public function get_pdfEntries() {
+ $return = array();
+ $this->addSimplePDFField($return, 'cn', _('Group name'));
+ $this->addSimplePDFField($return, 'description', _('Description'));
+ $this->addSimplePDFField($return, 'info', _('Notes'));
+ $this->addSimplePDFField($return, 'mail', _('Email address'));
+ // group type
+ $groupType = windowsHost::TYPE_SECURITY;
+ $groupScope = windowsHost::SCOPE_GLOBAL;
+ if (isset($this->attributes['groupType'][0])) {
+ if ($this->attributes['groupType'][0] & 2) {
+ $groupScope = windowsHost::SCOPE_GLOBAL;
+ }
+ elseif ($this->attributes['groupType'][0] & 4) {
+ $groupScope = windowsHost::SCOPE_DOMAIN_LOCAL;
+ }
+ elseif ($this->attributes['groupType'][0] & 8) {
+ $groupScope = windowsHost::SCOPE_UNIVERSAL;
+ }
+ if ($this->attributes['groupType'][0] & 0x80000000) {
+ $groupType = windowsHost::TYPE_SECURITY;
+ }
+ else {
+ $groupType = windowsHost::TYPE_DISTRIBUTION;
+ }
+ }
+ $groupTypeLabels = array_flip($this->groupTypes);
+ $groupType = $groupTypeLabels[$groupType];
+ $groupScopeLabels = array_flip($this->groupScopes);
+ $groupScope = $groupScopeLabels[$groupScope];
+ $return[get_class($this) . '_groupScope'] = array('' . _('Group scope') . '' . $groupScope . '');
+ $return[get_class($this) . '_groupType'] = array('' . _('Group type') . '' . $groupType . '');
+ // members
+ if (sizeof($this->attributes['member']) > 0) {
+ $memberList = array();
+ if (isset($this->attributes['member']) && is_array($this->attributes['member'])) {
+ $memberList = $this->attributes['member'];
+ }
+ usort($memberList, 'compareDN');
+ $return[get_class($this) . '_member'][0] = '' . _('Members') . '' . $memberList[0] . ' |
';
+ for ($i = 1; $i < sizeof($memberList); $i++) {
+ $return[get_class($this) . '_member'][] = '' . $memberList[$i] . ' |
';
+ }
+ }
+ return $return;
+ }
+
+}
+
+
+?>
diff --git a/lam/lib/types/host.inc b/lam/lib/types/host.inc
index 69b45ebb..d01275dc 100644
--- a/lam/lib/types/host.inc
+++ b/lam/lib/types/host.inc
@@ -112,6 +112,9 @@ class host extends baseType {
elseif ($container->getAccountModule('device') != null) {
$attributes = $container->getAccountModule('device')->getAttributes();
}
+ elseif ($container->getAccountModule('windowsHost') != null) {
+ $attributes = $container->getAccountModule('windowsHost')->getAttributes();
+ }
// check if a user name is set
if (isset($attributes['uid'][0])) {
return htmlspecialchars($attributes['uid'][0]);
@@ -142,6 +145,9 @@ class host extends baseType {
elseif ($container->getAccountModule('device') != null) {
$attributes = $container->getAccountModule('device')->getAttributes();
}
+ elseif ($container->getAccountModule('windowsHost') != null) {
+ $attributes = $container->getAccountModule('windowsHost')->getAttributes();
+ }
$sambaAttributes = null;
if ($container->getAccountModule('sambaSamAccount') != null) {
$sambaAttributes = $container->getAccountModule('sambaSamAccount')->getAttributes();
diff --git a/lam/lib/types/user.inc b/lam/lib/types/user.inc
index 7992c3b4..41aa9471 100644
--- a/lam/lib/types/user.inc
+++ b/lam/lib/types/user.inc
@@ -117,6 +117,9 @@ class user extends baseType {
if ($container->getAccountModule('inetOrgPerson') != null) {
$personalAttributes = $container->getAccountModule('inetOrgPerson')->getAttributes();
}
+ elseif ($container->getAccountModule('windowsUser') != null) {
+ $personalAttributes = $container->getAccountModule('windowsUser')->getAttributes();
+ }
$accountAttributes = null;
if ($container->getAccountModule('account') != null) {
$accountAttributes = $container->getAccountModule('account')->getAttributes();
@@ -182,6 +185,9 @@ class user extends baseType {
if ($container->getAccountModule('inetOrgPerson') != null) {
$personalAttributes = $container->getAccountModule('inetOrgPerson')->getAttributes();
}
+ elseif ($container->getAccountModule('windowsUser') != null) {
+ $personalAttributes = $container->getAccountModule('windowsUser')->getAttributes();
+ }
if ($personalAttributes == null) {
return $this->buildAccountStatusIcon($container);
}