diff options
author | Andy Adamson <andros@netapp.com> | 2015-09-23 11:00:56 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2015-09-23 17:12:44 -0400 |
commit | cbe19a1d34d4d13f41337047da26ec1ef82ed44c (patch) | |
tree | f4b4333f60d386bbafde9658df80d184890e753f /utils/gssd/gssd_proc.c | |
parent | 1201d5d8aeb0651a6fe195bc8232128ddf6e8b28 (diff) | |
download | nfs-utils-cbe19a1d34d4d13f41337047da26ec1ef82ed44c.tar.gz nfs-utils-cbe19a1d34d4d13f41337047da26ec1ef82ed44c.tar.xz nfs-utils-cbe19a1d34d4d13f41337047da26ec1ef82ed44c.zip |
GSSD: move process_krb5_updcall non machine cred case to helper function
Signed-off-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Jeff Layton <jlayton@poochiereds.net>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/gssd/gssd_proc.c')
-rw-r--r-- | utils/gssd/gssd_proc.c | 77 |
1 files changed, 50 insertions, 27 deletions
diff --git a/utils/gssd/gssd_proc.c b/utils/gssd/gssd_proc.c index f071bb6..36aff5d 100644 --- a/utils/gssd/gssd_proc.c +++ b/utils/gssd/gssd_proc.c @@ -483,6 +483,52 @@ change_identity(uid_t uid) } AUTH * +krb5_not_machine_creds(struct clnt_info *clp, uid_t uid, char *tgtname, + int *downcall_err, int *chg_err, CLIENT **rpc_clnt) +{ + AUTH *auth = NULL; + gss_cred_id_t gss_cred; + char **dname; + int err, resp = -1; + + printerr(1, "krb5_not_machine_creds: uid %d tgtname %s\n", + uid, tgtname); + + *chg_err = change_identity(uid); + if (*chg_err) { + printerr(0, "WARNING: failed to change identity: %s", + strerror(*chg_err)); + goto out; + } + + /** Tell krb5 gss which credentials cache to use. + * Try first to acquire credentials directly via GSSAPI + */ + err = gssd_acquire_user_cred(&gss_cred); + if (err == 0) + resp = create_auth_rpc_client(clp, tgtname, rpc_clnt, + &auth, uid, + AUTHTYPE_KRB5, gss_cred); + + /** if create_auth_rplc_client fails try the traditional + * method of trolling for credentials + */ + for (dname = ccachesearch; resp != 0 && *dname != NULL; dname++) { + err = gssd_setup_krb5_user_gss_ccache(uid, clp->servername, + *dname); + if (err == -EKEYEXPIRED) + *downcall_err = -EKEYEXPIRED; + else if (err == 0) + resp = create_auth_rpc_client(clp, tgtname, rpc_clnt, + &auth, uid,AUTHTYPE_KRB5, + GSS_C_NO_CREDENTIAL); + } + +out: + return auth; +} + +AUTH * krb5_use_machine_creds(struct clnt_info *clp, uid_t uid, char *tgtname, char *service, CLIENT **rpc_clnt) { @@ -555,10 +601,7 @@ process_krb5_upcall(struct clnt_info *clp, uid_t uid, int fd, char *tgtname, AUTH *auth = NULL; struct authgss_private_data pd; gss_buffer_desc token; - char **dirname; - int create_resp = -1; int err, downcall_err = -EACCES; - gss_cred_id_t gss_cred; OM_uint32 maj_stat, min_stat, lifetime_rec; pid_t pid; gss_name_t gacceptor = GSS_C_NO_NAME; @@ -618,32 +661,12 @@ process_krb5_upcall(struct clnt_info *clp, uid_t uid, int fd, char *tgtname, service ? service : "<null>"); if (uid != 0 || (uid == 0 && root_uses_machine_creds == 0 && service == NULL)) { - - err = change_identity(uid); - if (err) { - printerr(0, "WARNING: failed to change identity: %s", - strerror(err)); + auth = krb5_not_machine_creds(clp, uid, tgtname, &downcall_err, + &err, &rpc_clnt); + if (err) goto out_return_error; - } - - /* Tell krb5 gss which credentials cache to use */ - /* Try first to acquire credentials directly via GSSAPI */ - err = gssd_acquire_user_cred(&gss_cred); - if (!err) - create_resp = create_auth_rpc_client(clp, tgtname, &rpc_clnt, &auth, uid, - AUTHTYPE_KRB5, gss_cred); - /* if create_auth_rplc_client fails try the traditional method of - * trolling for credentials */ - for (dirname = ccachesearch; create_resp != 0 && *dirname != NULL; dirname++) { - err = gssd_setup_krb5_user_gss_ccache(uid, clp->servername, *dirname); - if (err == -EKEYEXPIRED) - downcall_err = -EKEYEXPIRED; - else if (!err) - create_resp = create_auth_rpc_client(clp, tgtname, &rpc_clnt, &auth, uid, - AUTHTYPE_KRB5, GSS_C_NO_CREDENTIAL); - } } - if (create_resp != 0) { + if (auth == NULL) { if (uid == 0 && (root_uses_machine_creds == 1 || service != NULL)) { auth = krb5_use_machine_creds(clp, uid, tgtname, |