From b87d5207e7e0c7bbae7710c5332a9c95bb99a086 Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Fri, 28 Jun 2013 09:44:02 +0200 Subject: [PATCH] LSsearch : Added searchLSformat and approxLSformat parameter for searched attributes --- doc/conf/LSobject/LSsearch.docbook | 52 ++++++++++++++++++- .../includes/class/class.LSldapObject.php | 40 ++++++++++---- public_html/includes/class/class.LSsearch.php | 38 ++++++++++++-- 3 files changed, 112 insertions(+), 18 deletions(-) diff --git a/doc/conf/LSobject/LSsearch.docbook b/doc/conf/LSobject/LSsearch.docbook index 5693dc3b..728a2196 100644 --- a/doc/conf/LSobject/LSsearch.docbook +++ b/doc/conf/LSobject/LSsearch.docbook @@ -13,6 +13,11 @@ configuration des &LSobjects;, dans la variable LSsearch '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 LSsearch passé par l'utilisateur, &LdapSaisie; composera un filtre LDAP à partir de cette liste. 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 : (|(attr1=*motif*)(attr2=*motif*)...) 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 : (|(attr1=~motif)(attr2~=motif)...) + 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 searchLSformat + et approxLSformat. Ces filtres, une fois composés, sont insérés dans un autre, filtrant en plus sur les ObjectClass du type d'&LSobject; de la manière suivante : + + + Paramètres des attributs + + + searchLSformat + + 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. + Ce &LSformat; est composé à l'aide des éléments name, le nom de + l'attribut et pattern, le motif de recherche. + + Exemple + + + Le filtre déduit doit obligatoirement commencer par ( et + se terminer par ). + + + + + approxLSformat + + 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. + Ce &LSformat; est composé à l'aide des éléments name, le nom de + l'attribut et pattern, le motif de recherche. + + Exemple + + + Le filtre déduit doit obligatoirement commencer par ( et + se terminer par ). + + + + + diff --git a/public_html/includes/class/class.LSldapObject.php b/public_html/includes/class/class.LSldapObject.php index 944b8576..43649429 100644 --- a/public_html/includes/class/class.LSldapObject.php +++ b/public_html/includes/class/class.LSldapObject.php @@ -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.=')'; diff --git a/public_html/includes/class/class.LSsearch.php b/public_html/includes/class/class.LSsearch.php index 19cc68c0..c2ca82ff 100644 --- a/public_html/includes/class/class.LSsearch.php +++ b/public_html/includes/class/class.LSsearch.php @@ -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; }