commit
690ba0407d
|
@ -1,7 +1,9 @@
|
||||||
December 2019 7.0
|
December 2019 7.0
|
||||||
- Lamdaemon can be configured with directory prefix for homedirs
|
- Lamdaemon can be configured with directory prefix for homedirs
|
||||||
|
- Account list filters match on substrings instead of whole value
|
||||||
- Fixed bugs:
|
- Fixed bugs:
|
||||||
-> Missing CSS for Duo
|
-> Missing CSS for Duo
|
||||||
|
-> Editing of DNs with comma on Windows (210)
|
||||||
|
|
||||||
29.09.2019 6.9
|
29.09.2019 6.9
|
||||||
- Group account types can show member+owner count in list view
|
- Group account types can show member+owner count in list view
|
||||||
|
|
|
@ -673,7 +673,6 @@ function get_preg($argument, $regexp) {
|
||||||
* @return String escaped DN
|
* @return String escaped DN
|
||||||
*/
|
*/
|
||||||
function escapeDN($dn) {
|
function escapeDN($dn) {
|
||||||
$dn = preg_replace('/[ ]*,[ ]*/', ',', $dn);
|
|
||||||
return str_replace(
|
return str_replace(
|
||||||
array(')', '(', ' ', '*'),
|
array(')', '(', ' ', '*'),
|
||||||
array('\\29', '\\28', '\\20', '\\2a'),
|
array('\\29', '\\28', '\\20', '\\2a'),
|
||||||
|
@ -693,6 +692,19 @@ function escapeRDN($rdn) {
|
||||||
$rdn);
|
$rdn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts the comma escaping from Windows to OpenLDAP style.
|
||||||
|
*
|
||||||
|
* @param string $dn DN
|
||||||
|
* @return string DN
|
||||||
|
*/
|
||||||
|
function convertCommaEscaping($dn) {
|
||||||
|
return str_replace(
|
||||||
|
array('\\,'),
|
||||||
|
array('\\2C'),
|
||||||
|
$dn);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects to an LDAP server using the given URL.
|
* Connects to an LDAP server using the given URL.
|
||||||
*
|
*
|
||||||
|
@ -1041,6 +1053,7 @@ function getAbstractDN($dn) {
|
||||||
if ($dn == '') {
|
if ($dn == '') {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
$dn = str_replace('\\,', '\\2C', $dn);
|
||||||
$parts = explode(',', $dn);
|
$parts = explode(',', $dn);
|
||||||
for ($i = 0; $i < sizeof($parts); $i++) {
|
for ($i = 0; $i < sizeof($parts); $i++) {
|
||||||
$subparts = explode('=', $parts[$i]);
|
$subparts = explode('=', $parts[$i]);
|
||||||
|
@ -1048,7 +1061,8 @@ function getAbstractDN($dn) {
|
||||||
$parts[$i] = $subparts[1];
|
$parts[$i] = $subparts[1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return implode(' > ', $parts);
|
$abstractDn = implode(' > ', $parts);
|
||||||
|
return str_replace(array('\\2C', '\\,'), array(',', ','), $abstractDn);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1214,6 +1228,7 @@ function extractDNSuffix($dn) {
|
||||||
if ($dn == null) {
|
if ($dn == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
$dn = convertCommaEscaping($dn);
|
||||||
return substr($dn, strpos($dn, ',')+1);
|
return substr($dn, strpos($dn, ',')+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -193,16 +193,13 @@ jQuery(document).ready(function() {
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="ui-tabs ui-corner-all ui-widget ui-widget-content">
|
|
||||||
<ul class="ui-tabs-nav ui-corner-all ui-helper-reset ui-helper-clearfix ui-widget-header">
|
|
||||||
<?php
|
|
||||||
printTypeTabs($headerPrefix);
|
|
||||||
?>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
printTypeTabs($headerPrefix);
|
||||||
|
|
||||||
function printTypeTabs($headerPrefix) {
|
function printTypeTabs($headerPrefix) {
|
||||||
|
echo '<div class="ui-tabs ui-corner-all ui-widget ui-widget-content">';
|
||||||
|
echo '<ul class="ui-tabs-nav ui-corner-all ui-helper-reset ui-helper-clearfix ui-widget-header">';
|
||||||
$typeManager = new \LAM\TYPES\TypeManager();
|
$typeManager = new \LAM\TYPES\TypeManager();
|
||||||
$types = $typeManager->getConfiguredTypes();
|
$types = $typeManager->getConfiguredTypes();
|
||||||
foreach ($types as $type) {
|
foreach ($types as $type) {
|
||||||
|
@ -217,5 +214,6 @@ function printTypeTabs($headerPrefix) {
|
||||||
echo $link;
|
echo $link;
|
||||||
echo "</li>\n";
|
echo "</li>\n";
|
||||||
}
|
}
|
||||||
|
echo '</ul>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1080,7 +1080,14 @@ class lamList {
|
||||||
if (!$this->isAttributeFilteredByServer($attr)) {
|
if (!$this->isAttributeFilteredByServer($attr)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$text .= '(' . $attr . '=' . $filter . ')';
|
$filterExpression = $filter;
|
||||||
|
if (strpos($filter, '*') !== 0) {
|
||||||
|
$filterExpression = '*' . $filterExpression;
|
||||||
|
}
|
||||||
|
if (strrpos($filter, '*') !== (strlen($filter) - 1)) {
|
||||||
|
$filterExpression = $filterExpression . '*';
|
||||||
|
}
|
||||||
|
$text .= '(' . $attr . '=' . $filterExpression . ')';
|
||||||
}
|
}
|
||||||
return $text;
|
return $text;
|
||||||
}
|
}
|
||||||
|
@ -1113,7 +1120,7 @@ class lamList {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$regex = str_replace(array('*'), array('.*'), $filterValue);
|
$regex = str_replace(array('*'), array('.*'), $filterValue);
|
||||||
$regex = '/^' . $regex . '$/i';
|
$regex = '/' . $regex . '/i';
|
||||||
if (!$this->isFilterMatching($data, $filterAttribute, $regex)) {
|
if (!$this->isFilterMatching($data, $filterAttribute, $regex)) {
|
||||||
$toFilter[] = $index;
|
$toFilter[] = $index;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1051,10 +1051,9 @@ class accountContainer {
|
||||||
$titleBarContainer = new htmlResponsiveRow();
|
$titleBarContainer = new htmlResponsiveRow();
|
||||||
$titleBarContainer->setCSSClasses(array('maxrow'));
|
$titleBarContainer->setCSSClasses(array('maxrow'));
|
||||||
$titleBarTitleText = new htmlOutputText($this->titleBarTitle, false);
|
$titleBarTitleText = new htmlOutputText($this->titleBarTitle, false);
|
||||||
$titleBarContainer->add(new htmlDiv(null, $titleBarTitleText, array('titleBarTitle', 'text-left')), 12);
|
$titleBarContainer->add(new htmlDiv(null, $titleBarTitleText, array('titleBarTitle', 'text-left')), 12, 12, 4);
|
||||||
$titleBarContainer->addVerticalSpacer('0.5rem');
|
|
||||||
$titleBarSubtitleText = new htmlOutputText($this->titleBarSubtitle, false);
|
$titleBarSubtitleText = new htmlOutputText($this->titleBarSubtitle, false);
|
||||||
$titleBarContainer->add(new htmlDiv(null, $titleBarSubtitleText, array('titleBarSubtitle', 'text-left')), 12);
|
$titleBarContainer->add(new htmlDiv(null, $titleBarSubtitleText, array('titleBarSubtitle', 'responsiveLabel')), 12, 12, 8);
|
||||||
$titleBarSuffixRdn = new htmlResponsiveRow();
|
$titleBarSuffixRdn = new htmlResponsiveRow();
|
||||||
$titleBarSuffixRdn->add(new htmlHorizontalLine(), 12);
|
$titleBarSuffixRdn->add(new htmlHorizontalLine(), 12);
|
||||||
// suffix
|
// suffix
|
||||||
|
@ -1314,6 +1313,7 @@ class accountContainer {
|
||||||
. getSecurityTokenName() . '\',\'' . getSecurityTokenValue() . '\');');
|
. getSecurityTokenName() . '\',\'' . getSecurityTokenValue() . '\');');
|
||||||
$leftButtonGroup->addElement($passwordButton);
|
$leftButtonGroup->addElement($passwordButton);
|
||||||
}
|
}
|
||||||
|
// delete button
|
||||||
if (!$this->isNewAccount) {
|
if (!$this->isNewAccount) {
|
||||||
$leftButtonGroup->addElement(new htmlSpacer('15px', null));
|
$leftButtonGroup->addElement(new htmlSpacer('15px', null));
|
||||||
$deleteButton = new htmlButton('accountContainerDelete', _('Delete'));
|
$deleteButton = new htmlButton('accountContainerDelete', _('Delete'));
|
||||||
|
@ -1321,7 +1321,7 @@ class accountContainer {
|
||||||
$deleteButton->setCSSClasses(array('fullwidth-mobile-only'));
|
$deleteButton->setCSSClasses(array('fullwidth-mobile-only'));
|
||||||
$leftButtonGroup->addElement($deleteButton);
|
$leftButtonGroup->addElement($deleteButton);
|
||||||
}
|
}
|
||||||
$row->add($leftButtonGroup, 12, 7);
|
$row->add($leftButtonGroup, 12, 9);
|
||||||
|
|
||||||
$rightGroup = new htmlGroup();
|
$rightGroup = new htmlGroup();
|
||||||
// profile selection
|
// profile selection
|
||||||
|
@ -1340,7 +1340,7 @@ class accountContainer {
|
||||||
$rightGroup->addElement(new htmlSpacer('1px', null));
|
$rightGroup->addElement(new htmlSpacer('1px', null));
|
||||||
$rightGroup->addElement(new htmlHelpLink('401'));
|
$rightGroup->addElement(new htmlHelpLink('401'));
|
||||||
}
|
}
|
||||||
$row->add($rightGroup, 12, 5, 5, 'text-right');
|
$row->add($rightGroup, 12, 3, 3, 'text-right');
|
||||||
|
|
||||||
parseHtml(null, $row, array(), false, $tabindex, $this->type->getScope());
|
parseHtml(null, $row, array(), false, $tabindex, $this->type->getScope());
|
||||||
}
|
}
|
||||||
|
@ -1937,9 +1937,9 @@ class accountContainer {
|
||||||
}
|
}
|
||||||
// Set to true if an real error has happened
|
// Set to true if an real error has happened
|
||||||
$stopprocessing = false;
|
$stopprocessing = false;
|
||||||
if (strtolower($this->finalDN) != strtolower($this->dn_orig)) {
|
if (strtolower($this->finalDN) != convertCommaEscaping(strtolower($this->dn_orig))) {
|
||||||
// move existing DN
|
// move existing DN
|
||||||
if ($this->dn_orig!='') {
|
if ($this->dn_orig != '') {
|
||||||
$removeOldRDN = false;
|
$removeOldRDN = false;
|
||||||
if (isset($attributes[$this->finalDN]['modify'])) {
|
if (isset($attributes[$this->finalDN]['modify'])) {
|
||||||
$attributes[$this->finalDN]['modify'] = array_change_key_case($attributes[$this->finalDN]['modify'], CASE_LOWER);
|
$attributes[$this->finalDN]['modify'] = array_change_key_case($attributes[$this->finalDN]['modify'], CASE_LOWER);
|
||||||
|
|
|
@ -128,6 +128,7 @@ class user extends baseType {
|
||||||
* @return String title text
|
* @return String title text
|
||||||
*/
|
*/
|
||||||
public function getTitleBarTitle($container) {
|
public function getTitleBarTitle($container) {
|
||||||
|
$title = $this->buildAccountStatusIcon($container);
|
||||||
// get attributes
|
// get attributes
|
||||||
$personalAttributes = null;
|
$personalAttributes = null;
|
||||||
if ($container->getAccountModule('inetOrgPerson') != null) {
|
if ($container->getAccountModule('inetOrgPerson') != null) {
|
||||||
|
@ -158,37 +159,37 @@ class user extends baseType {
|
||||||
// check if first and last name can be shown
|
// check if first and last name can be shown
|
||||||
if (($personalAttributes != null) && isset($personalAttributes['sn'][0]) && !empty($personalAttributes['sn'][0])
|
if (($personalAttributes != null) && isset($personalAttributes['sn'][0]) && !empty($personalAttributes['sn'][0])
|
||||||
&& isset($personalAttributes['givenName'][0]) && !empty($personalAttributes['givenName'][0])) {
|
&& isset($personalAttributes['givenName'][0]) && !empty($personalAttributes['givenName'][0])) {
|
||||||
return htmlspecialchars($personalAttributes['givenName'][0] . ' ' . $personalAttributes['sn'][0]);
|
return $title . htmlspecialchars($personalAttributes['givenName'][0] . ' ' . $personalAttributes['sn'][0]);
|
||||||
}
|
}
|
||||||
// check if a display name is set
|
// check if a display name is set
|
||||||
if (($sambaAttributes != null) && isset($sambaAttributes['displayName'][0]) && !empty($sambaAttributes['displayName'][0])) {
|
if (($sambaAttributes != null) && isset($sambaAttributes['displayName'][0]) && !empty($sambaAttributes['displayName'][0])) {
|
||||||
return htmlspecialchars($sambaAttributes['displayName'][0]);
|
return $title . htmlspecialchars($sambaAttributes['displayName'][0]);
|
||||||
}
|
}
|
||||||
// check if a common name is set
|
// check if a common name is set
|
||||||
if (($personalAttributes != null) && isset($personalAttributes['cn'][0]) && !empty($personalAttributes['cn'][0])) {
|
if (($personalAttributes != null) && isset($personalAttributes['cn'][0]) && !empty($personalAttributes['cn'][0])) {
|
||||||
return htmlspecialchars($personalAttributes['cn'][0]);
|
return $title . htmlspecialchars($personalAttributes['cn'][0]);
|
||||||
}
|
}
|
||||||
if (($unixAttributes != null) && isset($unixAttributes['cn'][0]) && !empty($unixAttributes['cn'][0])) {
|
if (($unixAttributes != null) && isset($unixAttributes['cn'][0]) && !empty($unixAttributes['cn'][0])) {
|
||||||
return htmlspecialchars($unixAttributes['cn'][0]);
|
return $title . htmlspecialchars($unixAttributes['cn'][0]);
|
||||||
}
|
}
|
||||||
// check if a user name is set
|
// check if a user name is set
|
||||||
if (($unixAttributes != null) && isset($unixAttributes['uid'][0]) && !empty($unixAttributes['uid'][0])) {
|
if (($unixAttributes != null) && isset($unixAttributes['uid'][0]) && !empty($unixAttributes['uid'][0])) {
|
||||||
return htmlspecialchars($unixAttributes['uid'][0]);
|
return $title . htmlspecialchars($unixAttributes['uid'][0]);
|
||||||
}
|
}
|
||||||
if (($personalAttributes != null) && isset($personalAttributes['uid'][0]) && !empty($personalAttributes['uid'][0])) {
|
if (($personalAttributes != null) && isset($personalAttributes['uid'][0]) && !empty($personalAttributes['uid'][0])) {
|
||||||
return htmlspecialchars($personalAttributes['uid'][0]);
|
return $title . htmlspecialchars($personalAttributes['uid'][0]);
|
||||||
}
|
}
|
||||||
if (($accountAttributes != null) && isset($accountAttributes['uid'][0]) && !empty($accountAttributes['uid'][0])) {
|
if (($accountAttributes != null) && isset($accountAttributes['uid'][0]) && !empty($accountAttributes['uid'][0])) {
|
||||||
return htmlspecialchars($accountAttributes['uid'][0]);
|
return $title . htmlspecialchars($accountAttributes['uid'][0]);
|
||||||
}
|
}
|
||||||
if (($mitKerberosAttributes != null) && isset($mitKerberosAttributes['krbPrincipalName'][0]) && !empty($mitKerberosAttributes['krbPrincipalName'][0])) {
|
if (($mitKerberosAttributes != null) && isset($mitKerberosAttributes['krbPrincipalName'][0]) && !empty($mitKerberosAttributes['krbPrincipalName'][0])) {
|
||||||
return htmlspecialchars($mitKerberosAttributes['krbPrincipalName'][0]);
|
return $title . htmlspecialchars($mitKerberosAttributes['krbPrincipalName'][0]);
|
||||||
}
|
}
|
||||||
if ($container->isNewAccount) {
|
if ($container->isNewAccount) {
|
||||||
return _("New user");
|
return $title . _("New user");
|
||||||
}
|
}
|
||||||
// fall back to default
|
// fall back to default
|
||||||
return parent::getTitleBarTitle($container);
|
return $title . parent::getTitleBarTitle($container);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -206,10 +207,10 @@ class user extends baseType {
|
||||||
$personalAttributes = $container->getAccountModule('windowsUser')->getAttributes();
|
$personalAttributes = $container->getAccountModule('windowsUser')->getAttributes();
|
||||||
}
|
}
|
||||||
if ($personalAttributes == null) {
|
if ($personalAttributes == null) {
|
||||||
return $this->buildAccountStatusIcon($container);
|
return '';
|
||||||
}
|
}
|
||||||
$subtitle = $this->buildAccountStatusIcon($container);
|
$subtitle = '';
|
||||||
$spacer = ' ';
|
$spacer = ' ';
|
||||||
// check if an email address can be shown
|
// check if an email address can be shown
|
||||||
if (isset($personalAttributes['mail'][0]) && !empty($personalAttributes['mail'][0])) {
|
if (isset($personalAttributes['mail'][0]) && !empty($personalAttributes['mail'][0])) {
|
||||||
$subtitle .= '<a href="mailto:' . htmlspecialchars($personalAttributes['mail'][0]) . '">' . htmlspecialchars($personalAttributes['mail'][0]) . '</a>' . $spacer;
|
$subtitle .= '<a href="mailto:' . htmlspecialchars($personalAttributes['mail'][0]) . '">' . htmlspecialchars($personalAttributes['mail'][0]) . '</a>' . $spacer;
|
||||||
|
|
|
@ -226,8 +226,9 @@ textarea {
|
||||||
|
|
||||||
table.lamHeader {
|
table.lamHeader {
|
||||||
background-image: url(lam-images/headerLine.png);
|
background-image: url(lam-images/headerLine.png);
|
||||||
padding: 0px 0px 0.5rem 0px;
|
padding: 0px;
|
||||||
height: 35px;
|
height: 35px;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.lamTop {
|
table.lamTop {
|
||||||
|
@ -587,7 +588,7 @@ tr.account {
|
||||||
}
|
}
|
||||||
|
|
||||||
#lamVerticalTabs .ui-tabs-panel {
|
#lamVerticalTabs .ui-tabs-panel {
|
||||||
padding: 1em;
|
padding: 0em 1em 1em 1em;
|
||||||
float: left;
|
float: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
/*
|
/*
|
||||||
|
|
||||||
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
|
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
|
||||||
Copyright (C) 2010 - 2018 Roland Gruber
|
Copyright (C) 2010 - 2019 Roland Gruber
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
|
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
|
||||||
Copyright (C) 2018 Roland Gruber
|
Copyright (C) 2018 - 2019 Roland Gruber
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -128,4 +128,20 @@ class AccountTest extends PHPUnit_Framework_TestCase {
|
||||||
$this->assertEquals('http://base/test.php', getCallingURL('http://base'));
|
$this->assertEquals('http://base/test.php', getCallingURL('http://base'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests convertCommaEscaping().
|
||||||
|
*/
|
||||||
|
function testConvertCommaEscaping() {
|
||||||
|
$this->assertEquals('cn=test\\2C user,ou=People,o=test,c=de', convertCommaEscaping('cn=test\\, user,ou=People,o=test,c=de'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests getAbstractDN().
|
||||||
|
*/
|
||||||
|
function testGetAbstractDN() {
|
||||||
|
$this->assertEquals('test > test > de', getAbstractDN('cn=test,o=test,c=de'));
|
||||||
|
$this->assertEquals('test,user > test > de', getAbstractDN('cn=test\\,user,o=test,c=de'));
|
||||||
|
$this->assertEquals('test,user > test > de', getAbstractDN('cn=test\\2Cuser,o=test,c=de'));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue