LSsearch : Added searchLSformat and approxLSformat parameter for searched attributes

This commit is contained in:
Benjamin Renard 2013-06-28 09:44:02 +02:00
parent aa4058f46f
commit b87d5207e7
3 changed files with 112 additions and 18 deletions

View file

@ -13,6 +13,11 @@ configuration des &LSobjects;, dans la variable <varname>LSsearch</varname>
'attr1', 'attr1',
'attr2', 'attr2',
... ...
'attr3' => array(
'searchLSformat' => '[LSformat]',
'approxLSformat' => '[LSformat]',
),
...
), ),
'params' => array( 'params' => array(
// Paramètres de la recherche // 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 passé par l'utilisateur, &LdapSaisie; composera un filtre LDAP à partir de
cette liste.</para> cette liste.</para>
<para>Lors d'une recherche non-approximative, le filtre de recherche sera <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> <programlisting>(|(attr1=*motif*)(attr2=*motif*)...)</programlisting></para>
<para>Lors d'une recherche approximative, le filtre de recherche sera <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> <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, <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 filtrant en plus sur les <emphasis>ObjectClass</emphasis> du type
d'&LSobject; de la manière suivante :</simpara> d'&LSobject; de la manière suivante :</simpara>
<programlisting><![CDATA[(& (&(objectclass=oc1)(objectclass=oc2)) (filtre) )]]></programlisting></important> <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> </listitem>
</varlistentry> </varlistentry>

View file

@ -700,23 +700,41 @@ class LSldapObject {
*/ */
function getPatternFilter($pattern=null,$approx=null) { function getPatternFilter($pattern=null,$approx=null) {
if ($pattern!=NULL) { if ($pattern!=NULL) {
$attrs=array();
if (is_array($this -> config['LSsearch']['attrs'])) { if (is_array($this -> config['LSsearch']['attrs'])) {
$attrs=$this -> config['LSsearch']['attrs']; foreach ($this -> config['LSsearch']['attrs'] as $key => $val) {
if (is_int($key)) {
$attrs[$val]=array();
} }
else { else {
$attrs=array($this -> config['rdn']); $attrs[$key]=$val;
}
}
}
else {
$attrs=array($this -> config['rdn'] => array());
} }
$pfilter='(|'; $pfilter='(|';
if ($approx) { if ($approx) {
foreach ($attrs as $attr_name) { 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.')'; $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 { else {
foreach ($attrs as $attr_name) {
$pfilter.='('.$attr_name.'=*'.$pattern.'*)'; $pfilter.='('.$attr_name.'=*'.$pattern.'*)';
} }
} }
}
$pfilter.=')'; $pfilter.=')';
return $pfilter; return $pfilter;
} }

View file

@ -574,10 +574,22 @@ class LSsearch {
$pattern=$this -> params['pattern']; $pattern=$this -> params['pattern'];
} }
if (self :: isValidPattern($pattern)) { if (self :: isValidPattern($pattern)) {
$operator=( ($params['approx'])?'approx':'contains' ); $attrsConfig=LSconfig::get("LSobjects.".$this -> LSobject.".LSsearch.attrs");
$attrsList=LSconfig::get("LSobjects.".$this -> LSobject.".LSsearch.attrs"); $attrsList=array();
if (!is_array($attrsList)) { 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)) { if (empty($attrsList)) {
@ -586,8 +598,24 @@ class LSsearch {
} }
$filters=array(); $filters=array();
foreach ($attrsList as $attr) { foreach ($attrsList as $attr => $opts) {
$filter=Net_LDAP2_Filter::create($attr,$operator,$pattern); 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)) { if (!Net_LDAP2::isError($filter)) {
$filters[]=$filter; $filters[]=$filter;
} }