[SR-Dev] git:janakj/ldap: Support for time-limited and size-limited search operations added

Jan Janak jan at iptel.org
Fri Feb 13 00:57:05 CET 2009


Module: sip-router
Branch: janakj/ldap
Commit: 6651dcc8ac76e515a49293c9fd0905f7e2e6b3c7
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=6651dcc8ac76e515a49293c9fd0905f7e2e6b3c7

Author: Gergely Kovacs <gergo at iptel.org>
Committer: Gergely Kovacs <gergo at iptel.org>
Date:   Wed Aug  6 08:33:20 2008 +0000

Support for time-limited and size-limited search operations added

---

 modules/db_ldap/ld_cfg.c |   27 +++++++++++++++++++++++++++
 modules/db_ldap/ld_cfg.h |    6 ++++++
 modules/db_ldap/ld_cmd.c |   11 ++++++++++-
 modules/db_ldap/ld_cmd.h |   11 +++++++----
 modules/db_ldap/ldap.cfg |    6 ++++++
 5 files changed, 56 insertions(+), 5 deletions(-)

diff --git a/modules/db_ldap/ld_cfg.c b/modules/db_ldap/ld_cfg.c
index ea3d564..996ce95 100644
--- a/modules/db_ldap/ld_cfg.c
+++ b/modules/db_ldap/ld_cfg.c
@@ -254,6 +254,8 @@ static cfg_option_t ldap_tab_options[] = {
 	{"field_map", .f = parse_field_map},
 	{"filter",    .f = cfg_parse_str_opt, .flags = CFG_STR_PKGMEM},
 	{"base",      .f = cfg_parse_str_opt, .flags = CFG_STR_PKGMEM},
+	{"timelimit", .f = cfg_parse_int_opt},
+	{"sizelimit", .f = cfg_parse_int_opt},
 	{0}
 };
 
@@ -328,6 +330,8 @@ static int parse_section(void* param, cfg_parser_t* st, unsigned int flags)
 		for(i = 0; scope_values[i].name; i++) {
 			scope_values[i].param = &cfg->scope;
 		}
+		ldap_tab_options[4].param = &cfg->timelimit;
+		ldap_tab_options[5].param = &cfg->sizelimit;
 	} else if (type == LDAP_CON_SECTION) {
 		if ((cinfo = pkg_malloc(sizeof(*cinfo))) == NULL) {
 			ERR("ldap:%s:%d: Out of memory\n", st->file, st->line);
@@ -442,6 +446,25 @@ struct ld_con_info* ld_find_conn_info(str* conn_id)
 }
 
 
+int ld_cfg_validity_check(struct ld_cfg *cfg)
+{
+	struct ld_cfg *pcfg;
+
+	for (pcfg = cfg; pcfg; pcfg = pcfg->next) {
+		if (pcfg->sizelimit < 0 || pcfg->sizelimit > LD_MAXINT) {
+			ERR("ldap: invalid sizelimit (%d) specified\n", pcfg->sizelimit);
+			return -1;
+		}
+		if (pcfg->timelimit < 0 || pcfg->timelimit > LD_MAXINT) {
+			ERR("ldap: invalid timelimit (%d) specified\n", pcfg->timelimit);
+			return -1;
+		}
+	}
+
+	return 0;
+}
+
+
 int ld_load_cfg(str* filename)
 {
 	cfg_parser_t* parser;
@@ -464,5 +487,9 @@ int ld_load_cfg(str* filename)
 		return -1;
 	}
 	cfg_parser_close(parser);
+
+	if (ld_cfg_validity_check(cfg))
+		return -1;
+
 	return 0;
 }
diff --git a/modules/db_ldap/ld_cfg.h b/modules/db_ldap/ld_cfg.h
index 43abca0..0acbf68 100644
--- a/modules/db_ldap/ld_cfg.h
+++ b/modules/db_ldap/ld_cfg.h
@@ -28,6 +28,10 @@
 #include "ld_fld.h"
 
 #include "../../str.h"
