diff --git a/lib/krb5/get_default_principal.c b/lib/krb5/get_default_principal.c index 18c687ce4..3db42223c 100644 --- a/lib/krb5/get_default_principal.c +++ b/lib/krb5/get_default_principal.c @@ -40,37 +40,51 @@ RCSID("$Id$"); +static char * +get_logname(void) +{ + char *p; + if((p = getenv("USER"))) + return p; + if((p = getenv("LOGNAME"))) + return p; +#if defined(HAVE_GETLOGIN) && !defined(POSIX_GETLOGIN) + if((p = getlogin())) + return p; +#endif + return NULL; +} + krb5_error_code krb5_get_default_principal (krb5_context context, krb5_principal *princ) { krb5_error_code ret; + struct passwd *pw; char *p; + krb5_ccache id; - p = getenv ("USER"); - if (p) { - ret = krb5_parse_name (context, p, princ); - if (ret) - return ret; - } else { - struct passwd *pw; - char *realm; - - pw = getpwuid (getuid ()); - if (pw == NULL) - return ENOTTY; - ret = krb5_get_default_realm (context, &realm); - if (ret) - return ret; - ret = krb5_build_principal (context, - princ, - strlen(realm), - realm, - pw->pw_name, - NULL); - free (realm); - if (ret) - return ret; + ret = krb5_cc_default(context, &id); + if(ret == 0){ + ret = krb5_cc_get_principal(context, id, princ); + krb5_cc_close(context, id); + if(ret == 0) + return 0; } - return 0; + + pw = getpwuid(getuid()); + if(pw == NULL){ + p = get_logname(); + if(p == NULL) + return ENOTTY; + ret = krb5_make_principal(context, princ, NULL, p, NULL); + }else{ + if(strcmp(pw->pw_name, "root") == 0){ + p = get_logname(); + ret = krb5_make_principal(context, princ, NULL, pw->pw_name, + "root", NULL); + }else + ret = krb5_make_principal(context, princ, NULL, pw->pw_name, NULL); + } + return ret; }