diff options
Diffstat (limited to 'nslcd/db_passwd.c')
-rw-r--r-- | nslcd/db_passwd.c | 125 |
1 files changed, 68 insertions, 57 deletions
diff --git a/nslcd/db_passwd.c b/nslcd/db_passwd.c index ed57098..5696aaf 100644 --- a/nslcd/db_passwd.c +++ b/nslcd/db_passwd.c @@ -67,104 +67,115 @@ static int write_passwd(TFILE *fp, struct passwd *entry, uid_t calleruid) if ((passwd == NULL) || (calleruid != 0)) passwd = "!"; } - if (entry->pw_uid >= nslcd_cfg->nss_min_uid) - { - WRITE_INT32(fp, NSLCD_RESULT_BEGIN); - WRITE_STRING(fp, entry->pw_name ); - WRITE_STRING(fp, passwd ); - WRITE_INT32( fp, entry->pw_uid ); - WRITE_INT32( fp, entry->pw_gid ); - WRITE_STRING(fp, entry->pw_gecos); - WRITE_STRING(fp, entry->pw_dir ); - WRITE_STRING(fp, entry->pw_shell); - } + WRITE_STRING(fp, entry->pw_name ); + WRITE_STRING(fp, passwd ); + WRITE_INT32( fp, entry->pw_uid ); + WRITE_INT32( fp, entry->pw_gid ); + WRITE_STRING(fp, entry->pw_gecos); + WRITE_STRING(fp, entry->pw_dir ); + WRITE_STRING(fp, entry->pw_shell); return 0; } NSLCD_HANDLE_UID(PASSWD, BYNAME - ,/* decls */ - char name[BUFLEN_NAME]; - ,/* int read(TFILE *fp) */ - READ_STRING(fp, name); - log_setrequest("passwd=\"%s\"", name); + ,/* request data */ + struct { + char name[BUFLEN_NAME]; + } + ,/* search data */ + struct { int cnt; } + ,/* entry type */ + struct passwd + ,/* int read(TFILE *fp, *req) */ + READ_STRING(fp, req->name); + log_setrequest("passwd=\"%s\"", req->name); return 0; - ,/* check */ - if (!isvalidname(name)) + ,/* check(*req) */ + if (!isvalidname(req->name)) { log_log(LOG_WARNING, "request denied by validnames option"); return -1; } nsswitch_check_reload(); - ,/* tentry *search(struct session *session, int *rcp, bool *more) */ - struct passwd, - *more = false; + return 0; + ,/* search(*session, *req, *searchdat, *entry) */ + *entry = NULL; + if (searchdat->cnt++ != 0) + return 0; for (size_t i = 0; i < session->cnt; i++) { if (session->users[i].pw_uid != UID_INVALID && - STR_CMP(name, session->users[i].pw_name)==0) { - *rcp = 0; - return &(session->users[i]); + STR_CMP(req->name, session->users[i].pw_name)==0) { + *entry = &(session->users[i]); + if ((*entry)->pw_uid < nslcd_cfg->nss_min_uid) { + *entry = NULL; + return -1; + } + break; } } - return NULL; + return 0; ,/* int write(TFILE *fp, tentry *entry) */ return write_passwd(fp, entry, calleruid); ,/* cleanup */ ) NSLCD_HANDLE_UID(PASSWD, BYUID - ,/* decls */ - uid_t uid; + ,/* request data */ + struct { uid_t uid; } + ,/* search data */ + struct { int cnt; } + ,/* entry type */ + struct passwd ,/* int read(TFILe *fp) */ - READ_INT32(fp, uid); - log_setrequest("passwd=%lu", (unsigned long int)uid); + READ_INT32(fp, req->uid); + log_setrequest("passwd=%lu", (unsigned long int)(req->uid)); return 0; ,/* check */ - if (uid < nslcd_cfg->nss_min_uid) - { - /* return an empty result */ - WRITE_INT32(_handle_fp, NSLCD_VERSION); - WRITE_INT32(_handle_fp, NSLCD_ACTION_PASSWD_BYUID); - WRITE_INT32(_handle_fp, NSLCD_RESULT_END); - return 0; - } nsswitch_check_reload(); - ,/* tentry *search(struct session *session, int *rcp, bool *more) */ - struct passwd, - *more = false; + return 0; + ,/* search(*session, *req, *searchdat, *entry) */ + *entry = NULL; + if (req->uid < nslcd_cfg->nss_min_uid || searchdat->cnt++ != 0) + return 0; for (size_t i = 0; i < session->cnt; i++) { - if (uid == session->users[i].pw_uid) { - *rcp = 0; - return &(session->users[i]); + if (req->uid == session->users[i].pw_uid) { + *entry = &(session->users[i]); + break; } } - return NULL; - ,/* int write(TFILe *fp, tentry *entry */ + return 0; + ,/* int write(TFILe *fp, *entry) */ return write_passwd(fp, entry, calleruid); ,/* cleanup */ ) NSLCD_HANDLE_UID(PASSWD, ALL - ,/* decls */ - ,/* int read(TFILE *fp) */ + ,/* request data */ + int + ,/* search data */ + struct { size_t i; } + ,/* entry type */ + struct passwd + ,/* int read(TFILE *fp, *req) */ log_setrequest("passwd(all)"); return 0; ,/* check */ nsswitch_check_reload(); - ,/* tentry *search(struct session *session, int *rcp, bool *more) */ - struct passwd, - static __thread size_t i = 0; - *more = true; - for (; i < session->cnt; i++) + return 0; + ,/* search(*session, *req, *searchdat, *entry) */ + *entry = NULL; + for (; searchdat->i < session->cnt; searchdat->i++) { - if (session->users[i].pw_uid != UID_INVALID) { - *rcp = 0; - return &(session->users[i]); + if (session->users[searchdat->i].pw_uid != UID_INVALID && + session->users[searchdat->i].pw_uid >= nslcd_cfg->nss_min_uid) { + *entry = &(session->users[searchdat->i]); + searchdat->i++; + return 0; } } - i = 0; - return NULL; + return 0; ,/* int write(TFILE *fp, tentry *entry) */ return write_passwd(fp, entry, calleruid); ,/* cleanup */ |