/* * fe_getauthname -- returns a pointer to dynamic space containing whatever * name the user has authenticated to the system * if there is an error, return the error message in PQerrormsg */ char * fe_getauthname(char *PQerrormsg) { const char *name = NULL; char *authn; MsgType authsvc; #ifdef WIN32 char username[128]; DWORD namesize = sizeof(username) - 1; #else char pwdbuf[BUFSIZ]; struct passwd pwdstr; struct passwd *pw = NULL; #endif authsvc = fe_getauthsvc(PQerrormsg); /* this just guards against broken DEFAULT_CLIENT_AUTHSVC, see above */ if (authsvc == 0) return NULL; /* leave original error message in place */ pglock_thread(); #ifdef KRB4 if (authsvc == STARTUP_KRB4_MSG) name = pg_krb4_authname(PQerrormsg); #endif #ifdef KRB5 if (authsvc == STARTUP_KRB5_MSG) name = pg_krb5_authname(PQerrormsg); #endif if (authsvc == STARTUP_MSG || (authsvc == STARTUP_KRB4_MSG && !name) || (authsvc == STARTUP_KRB5_MSG && !name)) { #ifdef WIN32 if (GetUserName(username, &namesize)) name = username; #else if (pqGetpwuid(geteuid(), &pwdstr, pwdbuf, sizeof(pwdbuf), &pw) == 0) name = pw->pw_name; #endif } if (authsvc != STARTUP_MSG && authsvc != STARTUP_KRB4_MSG && authsvc != STARTUP_KRB5_MSG) snprintf(PQerrormsg, PQERRORMSG_LENGTH, libpq_gettext("fe_getauthname: invalid authentication system: %d\n"), authsvc); authn = name ? strdup(name) : NULL; pgunlock_thread(); return authn; }
/* * pg_fe_getauthname -- returns a pointer to dynamic space containing whatever * name the user has authenticated to the system * * if there is an error, return NULL with an error message in PQerrormsg */ char * pg_fe_getauthname(char *PQerrormsg) { #ifdef KRB5 const char *krb5_name = NULL; #endif const char *name = NULL; char *authn; #ifdef WIN32 char username[128]; DWORD namesize = sizeof(username) - 1; #else char pwdbuf[BUFSIZ]; struct passwd pwdstr; struct passwd *pw = NULL; #endif /* * pglock_thread() really only needs to be called around * pg_krb5_authname(), but some users are using configure * --enable-thread-safety-force, so we might as well do the locking within * our library to protect pqGetpwuid(). In fact, application developers * can use getpwuid() in their application if they use the locking call we * provide, or install their own locking function using * PQregisterThreadLock(). */ pglock_thread(); #ifdef KRB5 /* pg_krb5_authname gives us a strdup'd value that we need * to free later, however, we don't want to free 'name' directly * in case it's *not* a Kerberos login and we fall through to * name = pw->pw_name; */ krb5_name = pg_krb5_authname(PQerrormsg); name = krb5_name; #endif if (!name) { #ifdef WIN32 if (GetUserName(username, &namesize)) name = username; #else if (pqGetpwuid(geteuid(), &pwdstr, pwdbuf, sizeof(pwdbuf), &pw) == 0) name = pw->pw_name; #endif } authn = name ? strdup(name) : NULL; #ifdef KRB5 /* Free the strdup'd string from pg_krb5_authname, if we got one */ if (krb5_name) free(krb5_name); #endif pgunlock_thread(); return authn; }