Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/nslcd/ldap-nss.c
diff options
context:
space:
mode:
Diffstat (limited to 'nslcd/ldap-nss.c')
-rw-r--r--nslcd/ldap-nss.c100
1 files changed, 41 insertions, 59 deletions
diff --git a/nslcd/ldap-nss.c b/nslcd/ldap-nss.c
index 3a8a3eb..2393567 100644
--- a/nslcd/ldap-nss.c
+++ b/nslcd/ldap-nss.c
@@ -1435,6 +1435,9 @@ do_filter (const struct ldap_args *args, const char *filterprot,
struct ldap_service_search_descriptor *sd, char *userBuf,
size_t userBufSiz, char **dynamicUserBuf, const char **retFilter)
{
+
+ /* sd is the map-specific search descriptor as specified in the config */
+
char buf1[LDAP_FILT_MAXSIZ], buf2[LDAP_FILT_MAXSIZ];
char *filterBufP, filterBuf[LDAP_FILT_MAXSIZ];
size_t filterSiz;
@@ -1596,7 +1599,7 @@ do_with_reconnect (const char *base, int scope,
enum nss_status stat = NSS_STATUS_UNAVAIL;
int maxtries;
- log_log(LOG_DEBUG,"==> do_with_reconnect");
+ log_log(LOG_DEBUG,"==> do_with_reconnect (base=\"%s\", scope=%d, filter=\"%s\")",base,scope,filter);
/* caller must successfully call do_init() first */
assert (nslcd_cfg != NULL);
@@ -2061,33 +2064,29 @@ _nss_ldap_next_attribute (LDAPMessage * entry, BerElement * ber)
* Assumes caller holds lock.
*/
enum nss_status _nss_ldap_search_s(
- const struct ldap_args *args,
- const char *filterprot,enum ldap_map_selector sel,
+ const char *base,const char *filter,
+ enum ldap_map_selector sel,
const char **attrs,int sizelimit,LDAPMessage **res)
{
- char sdBase[LDAP_FILT_MAXSIZ];
- const char *base=NULL;
- char filterBuf[LDAP_FILT_MAXSIZ],*dynamicFilterBuf=NULL;
- const char *filter;
int scope;
enum nss_status stat;
struct ldap_service_search_descriptor *sd=NULL;
- log_log(LOG_DEBUG,"==> _nss_ldap_search_s");
+ log_log(LOG_DEBUG,"==> _nss_ldap_search_s (base=\"%s\", filter=\"%s\")",base,filter);
/* initilize session */
if ((stat=do_init())!=NSS_STATUS_SUCCESS)
{
log_log(LOG_DEBUG,"<== _nss_ldap_search_s");
return stat;
}
- /* Set some reasonable defaults. */
- base=nslcd_cfg->ldc_base;
- scope=nslcd_cfg->ldc_scope;
/* if args includes a base, use that */
- if (args!=NULL&&args->la_base!=NULL)
+ if (base!=NULL)
{
sel=LM_NONE;
- base=args->la_base;
}
+ /* Set some reasonable defaults. */
+ if (base==NULL)
+ base=nslcd_cfg->ldc_base;
+ scope=nslcd_cfg->ldc_scope;
if (sel<LM_NONE)
{
/* get search descriptor */
@@ -2101,18 +2100,12 @@ next:
scope=sd->lsd_scope;
}
}
- /* this may allocate dynamicFilterBuf */
- stat=do_filter(args,filterprot,sd,filterBuf,sizeof(filterBuf),&dynamicFilterBuf,&filter);
- if (stat!=NSS_STATUS_SUCCESS)
- return stat;
+
+
stat=do_with_reconnect(
base,scope,filter,attrs,
sizelimit,res,(search_func_t)do_search_s);
- if (dynamicFilterBuf!=NULL)
- {
- free(dynamicFilterBuf);
- dynamicFilterBuf=NULL;
- }
+
/* If no entry was returned, try the next search descriptor. */
if (sd != NULL && sd->lsd_next != NULL)
{
@@ -2137,7 +2130,6 @@ _nss_ldap_search (const struct ldap_args * args,
const char **attrs, int sizelimit, int *msgid,
struct ldap_service_search_descriptor ** csd)
{
- char sdBase[LDAP_FILT_MAXSIZ];
const char *base = NULL;
char filterBuf[LDAP_FILT_MAXSIZ], *dynamicFilterBuf = NULL;
const char *filter;
@@ -2218,7 +2210,6 @@ do_next_page (const struct ldap_args * args,
const char **attrs, int sizelimit, int *msgid,
struct berval *pCookie)
{
- char sdBase[LDAP_FILT_MAXSIZ];
const char *base = NULL;
char filterBuf[LDAP_FILT_MAXSIZ], *dynamicFilterBuf = NULL;
const char *filter;
@@ -2402,30 +2393,30 @@ next:
* General match function.
* Locks mutex.
*/
-enum nss_status
-_nss_ldap_getbyname (struct ldap_args * args,
- void *result, char *buffer, size_t buflen, int
- *errnop, const char *filterprot,
- enum ldap_map_selector sel, const char **attrs,
- parser_t parser)
+int _nss_ldap_getbyname(void *result, char *buffer, size_t buflen,
+ int *errnop, enum ldap_map_selector sel,
+ const char *base, const char *filter,
+ const char **attrs,
+ parser_t parser)
{
+
enum nss_status stat = NSS_STATUS_NOTFOUND;
struct ent_context ctx;
- _nss_ldap_enter ();
+ _nss_ldap_enter();
- log_log(LOG_DEBUG,"==> _nss_ldap_getbyname");
+ log_log(LOG_DEBUG,"==> _nss_ldap_getbyname (base=\"%s\", filter=\"%s\"",base,filter);
- ctx.ec_msgid = -1;
- ctx.ec_cookie = NULL;
+ ctx.ec_msgid=-1;
+ ctx.ec_cookie=NULL;
- stat = _nss_ldap_search_s (args, filterprot, sel, attrs, 1, &ctx.ec_res);
- if (stat != NSS_STATUS_SUCCESS)
- {
- _nss_ldap_leave ();
- log_log(LOG_DEBUG,"<== _nss_ldap_getbyname");
- return stat;
- }
+ stat=_nss_ldap_search_s(base,filter,sel,attrs,1,&ctx.ec_res);
+ if (stat!=NSS_STATUS_SUCCESS)
+ {
+ _nss_ldap_leave ();
+ log_log(LOG_DEBUG,"<== _nss_ldap_getbyname");
+ return nss2nslcd(stat);
+ }
/*
* we pass this along for the benefit of the services parser,
@@ -2433,20 +2424,20 @@ _nss_ldap_getbyname (struct ldap_args * args,
* we only pass the second argument along, as that's what we need
* in services.
*/
- LS_INIT (ctx.ec_state);
- ctx.ec_state.ls_type = LS_TYPE_KEY;
- ctx.ec_state.ls_info.ls_key = args->la_arg2.la_string;
+ LS_INIT(ctx.ec_state);
+ ctx.ec_state.ls_type=LS_TYPE_KEY;
+ ctx.ec_state.ls_info.ls_key=NULL /*was: args->la_arg2.la_string*/;
- stat = do_parse_s (&ctx, result, buffer, buflen, errnop, parser);
+ stat=do_parse_s(&ctx,result,buffer,buflen,errnop,parser);
- _nss_ldap_ent_context_release (&ctx);
+ _nss_ldap_ent_context_release(&ctx);
log_log(LOG_DEBUG,"<== _nss_ldap_getbyname");
/* moved unlock here to avoid race condition bug #49 */
- _nss_ldap_leave ();
+ _nss_ldap_leave();
- return stat;
+ return nss2nslcd(stat);
}
static int NEW_do_parse_s(struct ent_context *ctx,TFILE *fp,NEWparser_t parser)
@@ -2496,7 +2487,7 @@ static int NEW_do_parse_s(struct ent_context *ctx,TFILE *fp,NEWparser_t parser)
int _nss_ldap_searchbyname(
- struct ldap_args *args,const char *filterprot,
+ const char *base,const char *filter,
enum ldap_map_selector sel,const char **attrs,TFILE *fp,NEWparser_t parser)
{
int stat;
@@ -2508,7 +2499,7 @@ int _nss_ldap_searchbyname(
ctx.ec_msgid=-1;
ctx.ec_cookie=NULL;
- stat=nss2nslcd(_nss_ldap_search_s(args,filterprot,sel,attrs,1,&ctx.ec_res));
+ stat=nss2nslcd(_nss_ldap_search_s(base,filter,sel,attrs,1,&ctx.ec_res));
/* write the result code */
WRITE_INT32(fp,stat);
/* bail on nothing found */
@@ -2517,15 +2508,6 @@ int _nss_ldap_searchbyname(
_nss_ldap_leave();
return 1;
}
- /*
- * we pass this along for the benefit of the services parser,
- * which uses it to figure out which protocol we really wanted.
- * we only pass the second argument along, as that's what we need
- * in services.
- */
- LS_INIT(ctx.ec_state);
- ctx.ec_state.ls_type=LS_TYPE_KEY;
- ctx.ec_state.ls_info.ls_key=args->la_arg2.la_string;
/* call the parser for the result */
stat=NEW_do_parse_s(&ctx,fp,parser);