1- From 43096cf9813d6def1d1f8f1d8a0c122466c8c06b Mon Sep 17 00:00:00 2001
2- From: Liuqu <chenchen.qcc@alibaba-inc .com>
3- Date: Mon, 9 Oct 2017 02:44:37 -0700
4- Subject: [PATCH] Modify user map profile
1+ From 93f39fa62f3f9dc54012ab8668fe48a4b313c7a0 Mon Sep 17 00:00:00 2001
2+ From: "david.zagury" <davidza@nvidia .com>
3+ Date: Tue, 13 May 2025 19:25:09 +0300
4+ Subject: [PATCH] [PATCH] Modify user map profile
55
66* Removed dependence from libtacplus_map and libaudit
77* Removed NSS entry point for getpwuid()
@@ -18,9 +18,9 @@ Subject: [PATCH] Modify user map profile
1818 debian/changelog | 11 +
1919 debian/control | 11 +-
2020 debian/libnss-tacplus.symbols | 1 -
21- nss_tacplus.c | 1015 +++++++++++++++------------------
21+ nss_tacplus.c | 1022 +++++++++++++++------------------
2222 tacplus_nss.conf | 91 ++-
23- 8 files changed, 525 insertions(+), 612 deletions(-)
23+ 8 files changed, 532 insertions(+), 612 deletions(-)
2424
2525diff --git a/Makefile.am b/Makefile.am
2626index 293951e..b33c455 100644
@@ -124,7 +124,7 @@ index 2bf9b88..f476e7d 100644
124124 _nss_tacplus_getpwnam_r@Base 1.0.1
125125- _nss_tacplus_getpwuid_r@Base 1.0.1
126126diff --git a/nss_tacplus.c b/nss_tacplus.c
127- index 79e62b9..ecfa0b0 100644
127+ index 79e62b9..ff4f492 100644
128128--- a/nss_tacplus.c
129129+++ b/nss_tacplus.c
130130@@ -1,7 +1,9 @@
@@ -180,7 +180,7 @@ index 79e62b9..ecfa0b0 100644
180180
181181 /*
182182 * pwbuf is used to reduce number of arguments passed around; the strings in
183- @@ -63,255 +59,245 @@ struct pwbuf {
183+ @@ -63,255 +59,244 @@ struct pwbuf {
184184 typedef struct {
185185 struct addrinfo *addr;
186186 char *key;
@@ -437,8 +437,11 @@ index 79e62b9..ecfa0b0 100644
437437+ syslog(LOG_ERR, "%s: invalid server: %s (getaddrinfo: %s)",
438438+ nssname, srv, gai_strerror(rv));
439439+ return -1;
440- + }
441- + }
440+ }
441+ }
442+ - else {
443+ - syslog(LOG_WARNING, "%s: maximum number of servers (%d) "
444+ - "exceeded, skipping", nssname, TAC_PLUS_MAXSERVERS);
442445+ else if(!strncmp(token, "secret=", 7)) {
443446+ if(tac_srv[tac_srv_no].key)
444447+ free(tac_srv[tac_srv_no].key);
@@ -458,11 +461,15 @@ index 79e62b9..ecfa0b0 100644
458461+ * for a long time*/
459462+ if(tac_srv[tac_srv_no].timeout > 5)
460463+ tac_srv[tac_srv_no].timeout = 5;
461- + }
462- + }
464+ }
465+ }
466+ - else if(debug) /* ignore unrecognized lines, unless debug on */
467+ - syslog(LOG_WARNING, "%s: unrecognized parameter: %s",
468+ - nssname, lbuf);
463469+ token = strsep(&srv_buf, delim);
464- + }
465- +
470+ }
471+ - fclose(conf);
472+
466473+ return 0;
467474+ }
468475+
@@ -486,11 +493,8 @@ index 79e62b9..ecfa0b0 100644
486493+ priv = 0;
487494+ syslog(LOG_WARNING, "%s: user_priv %d out of range",
488495+ nssname, priv);
489- }
490- }
491- - else {
492- - syslog(LOG_WARNING, "%s: maximum number of servers (%d) "
493- - "exceeded, skipping", nssname, TAC_PLUS_MAXSERVERS);
496+ + }
497+ + }
494498+ else if(!strncmp(token, "pw_info=", 8)) {
495499+ if(!info)
496500+ info = strdup(token + 8);
@@ -505,15 +509,11 @@ index 79e62b9..ecfa0b0 100644
505509+ else if(!strncmp(token, "shell=", 6)) {
506510+ if(!shell)
507511+ shell = strdup(token + 6);
508- }
509- }
510- - else if(debug) /* ignore unrecognized lines, unless debug on */
511- - syslog(LOG_WARNING, "%s: unrecognized parameter: %s",
512- - nssname, lbuf);
512+ + }
513+ + }
513514+ token = strsep(&buf, delim);
514- }
515- - fclose(conf);
516-
515+ + }
516+ +
517517+ if(priv && gid && info && group && shell) {
518518+ useradd_info_t *user = &useradd_grp_list[priv];
519519+ if(user->info)
@@ -588,7 +588,6 @@ index 79e62b9..ecfa0b0 100644
588588+ FILE *fp;
589589+ char buf[512] = {0};
590590+
591- + init_useradd_info();
592591+ fp = fopen(file, "r");
593592+ if(!fp) {
594593+ syslog(LOG_ERR, "%s: %s fopen failed", nssname, file);
@@ -647,7 +646,7 @@ index 79e62b9..ecfa0b0 100644
647646 }
648647
649648 /*
650- @@ -324,15 +304 ,13 @@ static void print_servers(void)
649+ @@ -324,15 +309 ,13 @@ static void print_servers(void)
651650 */
652651 static int
653652 pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,
@@ -667,7 +666,7 @@ index 79e62b9..ecfa0b0 100644
667666
668667 needlen = usename ? strlen(usename) + 1 : 1 +
669668 srcpw->pw_dir ? strlen(srcpw->pw_dir) + 1 : 1 +
670- @@ -341,8 +319 ,8 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,
669+ @@ -341,8 +324 ,8 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,
671670 srcpw->pw_passwd ? strlen(srcpw->pw_passwd) + 1 : 1;
672671 if(needlen > len) {
673672 if(debug)
@@ -678,7 +677,7 @@ index 79e62b9..ecfa0b0 100644
678677 return 1;
679678 }
680679
681- @@ -354,21 +332 ,14 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,
680+ @@ -354,21 +337 ,14 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,
682681 cnt++; /* allow for null byte also */
683682 buf += cnt;
684683 len -= cnt;
@@ -702,7 +701,7 @@ index 79e62b9..ecfa0b0 100644
702701 cnt++;
703702 buf += cnt;
704703 len -= cnt;
705- @@ -377,148 +348 ,227 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,
704+ @@ -377,148 +353 ,227 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,
706705 cnt++;
707706 buf += cnt;
708707 len -= cnt;
@@ -875,8 +874,7 @@ index 79e62b9..ecfa0b0 100644
875874+ syslog(LOG_ERR, "%s: %s fopen failed", nssname, user_conf);
876875+ return -1;
877876+ }
878-
879- - if(!tacuser) {
877+ +
880878+ while(fgets(buf, sizeof buf, fp)) {
881879+ if('#' == *buf || isspace(*buf))
882880+ continue;
@@ -888,7 +886,8 @@ index 79e62b9..ecfa0b0 100644
888886+ break;
889887+ }
890888+ }
891- +
889+
890+ - if(!tacuser) {
892891+ /*
893892+ * If user is found in user_conf, it means that getpwnam is called by
894893+ * useradd in this NSS module.
@@ -911,7 +910,7 @@ index 79e62b9..ecfa0b0 100644
911910+ syslog(LOG_ERR, "%s: %s write local user failed", nssname, name);
912911+ fclose(fp);
913912+ return -1;
914- + }
913+ }
915914+ fclose(fp);
916915+
917916+ lvl = level;
@@ -937,7 +936,13 @@ index 79e62b9..ecfa0b0 100644
937936+
938937+ return -1;
939938+ }
940- +
939+
940+ - pb->pw->pw_name = NULL; /* be paranoid */
941+ - for(ret = 1; ret && (ent = fgetpwent(pwfile)); ) {
942+ - if(!ent->pw_name)
943+ - continue; /* shouldn't happen */
944+ - if(!strcmp(ent->pw_name, tacuser)) {
945+ - ret = pwcopy(pb->buf, pb->buflen, ent, pb->pw, logname, usetachome);
941946+ /*
942947+ * Lookup user in /etc/passwd, and fill up passwd info if found.
943948+ */
@@ -950,14 +955,8 @@ index 79e62b9..ecfa0b0 100644
950955+ if(!username) {
951956+ syslog(LOG_ERR, "%s: username invalid in check passwd", nssname);
952957+ return -1;
953- }
954-
955- - pb->pw->pw_name = NULL; /* be paranoid */
956- - for(ret = 1; ret && (ent = fgetpwent(pwfile)); ) {
957- - if(!ent->pw_name)
958- - continue; /* shouldn't happen */
959- - if(!strcmp(ent->pw_name, tacuser)) {
960- - ret = pwcopy(pb->buf, pb->buflen, ent, pb->pw, logname, usetachome);
958+ + }
959+ +
961960+ fp = fopen("/etc/passwd", "r");
962961+ if(!fp) {
963962+ syslog(LOG_ERR, "%s: /etc/passwd fopen failed", nssname);
@@ -1041,15 +1040,15 @@ index 79e62b9..ecfa0b0 100644
10411040
10421041 return ret;
10431042 }
1044- @@ -532,6 +582 ,7 @@ static int
1043+ @@ -532,6 +587 ,7 @@ static int
10451044 got_tacacs_user(struct tac_attrib *attr, struct pwbuf *pb)
10461045 {
10471046 unsigned long priv_level = 0;
10481047+ int ret;
10491048
10501049 while(attr != NULL) {
10511050 /* we are looking for the privilege attribute, can be in several forms,
1052- @@ -550,14 +601 ,20 @@ got_tacacs_user(struct tac_attrib *attr, struct pwbuf *pb)
1051+ @@ -550,14 +606 ,20 @@ got_tacacs_user(struct tac_attrib *attr, struct pwbuf *pb)
10531052 /* if this fails, we leave priv_level at 0, which is
10541053 * least privileged, so that's OK, but at least report it
10551054 */
@@ -1074,7 +1073,7 @@ index 79e62b9..ecfa0b0 100644
10741073 }
10751074
10761075 /*
1077- @@ -570,9 +627 ,13 @@ connect_tacacs(struct tac_attrib **attr, int srvr)
1076+ @@ -570,9 +632 ,13 @@ connect_tacacs(struct tac_attrib **attr, int srvr)
10781077 {
10791078 int fd;
10801079
@@ -1089,7 +1088,7 @@ index 79e62b9..ecfa0b0 100644
10891088 tac_add_attrib(attr, "service", tac_service);
10901089 if(tac_protocol[0])
10911090 tac_add_attrib(attr, "protocol", tac_protocol);
1092- @@ -598,52 +659 ,25 @@ lookup_tacacs_user(struct pwbuf *pb)
1091+ @@ -598,52 +664 ,25 @@ lookup_tacacs_user(struct pwbuf *pb)
10931092 {
10941093 struct areply arep;
10951094 int ret = 1, done = 0;
@@ -1149,7 +1148,7 @@ index 79e62b9..ecfa0b0 100644
11491148 tac_ntop(tac_srv[srvr].addr->ai_addr) : "unknown", ret,
11501149 pb->name);
11511150 }
1152- @@ -668,14 +702 ,11 @@ lookup_tacacs_user(struct pwbuf *pb)
1151+ @@ -668,14 +707 ,11 @@ lookup_tacacs_user(struct pwbuf *pb)
11531152 if(arep.status == AUTHOR_STATUS_PASS_ADD ||
11541153 arep.status == AUTHOR_STATUS_PASS_REPL) {
11551154 ret = got_tacacs_user(arep.attr, pb);
@@ -1166,7 +1165,7 @@ index 79e62b9..ecfa0b0 100644
11661165 done = 1; /* break out of loop after arep cleanup */
11671166 }
11681167 else {
1169- @@ -685,6 +716 ,10 @@ lookup_tacacs_user(struct pwbuf *pb)
1168+ @@ -685,6 +721 ,10 @@ lookup_tacacs_user(struct pwbuf *pb)
11701169 " invalid (%d)", nssname,
11711170 tac_ntop(tac_srv[srvr].addr->ai_addr), pb->name,
11721171 arep.status);
@@ -1177,7 +1176,7 @@ index 79e62b9..ecfa0b0 100644
11771176 }
11781177 if(arep.msg)
11791178 free(arep.msg);
1180- @@ -692,30 +727 ,12 @@ lookup_tacacs_user(struct pwbuf *pb)
1179+ @@ -692,30 +732 ,12 @@ lookup_tacacs_user(struct pwbuf *pb)
11811180 tac_free_attrib(&arep.attr);
11821181 }
11831182
@@ -1210,7 +1209,7 @@ index 79e62b9..ecfa0b0 100644
12101209 *
12111210 * We try the lookup to the tacacs server first. If we can't make a
12121211 * connection to the server for some reason, we also try looking up
1213- @@ -730,20 +747,25 @@ enum nss_status _nss_tacplus_getpwnam_r(const char *name, struct passwd *pw,
1212+ @@ -730,20 +752,26 @@ enum nss_status _nss_tacplus_getpwnam_r(const char *name, struct passwd *pw,
12141213 int result;
12151214 struct pwbuf pbuf;
12161215
@@ -1225,6 +1224,7 @@ index 79e62b9..ecfa0b0 100644
12251224+ return NSS_STATUS_NOTFOUND;
12261225
12271226- get_remote_addr();
1227+ + init_useradd_info();
12281228+ result = parse_config(config_file);
12291229
12301230- if(result) { /* no config file, no servers, etc. */
@@ -1245,7 +1245,7 @@ index 79e62b9..ecfa0b0 100644
12451245 /* marshal the args for the lower level functions */
12461246 pbuf.name = (char *)name;
12471247 pbuf.pw = pw;
1248- @@ -751,126 +773,13 @@ enum nss_status _nss_tacplus_getpwnam_r(const char *name, struct passwd *pw,
1248+ @@ -751,126 +779,14 @@ enum nss_status _nss_tacplus_getpwnam_r(const char *name, struct passwd *pw,
12491249 pbuf.buflen = buflen;
12501250 pbuf.errnop = errnop;
12511251
@@ -1346,6 +1346,7 @@ index 79e62b9..ecfa0b0 100644
13461346- else if((auid != (uid_t)-1 || session != ~0U) &&
13471347- !lookup_mapped_uid(&pb, uid, (uid_t)-1, ~0))
13481348- status = NSS_STATUS_SUCCESS;
1349+ + free_useradd_info();
13491350 return status;
13501351 }
13511352-
@@ -1479,4 +1480,5 @@ index bb4eb1e..7cb756f 100644
14791480+ # Default: many_to_one=n
14801481+ # many_to_one=y
14811482- -
1482- 2.7.4
1483+ 2.49.0
1484+
0 commit comments