Servern måste kunna hämta klientens referenser. Med funktionen rpc_gss_getcred(), vilken visas i Exempel 8-5, kan servern hämta antingen UNIX-referenser eller RPCSEC_GSS-referenser (eller både och). Den gör det via två argument som anges om funktionen lyckas. Ett av argumenten är en pekare till en rpc_gss_ucred_t-struktur, som innehåller anroparens UNIX-referenser, om det finns sådana:
typedef struct { uid_t uid; /* användar-ID */ gid_t gid; /* grupp-ID */ short gidlen; git_t *gidlist; /* lista över grupper */ } rpc_gss_ucred_t;
Det andra argumentet är en pekare till en rpc_gss_raw_cred_t-struktur, som ser ut så här:
typedef struct { u_int version; /* programversion för RPCSEC_GSS */ char *mekanism; char *qop; rpc_gss_principal_t client_principal; /* principalnamn för klienten */ char *svc_principal; /* principalnamn för servern */ rpc_gss_service_t tjänst; /* privacy, integrity enum */ } rpc_gss_rawcred_t;(I "Skapa principalnamn för klienter" finns en beskrivning av strukturen rpc_gss_principal_t och hur den skapas.) Eftersom rpc_gss_rawcred_t innehåller både klientens och serverns principalnamn kan rpc_gss_getcred() returnera båda.
Exempel 8-5 är ett exempel på en enkel klareringsprocedur på servern, där servern tar emot referenserna för anroparen. Proceduren hämtar anroparens UNIX-referenser och verifierar sedan användarens identitet med hjälp av mekanismen, QOP:en och tjänstetypen i argumentet rpc_gss_rcred_t.
static void server_prog(struct svc_req *rqstp, SVCXPRT *xprt) { rpc_gss_ucred_t *ucred; rpc_gss_rawcred_t *rcred; if (rqst->rq_proq == NULLPROC) { svc_sendreply(xprt, xdr_void, NULL); return; } /* * verifiera alla andra förfrågningar */ switch (rqstp->rq_cred.oa_flavor) { case RPCSEC_GSS: /* * hämta referensinformation */ rpc_gss_getcred(rqstp, &rcred, &ucred, NULL); /* * verifiera att användaren får ansluta * med hjälp av mottagna säkerhetsparametrar * från min konfigurationsfil */ if (!authenticate_user(ucred->uid, rcred->mechanism, rcred->qop, rcred->service)) { svcerr_weakauth(xprt); return; } break; /* tillåt användaren i */ default: svcerr_weakauth(xprt); return; } /* avsluta växel */ switch (rqstp->rq_proq) { case SERV_PROC1: . . . } /* vanlig behandling av förfrågan; skicka svar ... */ return; } |
Mer information finns i direkthjälpsavsnittet (man page) rpc_gss_getcred(3N).
I Exempel 8-5 är det sista argumentet för rpc_gss_getcred() (här ett NULL-värde) en användardefinierad cookie, vars returnerade värde kommer att vara det som angavs av servern när kontexten upprättades. Den här cookien, ett fyra byte stort värde, kan användas på valfritt sätt för programmet - RPC tolkar inte värdet. Cookien kan t ex vara en pekare eller ett index för en struktur som representerar den som upprättade kontexten. I stället för att det här värdet beräknas för varje förfrågan beräknas det vid den tidpunkt då kontexten upprättas (vilket minskar tiden som krävs för behandling av förfrågningar).