服务器端的 DES 认证
以下示例说明了服务器端的 DES 认证。 服务器端比客户端简单。 此示例使用 AUTH_DES 而不是 AUTH_UNIX:
#include <sys/time.h>
#include <rpc/auth_des.h>
...
...
nuser(rqstp, transp)
struct svc_req *rqstp;
SVCXPRT *transp;
{
struct authdes_cred *des_cred;
int uid;
int gid;
int gidlen;
int gidlist[10];
/*
* we don't care about authentication for null proc
*/
if (rqstp->rq_proc == NULLPROC) {
/* same as before */
}
/*
* now get the uid
*/
switch (rqstp->rq_cred.oa_flavor) {
case AUTH_DES:
des_cred =
(struct authdes_cred *) rqstp->rq_clntcred;
if (! netname2user(des_cred->adc_fullname.name,
&uid, &gid, &gidlen, gidlist))
{
fprintf(stderr, "unknown user: %s\n",
des_cred->adc_fullname.name);
svcerr_systemerr(transp);
return;
}
break;
case AUTH_NULL:
default:
svcerr_weakauth(transp);
return;
}
/*
* The rest is the same as UNIX-style authentication
*/
switch (rqstp->rq_proc) {
case RUSERSPROC_NUM:
/*
* make sure caller is allowed to call this proc
*/
if (uid == 16) {
svcerr_systemerr(transp);
return;
}
/*
* Code here to compute the number of users
* and assign it to the variable nusers
*/
if (!svc_sendreply(transp, xdr_u_long, &nusers)) {
fprintf(stderr, "can't reply to RPC call\n");
return (1);
}
return;
default:
svcerr_noproc(transp);
return;
}
}
注: netname2user 例程 (与 user2netname 例程相反) 将网络标识转换为用户标识。 netname2user 例程还提供组标识,这些标识在此示例中未使用,但在其他程序中可能有用。