summaryrefslogtreecommitdiff
path: root/nslcd/shadow.c
diff options
context:
space:
mode:
Diffstat (limited to 'nslcd/shadow.c')
-rw-r--r--nslcd/shadow.c315
1 files changed, 159 insertions, 156 deletions
diff --git a/nslcd/shadow.c b/nslcd/shadow.c
index 2cb920d..e88ec4b 100644
--- a/nslcd/shadow.c
+++ b/nslcd/shadow.c
@@ -65,23 +65,20 @@ const char *attmap_shadow_shadowExpire = "\"${shadowExpire:--1}\"";
const char *attmap_shadow_shadowFlag = "\"${shadowFlag:-0}\"";
/* default values for attributes */
-static const char *default_shadow_userPassword = "*"; /* unmatchable */
+static const char *default_shadow_userPassword = "*"; /* unmatchable */
/* the attribute list to request with searches */
-static const char **shadow_attrs=NULL;
+static const char **shadow_attrs = NULL;
-static int mkfilter_shadow_byname(const char *name,
- char *buffer,size_t buflen)
+static int mkfilter_shadow_byname(const char *name, char *buffer, size_t buflen)
{
char safename[300];
/* escape attribute */
- if(myldap_escape(name,safename,sizeof(safename)))
+ if (myldap_escape(name, safename, sizeof(safename)))
return -1;
/* build filter */
- return mysnprintf(buffer,buflen,
- "(&%s(%s=%s))",
- shadow_filter,
- attmap_shadow_uid,safename);
+ return mysnprintf(buffer, buflen, "(&%s(%s=%s))",
+ shadow_filter, attmap_shadow_uid, safename);
}
void shadow_init(void)
@@ -89,72 +86,72 @@ void shadow_init(void)
int i;
SET *set;
/* set up search bases */
- if (shadow_bases[0]==NULL)
- for (i=0;i<NSS_LDAP_CONFIG_MAX_BASES;i++)
- shadow_bases[i]=nslcd_cfg->ldc_bases[i];
+ if (shadow_bases[0] == NULL)
+ for (i = 0; i < NSS_LDAP_CONFIG_MAX_BASES; i++)
+ shadow_bases[i] = nslcd_cfg->ldc_bases[i];
/* set up scope */
- if (shadow_scope==LDAP_SCOPE_DEFAULT)
- shadow_scope=nslcd_cfg->ldc_scope;
+ if (shadow_scope == LDAP_SCOPE_DEFAULT)
+ shadow_scope = nslcd_cfg->ldc_scope;
/* set up attribute list */
- set=set_new();
- attmap_add_attributes(set,attmap_shadow_uid);
- attmap_add_attributes(set,attmap_shadow_userPassword);
- attmap_add_attributes(set,attmap_shadow_shadowLastChange);
- attmap_add_attributes(set,attmap_shadow_shadowMax);
- attmap_add_attributes(set,attmap_shadow_shadowMin);
- attmap_add_attributes(set,attmap_shadow_shadowWarning);
- attmap_add_attributes(set,attmap_shadow_shadowInactive);
- attmap_add_attributes(set,attmap_shadow_shadowExpire);
- attmap_add_attributes(set,attmap_shadow_shadowFlag);
- shadow_attrs=set_tolist(set);
+ set = set_new();
+ attmap_add_attributes(set, attmap_shadow_uid);
+ attmap_add_attributes(set, attmap_shadow_userPassword);
+ attmap_add_attributes(set, attmap_shadow_shadowLastChange);
+ attmap_add_attributes(set, attmap_shadow_shadowMax);
+ attmap_add_attributes(set, attmap_shadow_shadowMin);
+ attmap_add_attributes(set, attmap_shadow_shadowWarning);
+ attmap_add_attributes(set, attmap_shadow_shadowInactive);
+ attmap_add_attributes(set, attmap_shadow_shadowExpire);
+ attmap_add_attributes(set, attmap_shadow_shadowFlag);
+ shadow_attrs = set_tolist(set);
set_free(set);
}
-static long to_date(const char *dn,const char *date,const char *attr)
+static long to_date(const char *dn, const char *date, const char *attr)
{
char buffer[32];
long value;
char *tmp;
size_t l;
/* do some special handling for date values on AD */
- if (strcasecmp(attr,"pwdLastSet")==0)
+ if (strcasecmp(attr, "pwdLastSet") == 0)
{
/* we expect an AD 64-bit datetime value;
we should do date=date/864000000000-134774
but that causes problems on 32-bit platforms,
first we devide by 1000000000 by stripping the
last 9 digits from the string and going from there */
- l=strlen(date)-9;
- if (l>(sizeof(buffer)-1))
+ l = strlen(date) - 9;
+ if (l > (sizeof(buffer) - 1))
return -1; /* error */
- strncpy(buffer,date,l);
- buffer[l]='\0';
- errno=0;
- value=strtol(date,&tmp,10);
- if ((*date=='\0')||(*tmp!='\0'))
+ strncpy(buffer, date, l);
+ buffer[l] = '\0';
+ errno = 0;
+ value = strtol(date, &tmp, 10);
+ if ((*date == '\0') || (*tmp != '\0'))
{
- log_log(LOG_WARNING,"%s: %s: non-numeric",dn,attr);
+ log_log(LOG_WARNING, "%s: %s: non-numeric", dn, attr);
return -1;
}
- else if (errno!=0)
+ else if (errno != 0)
{
- log_log(LOG_WARNING,"%s: %s: out of range",dn,attr);
+ log_log(LOG_WARNING, "%s: %s: out of range", dn, attr);
return -1;
}
- return value/864-134774;
+ return value / 864 - 134774;
/* note that AD does not have expiry dates but a lastchangeddate
and some value that needs to be added */
}
- errno=0;
- value=strtol(date,&tmp,10);
- if ((*date=='\0')||(*tmp!='\0'))
+ errno = 0;
+ value = strtol(date, &tmp, 10);
+ if ((*date == '\0') || (*tmp != '\0'))
{
- log_log(LOG_WARNING,"%s: %s: non-numeric",dn,attr);
+ log_log(LOG_WARNING, "%s: %s: non-numeric", dn, attr);
return -1;
}
- else if (errno!=0)
+ else if (errno != 0)
{
- log_log(LOG_WARNING,"%s: %s: out of range",dn,attr);
+ log_log(LOG_WARNING, "%s: %s: out of range", dn, attr);
return -1;
}
return value;
@@ -164,55 +161,58 @@ static long to_date(const char *dn,const char *date,const char *attr)
#define UF_DONT_EXPIRE_PASSWD 0x10000
#endif
-#define GET_OPTIONAL_LONG(var,att,fallback) \
- tmpvalue=attmap_get_value(entry,attmap_shadow_##att,buffer,sizeof(buffer)); \
- if (tmpvalue==NULL) \
- tmpvalue=""; \
- errno=0; \
- var=strtol(tmpvalue,&tmp,10); \
- if ((*(tmpvalue)=='\0')||(*tmp!='\0')) \
- { \
- log_log(LOG_WARNING,"%s: %s: non-numeric", \
- myldap_get_dn(entry),attmap_shadow_##att); \
- var=fallback; \
- } \
- else if (errno!=0) \
- { \
- log_log(LOG_WARNING,"%s: %s: out of range", \
- myldap_get_dn(entry),attmap_shadow_##att); \
- var=fallback; \
+#define GET_OPTIONAL_LONG(var, att, fallback) \
+ tmpvalue = attmap_get_value(entry, attmap_shadow_##att, \
+ buffer, sizeof(buffer)); \
+ if (tmpvalue == NULL) \
+ tmpvalue = ""; \
+ errno = 0; \
+ var = strtol(tmpvalue, &tmp, 10); \
+ if ((*(tmpvalue) == '\0') || (*tmp != '\0')) \
+ { \
+ log_log(LOG_WARNING, "%s: %s: non-numeric", \
+ myldap_get_dn(entry), attmap_shadow_##att); \
+ var = fallback; \
+ } \
+ else if (errno != 0) \
+ { \
+ log_log(LOG_WARNING, "%s: %s: out of range", \
+ myldap_get_dn(entry), attmap_shadow_##att); \
+ var = fallback; \
}
-void get_shadow_properties(MYLDAP_ENTRY *entry,long *lastchangedate,
- long *mindays,long *maxdays,long *warndays,
- long *inactdays,long *expiredate,unsigned long *flag)
+void get_shadow_properties(MYLDAP_ENTRY *entry, long *lastchangedate,
+ long *mindays, long *maxdays, long *warndays,
+ long *inactdays, long *expiredate,
+ unsigned long *flag)
{
char buffer[64];
const char *tmpvalue;
char *tmp;
/* get lastchange date */
- tmpvalue=attmap_get_value(entry,attmap_shadow_shadowLastChange,buffer,sizeof(buffer));
- if (tmpvalue==NULL)
- tmpvalue="";
- *lastchangedate=to_date(myldap_get_dn(entry),tmpvalue,attmap_shadow_shadowLastChange);
+ tmpvalue = attmap_get_value(entry, attmap_shadow_shadowLastChange,
+ buffer, sizeof(buffer));
+ if (tmpvalue == NULL)
+ tmpvalue = "";
+ *lastchangedate = to_date(myldap_get_dn(entry), tmpvalue, attmap_shadow_shadowLastChange);
/* get other shadow properties */
- GET_OPTIONAL_LONG(*mindays,shadowMin,-1);
- GET_OPTIONAL_LONG(*maxdays,shadowMax,-1);
- GET_OPTIONAL_LONG(*warndays,shadowWarning,-1);
- GET_OPTIONAL_LONG(*inactdays,shadowInactive,-1);
- GET_OPTIONAL_LONG(*expiredate,shadowExpire,-1);
- GET_OPTIONAL_LONG(*flag,shadowFlag,0);
+ GET_OPTIONAL_LONG(*mindays, shadowMin, -1);
+ GET_OPTIONAL_LONG(*maxdays, shadowMax, -1);
+ GET_OPTIONAL_LONG(*warndays, shadowWarning, -1);
+ GET_OPTIONAL_LONG(*inactdays, shadowInactive, -1);
+ GET_OPTIONAL_LONG(*expiredate, shadowExpire, -1);
+ GET_OPTIONAL_LONG(*flag, shadowFlag, 0);
/* if we're using AD handle the flag specially */
- if (strcasecmp(attmap_shadow_shadowLastChange,"pwdLastSet")==0)
+ if (strcasecmp(attmap_shadow_shadowLastChange, "pwdLastSet") == 0)
{
- if (*flag&UF_DONT_EXPIRE_PASSWD)
- *maxdays=-1;
- *flag=0;
+ if (*flag & UF_DONT_EXPIRE_PASSWD)
+ *maxdays = -1;
+ *flag = 0;
}
}
/* try to update the shadowLastChange attribute of the entry if possible */
-int update_lastchange(MYLDAP_SESSION *session,const char *userdn)
+int update_lastchange(MYLDAP_SESSION *session, const char *userdn)
{
MYLDAP_SEARCH *search;
MYLDAP_ENTRY *entry;
@@ -220,63 +220,64 @@ int update_lastchange(MYLDAP_SESSION *session,const char *userdn)
const char *attr;
int rc;
const char **values;
- LDAPMod mod,*mods[2];
- char buffer[64],*strvals[2];
+ LDAPMod mod, *mods[2];
+ char buffer[64], *strvals[2];
/* find the name of the attribute to use */
- if ( (attmap_shadow_shadowLastChange==NULL) || (attmap_shadow_shadowLastChange[0]=='\0') )
+ if ((attmap_shadow_shadowLastChange == NULL) || (attmap_shadow_shadowLastChange[0] == '\0'))
return LDAP_LOCAL_ERROR; /* attribute not mapped at all */
- else if (strcmp(attmap_shadow_shadowLastChange,"\"${shadowLastChange:--1}\"")==0)
- attr="shadowLastChange";
- else if (attmap_shadow_shadowLastChange[0]=='\"')
+ else if (strcmp(attmap_shadow_shadowLastChange, "\"${shadowLastChange:--1}\"") == 0)
+ attr = "shadowLastChange";
+ else if (attmap_shadow_shadowLastChange[0] == '\"')
return LDAP_LOCAL_ERROR; /* other expressions not supported for now */
else
- attr=attmap_shadow_shadowLastChange;
+ attr = attmap_shadow_shadowLastChange;
/* set up the attributes we need */
- attrs[0]=attmap_shadow_uid;
- attrs[1]=attr;
- attrs[2]=NULL;
+ attrs[0] = attmap_shadow_uid;
+ attrs[1] = attr;
+ attrs[2] = NULL;
/* find the entry to see if the attribute is present */
- search=myldap_search(session,userdn,LDAP_SCOPE_BASE,shadow_filter,attrs,&rc);
- if (search==NULL)
+ search = myldap_search(session, userdn, LDAP_SCOPE_BASE, shadow_filter, attrs, &rc);
+ if (search == NULL)
return rc;
- entry=myldap_get_entry(search,&rc);
- if (entry==NULL)
+ entry = myldap_get_entry(search, &rc);
+ if (entry == NULL)
return rc;
- values=myldap_get_values(entry,attr);
- if ((values==NULL)||(values[0]==NULL)||(values[0][0]=='\0'))
+ values = myldap_get_values(entry, attr);
+ if ((values == NULL) || (values[0] == NULL) || (values[0][0] == '\0'))
return LDAP_NO_SUCH_ATTRIBUTE;
/* build the value for the new attribute */
- if (strcasecmp(attr,"pwdLastSet")==0)
+ if (strcasecmp(attr, "pwdLastSet") == 0)
{
/* for AD we use another timestamp */
- if(mysnprintf(buffer,sizeof(buffer),"%ld000000000",((long int)time(NULL)/100L+(134774L*864L))))
+ if (mysnprintf(buffer, sizeof(buffer), "%ld000000000",
+ ((long int)time(NULL) / 100L + (134774L * 864L))))
return LDAP_LOCAL_ERROR;
}
else
{
/* time in days since Jan 1, 1970 */
- if(mysnprintf(buffer,sizeof(buffer),"%ld",((long int)(time(NULL)/(long int)(60*60*24)))))
+ if (mysnprintf(buffer, sizeof(buffer), "%ld",
+ ((long int)(time(NULL) / (long int)(60 * 60 * 24)))))
return LDAP_LOCAL_ERROR;
}
/* update the shadowLastChange attribute */
- strvals[0]=buffer;
- strvals[1]=NULL;
- mod.mod_op=LDAP_MOD_REPLACE;
- mod.mod_type=(char *)attr;
- mod.mod_values=strvals;
- mods[0]=&mod;
- mods[1]=NULL;
- rc=myldap_modify(session,userdn,mods);
- if (rc!=LDAP_SUCCESS)
- log_log(LOG_WARNING,"%s: %s: modification failed: %s",
- userdn,attr,ldap_err2string(rc));
+ strvals[0] = buffer;
+ strvals[1] = NULL;
+ mod.mod_op = LDAP_MOD_REPLACE;
+ mod.mod_type = (char *)attr;
+ mod.mod_values = strvals;
+ mods[0] = &mod;
+ mods[1] = NULL;
+ rc = myldap_modify(session, userdn, mods);
+ if (rc != LDAP_SUCCESS)
+ log_log(LOG_WARNING, "%s: %s: modification failed: %s",
+ userdn, attr, ldap_err2string(rc));
else
- log_log(LOG_DEBUG,"%s: %s: modification succeeded",
- userdn,attr);
+ log_log(LOG_DEBUG, "%s: %s: modification succeeded", userdn, attr);
return rc;
}
-static int write_shadow(TFILE *fp,MYLDAP_ENTRY *entry,const char *requser)
+static int write_shadow(TFILE *fp, MYLDAP_ENTRY *entry, const char *requser)
{
int32_t tmpint32;
const char **usernames;
@@ -291,88 +292,90 @@ static int write_shadow(TFILE *fp,MYLDAP_ENTRY *entry,const char *requser)
int i;
char passbuffer[64];
/* get username */
- usernames=myldap_get_values(entry,attmap_shadow_uid);
- if ((usernames==NULL)||(usernames[0]==NULL))
+ usernames = myldap_get_values(entry, attmap_shadow_uid);
+ if ((usernames == NULL) || (usernames[0] == NULL))
{
- log_log(LOG_WARNING,"%s: %s: missing",
- myldap_get_dn(entry),attmap_shadow_uid);
+ log_log(LOG_WARNING, "%s: %s: missing",
+ myldap_get_dn(entry), attmap_shadow_uid);
return 0;
}
/* get password */
- passwd=get_userpassword(entry,attmap_shadow_userPassword,passbuffer,sizeof(passbuffer));
- if (passwd==NULL)
- passwd=default_shadow_userPassword;
+ passwd = get_userpassword(entry, attmap_shadow_userPassword,
+ passbuffer, sizeof(passbuffer));
+ if (passwd == NULL)
+ passwd = default_shadow_userPassword;
/* get expiry properties */
- get_shadow_properties(entry,&lastchangedate,&mindays,&maxdays,&warndays,
- &inactdays,&expiredate,&flag);
+ get_shadow_properties(entry, &lastchangedate, &mindays, &maxdays, &warndays,
+ &inactdays, &expiredate, &flag);
/* write the entries */
- for (i=0;usernames[i]!=NULL;i++)
- if ((requser==NULL)||(STR_CMP(requser,usernames[i])==0))
+ for (i = 0; usernames[i] != NULL; i++)
+ if ((requser == NULL) || (STR_CMP(requser, usernames[i]) == 0))
{
- WRITE_INT32(fp,NSLCD_RESULT_BEGIN);
- WRITE_STRING(fp,usernames[i]);
- WRITE_STRING(fp,passwd);
- WRITE_INT32(fp,lastchangedate);
- WRITE_INT32(fp,mindays);
- WRITE_INT32(fp,maxdays);
- WRITE_INT32(fp,warndays);
- WRITE_INT32(fp,inactdays);
- WRITE_INT32(fp,expiredate);
- WRITE_INT32(fp,flag);
+ WRITE_INT32(fp, NSLCD_RESULT_BEGIN);
+ WRITE_STRING(fp, usernames[i]);
+ WRITE_STRING(fp, passwd);
+ WRITE_INT32(fp, lastchangedate);
+ WRITE_INT32(fp, mindays);
+ WRITE_INT32(fp, maxdays);
+ WRITE_INT32(fp, warndays);
+ WRITE_INT32(fp, inactdays);
+ WRITE_INT32(fp, expiredate);
+ WRITE_INT32(fp, flag);
}
return 0;
}
-MYLDAP_ENTRY *shadow_uid2entry(MYLDAP_SESSION *session,const char *username,int *rcp)
+MYLDAP_ENTRY *shadow_uid2entry(MYLDAP_SESSION *session, const char *username,
+ int *rcp)
{
- MYLDAP_SEARCH *search=NULL;
- MYLDAP_ENTRY *entry=NULL;
+ MYLDAP_SEARCH *search = NULL;
+ MYLDAP_ENTRY *entry = NULL;
const char *base;
char filter[4096];
int i;
/* if it isn't a valid username, just bail out now */
if (!isvalidname(username))
{
- if (rcp!=NULL)
- *rcp=LDAP_INVALID_SYNTAX;
+ if (rcp != NULL)
+ *rcp = LDAP_INVALID_SYNTAX;
return NULL;
}
/* we have to look up the entry */
- mkfilter_shadow_byname(username,filter,sizeof(filter));
- for (i=0;(i<NSS_LDAP_CONFIG_MAX_BASES)&&((base=shadow_bases[i])!=NULL);i++)
+ mkfilter_shadow_byname(username, filter, sizeof(filter));
+ for (i = 0; (i < NSS_LDAP_CONFIG_MAX_BASES) && ((base = shadow_bases[i]) != NULL); i++)
{
- search=myldap_search(session,base,shadow_scope,filter,shadow_attrs,rcp);
- if (search==NULL)
+ search = myldap_search(session, base, shadow_scope, filter, shadow_attrs, rcp);
+ if (search == NULL)
{
- if ((rcp!=NULL)&&(*rcp==LDAP_SUCCESS))
- *rcp=LDAP_NO_SUCH_OBJECT;
+ if ((rcp != NULL) && (*rcp == LDAP_SUCCESS))
+ *rcp = LDAP_NO_SUCH_OBJECT;
return NULL;
}
- entry=myldap_get_entry(search,rcp);
- if (entry!=NULL)
+ entry = myldap_get_entry(search, rcp);
+ if (entry != NULL)
return entry;
}
- if ((rcp!=NULL)&&(*rcp==LDAP_SUCCESS))
- *rcp=LDAP_NO_SUCH_OBJECT;
+ if ((rcp != NULL) && (*rcp == LDAP_SUCCESS))
+ *rcp = LDAP_NO_SUCH_OBJECT;
return NULL;
}
NSLCD_HANDLE(
- shadow,byname,
+ shadow, byname,
char name[256];
char filter[4096];
- READ_STRING(fp,name);
- log_setrequest("shadow=\"%s\"",name);,
+ READ_STRING(fp, name);
+ log_setrequest("shadow=\"%s\"", name);,
NSLCD_ACTION_SHADOW_BYNAME,
- mkfilter_shadow_byname(name,filter,sizeof(filter)),
- write_shadow(fp,entry,name)
+ mkfilter_shadow_byname(name, filter, sizeof(filter)),
+ write_shadow(fp, entry, name)
)
NSLCD_HANDLE(
- shadow,all,
+ shadow, all,
const char *filter;
log_setrequest("shadow(all)");,
NSLCD_ACTION_SHADOW_ALL,
- (filter=shadow_filter,0),
- write_shadow(fp,entry,NULL)
+ (filter = shadow_filter, 0),
+ write_shadow(fp, entry, NULL)
)