123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- #define __FORCE_GLIBC__
- #include <features.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <string.h>
- #include <rpc/types.h>
- #include <rpc/xdr.h>
- #include <rpc/auth.h>
- #include <rpc/auth_unix.h>
- static void authunix_nextverf();
- static bool_t authunix_marshal();
- static bool_t authunix_validate();
- static bool_t authunix_refresh();
- static void authunix_destroy();
- static struct auth_ops auth_unix_ops = {
- authunix_nextverf,
- authunix_marshal,
- authunix_validate,
- authunix_refresh,
- authunix_destroy
- };
- struct audata {
- struct opaque_auth au_origcred;
- struct opaque_auth au_shcred;
- u_long au_shfaults;
- char au_marshed[MAX_AUTH_BYTES];
- u_int au_mpos;
- };
- #define AUTH_PRIVATE(auth) ((struct audata *)auth->ah_private)
- static void marshal_new_auth();
- AUTH *authunix_create __P ((char *machname, uid_t uid,
- gid_t gid, int len,
- gid_t *aup_gids))
- {
- struct authunix_parms aup;
- char mymem[MAX_AUTH_BYTES];
- struct timeval now;
- XDR xdrs;
- register AUTH *auth;
- register struct audata *au;
-
- auth = (AUTH *) mem_alloc(sizeof(*auth));
- #ifndef KERNEL
- if (auth == NULL) {
- (void) fprintf(stderr, "authunix_create: out of memory\n");
- return (NULL);
- }
- #endif
- au = (struct audata *) mem_alloc(sizeof(*au));
- #ifndef KERNEL
- if (au == NULL) {
- (void) fprintf(stderr, "authunix_create: out of memory\n");
- return (NULL);
- }
- #endif
- auth->ah_ops = &auth_unix_ops;
- auth->ah_private = (caddr_t) au;
- auth->ah_verf = au->au_shcred = _null_auth;
- au->au_shfaults = 0;
-
- (void) gettimeofday(&now, (struct timezone *) 0);
- aup.aup_time = now.tv_sec;
- aup.aup_machname = machname;
- aup.aup_uid = uid;
- aup.aup_gid = gid;
- aup.aup_len = (u_int) len;
- aup.aup_gids = aup_gids;
-
- xdrmem_create(&xdrs, mymem, MAX_AUTH_BYTES, XDR_ENCODE);
- if (!xdr_authunix_parms(&xdrs, &aup))
- abort();
- au->au_origcred.oa_length = len = XDR_GETPOS(&xdrs);
- au->au_origcred.oa_flavor = AUTH_UNIX;
- #ifdef KERNEL
- au->au_origcred.oa_base = mem_alloc((u_int) len);
- #else
- if ((au->au_origcred.oa_base = mem_alloc((u_int) len)) == NULL) {
- (void) fprintf(stderr, "authunix_create: out of memory\n");
- return (NULL);
- }
- #endif
- bcopy(mymem, au->au_origcred.oa_base, (u_int) len);
-
- auth->ah_cred = au->au_origcred;
- marshal_new_auth(auth);
- return (auth);
- }
- AUTH *authunix_create_default()
- {
- register int len;
- char machname[MAX_MACHINE_NAME + 1];
- register int uid;
- register int gid;
- int gids[NGRPS];
- if (gethostname(machname, MAX_MACHINE_NAME) == -1)
- abort();
- machname[MAX_MACHINE_NAME] = 0;
- uid = geteuid();
- gid = getegid();
- if ((len = getgroups(NGRPS, gids)) < 0)
- abort();
- return (authunix_create(machname, uid, gid, len, gids));
- }
- static void authunix_nextverf(auth)
- AUTH *auth;
- {
-
- }
- static bool_t authunix_marshal(auth, xdrs)
- AUTH *auth;
- XDR *xdrs;
- {
- register struct audata *au = AUTH_PRIVATE(auth);
- return (XDR_PUTBYTES(xdrs, au->au_marshed, au->au_mpos));
- }
- static bool_t authunix_validate(auth, verf)
- register AUTH *auth;
- struct opaque_auth verf;
- {
- register struct audata *au;
- XDR xdrs;
- if (verf.oa_flavor == AUTH_SHORT) {
- au = AUTH_PRIVATE(auth);
- xdrmem_create(&xdrs, verf.oa_base, verf.oa_length, XDR_DECODE);
- if (au->au_shcred.oa_base != NULL) {
- mem_free(au->au_shcred.oa_base, au->au_shcred.oa_length);
- au->au_shcred.oa_base = NULL;
- }
- if (xdr_opaque_auth(&xdrs, &au->au_shcred)) {
- auth->ah_cred = au->au_shcred;
- } else {
- xdrs.x_op = XDR_FREE;
- (void) xdr_opaque_auth(&xdrs, &au->au_shcred);
- au->au_shcred.oa_base = NULL;
- auth->ah_cred = au->au_origcred;
- }
- marshal_new_auth(auth);
- }
- return (TRUE);
- }
- static bool_t authunix_refresh(auth)
- register AUTH *auth;
- {
- register struct audata *au = AUTH_PRIVATE(auth);
- struct authunix_parms aup;
- struct timeval now;
- XDR xdrs;
- register int stat;
- if (auth->ah_cred.oa_base == au->au_origcred.oa_base) {
-
- return (FALSE);
- }
- au->au_shfaults++;
-
- aup.aup_machname = NULL;
- aup.aup_gids = (int *) NULL;
- xdrmem_create(&xdrs, au->au_origcred.oa_base,
- au->au_origcred.oa_length, XDR_DECODE);
- stat = xdr_authunix_parms(&xdrs, &aup);
- if (!stat)
- goto done;
-
- (void) gettimeofday(&now, (struct timezone *) 0);
- aup.aup_time = now.tv_sec;
- xdrs.x_op = XDR_ENCODE;
- XDR_SETPOS(&xdrs, 0);
- stat = xdr_authunix_parms(&xdrs, &aup);
- if (!stat)
- goto done;
- auth->ah_cred = au->au_origcred;
- marshal_new_auth(auth);
- done:
-
- xdrs.x_op = XDR_FREE;
- (void) xdr_authunix_parms(&xdrs, &aup);
- XDR_DESTROY(&xdrs);
- return (stat);
- }
- static void authunix_destroy(auth)
- register AUTH *auth;
- {
- register struct audata *au = AUTH_PRIVATE(auth);
- mem_free(au->au_origcred.oa_base, au->au_origcred.oa_length);
- if (au->au_shcred.oa_base != NULL)
- mem_free(au->au_shcred.oa_base, au->au_shcred.oa_length);
- mem_free(auth->ah_private, sizeof(struct audata));
- if (auth->ah_verf.oa_base != NULL)
- mem_free(auth->ah_verf.oa_base, auth->ah_verf.oa_length);
- mem_free((caddr_t) auth, sizeof(*auth));
- }
- static void marshal_new_auth(auth)
- register AUTH *auth;
- {
- XDR xdr_stream;
- register XDR *xdrs = &xdr_stream;
- register struct audata *au = AUTH_PRIVATE(auth);
- xdrmem_create(xdrs, au->au_marshed, MAX_AUTH_BYTES, XDR_ENCODE);
- if ((!xdr_opaque_auth(xdrs, &(auth->ah_cred))) ||
- (!xdr_opaque_auth(xdrs, &(auth->ah_verf)))) {
- perror("auth_none.c - Fatal marshalling problem");
- } else {
- au->au_mpos = XDR_GETPOS(xdrs);
- }
- XDR_DESTROY(xdrs);
- }
|