+#include <sys/time.h>
+
+/* RFC 2251:  maxInt INTEGER ::= 2147483647 -- (2^^31 - 1) -- */
+#define LD_MAXINT (2147483647)
 
 
 struct ld_cfg {
@@ -39,6 +43,8 @@ struct ld_cfg {
 	str* attr;   /**< An array of LDAP attribute names, zero terminated */
 	enum ld_syntax* syntax; /**< An array of configured LDAP syntaxes */
 	int n;          /**< Number of fields in the arrays */
+	int sizelimit; /**< retrieve at most sizelimit entries for a search */
+	int timelimit; /**< wait at most timelimit seconds for a search to complete */
 	struct ld_cfg* next; /**< The next table in the list */
 };
 
diff --git a/modules/db_ldap/ld_cmd.c b/modules/db_ldap/ld_cmd.c
index 646313c..e628796 100644
--- a/modules/db_ldap/ld_cmd.c
+++ b/modules/db_ldap/ld_cmd.c
@@ -125,6 +125,12 @@ int ld_cmd(db_cmd_t* cmd)
 	lcmd->base = cfg->base.s;
 	lcmd->scope = cfg->scope;
 
+	lcmd->sizelimit = cfg->sizelimit;
+	if (cfg->timelimit) {
+		lcmd->timelimit.tv_sec = cfg->timelimit;
+		lcmd->timelimit.tv_usec = 0;
+	}
+
 	if (cfg->filter.s) {
 		lcmd->filter = cfg->filter;
 	}
@@ -174,7 +180,10 @@ int ld_cmd_exec(db_res_t* res, db_cmd_t* cmd)
 	}
 
 	ret = ldap_search_ext_s(lcon->con, lcmd->base, lcmd->scope, filter,
-							lcmd->result, 0, NULL, NULL, NULL, 0, &msg);
+							lcmd->result, 0, NULL, NULL,
+							lcmd->timelimit.tv_sec ? &lcmd->timelimit : NULL,
+							lcmd->sizelimit,
+							&msg);
 
 	if (ret != LDAP_SUCCESS) {
 		ERR("ldap: Error in ldap_search: %s\n", ldap_err2string(ret));
diff --git a/modules/db_ldap/ld_cmd.h b/modules/db_ldap/ld_cmd.h
index 826f4c6..861da67 100644
--- a/modules/db_ldap/ld_cmd.h
+++ b/modules/db_ldap/ld_cmd.h
@@ -1,5 +1,5 @@
 /*
- * $Id$ 
+ * $Id$
  *
  * LDAP Database Driver for SER
  *
@@ -18,7 +18,7 @@
  * details.
  *
  * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc., 
+ * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
@@ -26,10 +26,10 @@
 #define _LD_CMD_H
 
 /** \addtogroup ldap
- * @{ 
+ * @{
  */
 
-/** \file 
+/** \file
  * Declaration of ld_cmd data structure that contains LDAP specific data
  * stored in db_cmd structures and related functions.
  */
@@ -40,6 +40,7 @@
 #include "../../str.h"
 
 #include <stdarg.h>
+#include <sys/time.h>
 
 
 /** Extension structure of db_cmd adding LDAP specific data.
@@ -52,6 +53,8 @@ struct ld_cmd {
 	int scope;    /**< Scope of the search */
 	str filter;   /**< To be added to the search filter */
 	char** result; /**< An array with result attribute names for ldap_search */
+	int sizelimit; /**< retrieve at most sizelimit entries for a search */
+	struct timeval timelimit; /**< wait at most timelimit seconds for a search to complete */
 };
 
 
diff --git a/modules/db_ldap/ldap.cfg b/modules/db_ldap/ldap.cfg
index d113bfb..b146ffb 100644
--- a/modules/db_ldap/ldap.cfg
+++ b/modules/db_ldap/ldap.cfg
@@ -63,6 +63,12 @@ field_map = auth_username : digestUsername
 field_map = uid : serUID
 field_map = flags : (BitString) serFlags
 
+# retrieve at most sizelimit entries for a search
+#sizelimit = 2147483647
+
+# wait at most timelimit seconds for a search to complete
+#timelimit = 120
+
 #
 # Domain table stores information about virtual domains
 #




More information about the sr-dev mailing list