mirror of
https://gitlab.easter-eggs.com/ee/ldapsaisie.git
synced 2024-12-24 01:13:51 +01:00
LSsearch : Added searchLSformat and approxLSformat parameter for searched attributes
This commit is contained in:
parent
aa4058f46f
commit
b87d5207e7
3 changed files with 112 additions and 18 deletions
|
@ -13,6 +13,11 @@ configuration des &LSobjects;, dans la variable <varname>LSsearch</varname>
|
|||
'attr1',
|
||||
'attr2',
|
||||
...
|
||||
'attr3' => array(
|
||||
'searchLSformat' => '[LSformat]',
|
||||
'approxLSformat' => '[LSformat]',
|
||||
),
|
||||
...
|
||||
),
|
||||
'params' => array(
|
||||
// Paramètres de la recherche
|
||||
|
@ -48,15 +53,58 @@ configuration des &LSobjects;, dans la variable <varname>LSsearch</varname>
|
|||
passé par l'utilisateur, &LdapSaisie; composera un filtre LDAP à partir de
|
||||
cette liste.</para>
|
||||
<para>Lors d'une recherche non-approximative, le filtre de recherche sera
|
||||
composé de la manière suivante :
|
||||
composé (par défaut) de la manière suivante :
|
||||
<programlisting>(|(attr1=*motif*)(attr2=*motif*)...)</programlisting></para>
|
||||
<para>Lors d'une recherche approximative, le filtre de recherche sera
|
||||
composé de la manière suivante :
|
||||
composé (par défaut) de la manière suivante :
|
||||
<programlisting>(|(attr1=~motif)(attr2~=motif)...)</programlisting></para>
|
||||
<para>Il est également possible de paramétrer la manière dont sera composé le filtre
|
||||
de recherche attribut par attribut à l'aide des paramètres <emphasis>searchLSformat</emphasis>
|
||||
et <emphasis>approxLSformat</emphasis>.</para>
|
||||
<important><simpara>Ces filtres, une fois composés, sont insérés dans un autre,
|
||||
filtrant en plus sur les <emphasis>ObjectClass</emphasis> du type
|
||||
d'&LSobject; de la manière suivante :</simpara>
|
||||
<programlisting><![CDATA[(& (&(objectclass=oc1)(objectclass=oc2)) (filtre) )]]></programlisting></important>
|
||||
|
||||
<variablelist>
|
||||
<title>Paramètres des attributs</title>
|
||||
|
||||
<varlistentry>
|
||||
<term>searchLSformat</term>
|
||||
<listitem>
|
||||
<para>Ce paramètre est un &LSformat; permettant de définir, attribut par attribut, comment le
|
||||
filtre de recherche LDAP est composé à partir d'un motif de recherche et en cas de recherche
|
||||
non-approximative.</para>
|
||||
<para>Ce &LSformat; est composé à l'aide des éléments <emphasis>name</emphasis>, le nom de
|
||||
l'attribut et <emphasis>pattern</emphasis>, le motif de recherche.
|
||||
<programlisting>
|
||||
<citetitle>Exemple</citetitle>
|
||||
<![CDATA[(%{name}=%{pattern})]]>
|
||||
</programlisting></para>
|
||||
<important><simpara>Le filtre déduit doit obligatoirement commencer par <emphasis>(</emphasis> et
|
||||
se terminer par <emphasis>)</emphasis>.</simpara></important>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>approxLSformat</term>
|
||||
<listitem>
|
||||
<para>Ce paramètre est un &LSformat; permettant de définir, attribut par attribut, comment le
|
||||
filtre de recherche LDAP est composé à partir d'un motif de recherche et en cas de recherche
|
||||
approximative.</para>
|
||||
<para>Ce &LSformat; est composé à l'aide des éléments <emphasis>name</emphasis>, le nom de
|
||||
l'attribut et <emphasis>pattern</emphasis>, le motif de recherche.
|
||||
<programlisting>
|
||||
<citetitle>Exemple</citetitle>
|
||||
<![CDATA[(%{name}=~%{pattern})]]>
|
||||
</programlisting></para>
|
||||
<important><simpara>Le filtre déduit doit obligatoirement commencer par <emphasis>(</emphasis> et
|
||||
se terminer par <emphasis>)</emphasis>.</simpara></important>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
|
|
|
@ -700,21 +700,39 @@ class LSldapObject {
|
|||
*/
|
||||
function getPatternFilter($pattern=null,$approx=null) {
|
||||
if ($pattern!=NULL) {
|
||||
$attrs=array();
|
||||
if (is_array($this -> config['LSsearch']['attrs'])) {
|
||||
$attrs=$this -> config['LSsearch']['attrs'];
|
||||
}
|
||||
else {
|
||||
$attrs=array($this -> config['rdn']);
|
||||
}
|
||||
$pfilter='(|';
|
||||
if ($approx) {
|
||||
foreach ($attrs as $attr_name) {
|
||||
$pfilter.='('.$attr_name.'~='.$pattern.')';
|
||||
foreach ($this -> config['LSsearch']['attrs'] as $key => $val) {
|
||||
if (is_int($key)) {
|
||||
$attrs[$val]=array();
|
||||
}
|
||||
else {
|
||||
$attrs[$key]=$val;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
foreach ($attrs as $attr_name) {
|
||||
$pfilter.='('.$attr_name.'=*'.$pattern.'*)';
|
||||
$attrs=array($this -> config['rdn'] => array());
|
||||
}
|
||||
$pfilter='(|';
|
||||
if ($approx) {
|
||||
foreach ($attrs as $attr_name => $attr_opts) {
|
||||
if (isset($attr_opts['approxLSformat'])) {
|
||||
$pfilter.=getFData($attr_opts['approxLSformat'],array('name' => $attr_name, 'pattern' => $pattern));
|
||||
}
|
||||
else {
|
||||
$pfilter.='('.$attr_name.'~='.$pattern.')';
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
foreach ($attrs as $attr_name => $attr_opts) {
|
||||
if (isset($attr_opts['searchLSformat'])) {
|
||||
$pfilter.=getFData($attr_opts['searchLSformat'],array('name' => $attr_name, 'pattern' => $pattern));
|
||||
}
|
||||
else {
|
||||
$pfilter.='('.$attr_name.'=*'.$pattern.'*)';
|
||||
}
|
||||
}
|
||||
}
|
||||
$pfilter.=')';
|
||||
|
|
|
@ -574,10 +574,22 @@ class LSsearch {
|
|||
$pattern=$this -> params['pattern'];
|
||||
}
|
||||
if (self :: isValidPattern($pattern)) {
|
||||
$operator=( ($params['approx'])?'approx':'contains' );
|
||||
$attrsList=LSconfig::get("LSobjects.".$this -> LSobject.".LSsearch.attrs");
|
||||
$attrsConfig=LSconfig::get("LSobjects.".$this -> LSobject.".LSsearch.attrs");
|
||||
$attrsList=array();
|
||||
if (!is_array($attrsList)) {
|
||||
$attrsList = array_keys(LSconfig::get("LSobjects.".$this -> LSobject.".attrs"));
|
||||
foreach(LSconfig::get("LSobjects.".$this -> LSobject.".attrs") as $attr) {
|
||||
$attrsList[$attr]=array();
|
||||
}
|
||||
}
|
||||
else {
|
||||
foreach($attrsConfig as $key => $val) {
|
||||
if(is_int($key)) {
|
||||
$attrsList[$val]=array();
|
||||
}
|
||||
else {
|
||||
$attrsList[$key]=$val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($attrsList)) {
|
||||
|
@ -586,8 +598,24 @@ class LSsearch {
|
|||
}
|
||||
|
||||
$filters=array();
|
||||
foreach ($attrsList as $attr) {
|
||||
$filter=Net_LDAP2_Filter::create($attr,$operator,$pattern);
|
||||
foreach ($attrsList as $attr => $opts) {
|
||||
if ($params['approx']) {
|
||||
if (isset($opts['approxLSformat'])) {
|
||||
$filter=Net_LDAP2_Filter::parse(getFData($opts['approxLSformat'],array('name'=>$attr,'pattern'=>$pattern)));
|
||||
}
|
||||
else {
|
||||
$filter=Net_LDAP2_Filter::create($attr,'approx',$pattern);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (isset($opts['searchLSformat'])) {
|
||||
$filter=Net_LDAP2_Filter::parse(getFData($opts['searchLSformat'],array('name'=>$attr,'pattern'=>$pattern)));
|
||||
}
|
||||
else {
|
||||
$filter=Net_LDAP2_Filter::create($attr,'contains',$pattern);
|
||||
}
|
||||
}
|
||||
|
||||
if (!Net_LDAP2::isError($filter)) {
|
||||
$filters[]=$filter;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue