diff options
Diffstat (limited to 'rpc/rpc-lib/src/auth-glusterfs.c')
| -rw-r--r-- | rpc/rpc-lib/src/auth-glusterfs.c | 216 | 
1 files changed, 123 insertions, 93 deletions
diff --git a/rpc/rpc-lib/src/auth-glusterfs.c b/rpc/rpc-lib/src/auth-glusterfs.c index 4faaddb9..9996bfad 100644 --- a/rpc/rpc-lib/src/auth-glusterfs.c +++ b/rpc/rpc-lib/src/auth-glusterfs.c @@ -29,94 +29,9 @@  #include "dict.h"  #include "xdr-rpc.h"  #include "xdr-common.h" +#include "rpc-common-xdr.h" -bool_t -xdr_auth_glusterfs_parms (XDR *xdrs, auth_glusterfs_parms *objp) -{ -	register int32_t *buf; - -	int i; - -	if (xdrs->x_op == XDR_ENCODE) { -		 if (!xdr_u_quad_t (xdrs, &objp->lk_owner)) -			 return FALSE; -		buf = XDR_INLINE (xdrs, (4 +  16 )* BYTES_PER_XDR_UNIT); -		if (buf == NULL) { -			 if (!xdr_u_int (xdrs, &objp->pid)) -				 return FALSE; -			 if (!xdr_u_int (xdrs, &objp->uid)) -				 return FALSE; -			 if (!xdr_u_int (xdrs, &objp->gid)) -				 return FALSE; -			 if (!xdr_u_int (xdrs, &objp->ngrps)) -				 return FALSE; -			 if (!xdr_vector (xdrs, (char *)objp->groups, 16, -				sizeof (u_int), (xdrproc_t) xdr_u_int)) -				 return FALSE; -		} else { -			IXDR_PUT_U_LONG(buf, objp->pid); -			IXDR_PUT_U_LONG(buf, objp->uid); -			IXDR_PUT_U_LONG(buf, objp->gid); -			IXDR_PUT_U_LONG(buf, objp->ngrps); -			{ -				register u_int *genp; - -				for (i = 0, genp = objp->groups; -					i < 16; ++i) { -					IXDR_PUT_U_LONG(buf, *genp++); -				} -			} -		} -		return TRUE; -	} else if (xdrs->x_op == XDR_DECODE) { -		 if (!xdr_u_quad_t (xdrs, &objp->lk_owner)) -			 return FALSE; -		buf = XDR_INLINE (xdrs, (4 +  16 )* BYTES_PER_XDR_UNIT); -		if (buf == NULL) { -			 if (!xdr_u_int (xdrs, &objp->pid)) -				 return FALSE; -			 if (!xdr_u_int (xdrs, &objp->uid)) -				 return FALSE; -			 if (!xdr_u_int (xdrs, &objp->gid)) -				 return FALSE; -			 if (!xdr_u_int (xdrs, &objp->ngrps)) -				 return FALSE; -			 if (!xdr_vector (xdrs, (char *)objp->groups, 16, -				sizeof (u_int), (xdrproc_t) xdr_u_int)) -				 return FALSE; -		} else { -			objp->pid = IXDR_GET_U_LONG(buf); -			objp->uid = IXDR_GET_U_LONG(buf); -			objp->gid = IXDR_GET_U_LONG(buf); -			objp->ngrps = IXDR_GET_U_LONG(buf); -			{ -				register u_int *genp; - -				for (i = 0, genp = objp->groups; -					i < 16; ++i) { -					*genp++ = IXDR_GET_U_LONG(buf); -				} -			} -		} -	 return TRUE; -	} - -	 if (!xdr_u_quad_t (xdrs, &objp->lk_owner)) -		 return FALSE; -	 if (!xdr_u_int (xdrs, &objp->pid)) -		 return FALSE; -	 if (!xdr_u_int (xdrs, &objp->uid)) -		 return FALSE; -	 if (!xdr_u_int (xdrs, &objp->gid)) -		 return FALSE; -	 if (!xdr_u_int (xdrs, &objp->ngrps)) -		 return FALSE; -	 if (!xdr_vector (xdrs, (char *)objp->groups, 16, -		sizeof (u_int), (xdrproc_t) xdr_u_int)) -		 return FALSE; -	return TRUE; -} - +/* V1 */  ssize_t  xdr_to_glusterfs_auth (char *buf, struct auth_glusterfs_parms *req) @@ -146,7 +61,7 @@ auth_glusterfs_request_init (rpcsvc_request_t *req, void *priv)  {          if (!req)                  return -1; -        memset (req->verf.authdata, 0, RPCSVC_MAX_AUTH_BYTES); +        memset (req->verf.authdata, 0, GF_MAX_AUTH_BYTES);          req->verf.datalen = 0;          req->verf.flavour = AUTH_NULL; @@ -155,9 +70,12 @@ auth_glusterfs_request_init (rpcsvc_request_t *req, void *priv)  int auth_glusterfs_authenticate (rpcsvc_request_t *req, void *priv)  { -        int                          ret = RPCSVC_AUTH_REJECT;          struct auth_glusterfs_parms  au = {0,}; -        int                          gidcount = 0; + +        int ret      = RPCSVC_AUTH_REJECT; +        int gidcount = 0; +        int j        = 0; +        int i        = 0;          if (!req)                  return ret; @@ -173,7 +91,11 @@ int auth_glusterfs_authenticate (rpcsvc_request_t *req, void *priv)          req->pid = au.pid;          req->uid = au.uid;          req->gid = au.gid; -        req->lk_owner = au.lk_owner; +        req->lk_owner.len = 8; +        { +                for (i = 0; i < req->lk_owner.len; i++, j += 8) +                        req->lk_owner.data[i] = (char)((au.lk_owner >> j) & 0xff); +        }          req->auxgidcount = au.ngrps;          if (req->auxgidcount > 16) { @@ -187,8 +109,8 @@ int auth_glusterfs_authenticate (rpcsvc_request_t *req, void *priv)                  req->auxgids[gidcount] = au.groups[gidcount];          gf_log (GF_RPCSVC, GF_LOG_TRACE, "Auth Info: pid: %u, uid: %d" -                ", gid: %d, owner: %"PRId64, -                req->pid, req->uid, req->gid, req->lk_owner); +                ", gid: %d, owner: %s", +                req->pid, req->uid, req->gid, lkowner_utoa (&req->lk_owner));          ret = RPCSVC_AUTH_ACCEPT;  err:          return ret; @@ -213,3 +135,111 @@ rpcsvc_auth_glusterfs_init (rpcsvc_t *svc, dict_t *options)  {          return &rpcsvc_auth_glusterfs;  } + +/* V2 */ + +ssize_t +xdr_to_glusterfs_auth_v2 (char *buf, struct auth_glusterfs_parms_v2 *req) +{ +        XDR     xdr; +        ssize_t ret = -1; + +        if ((!buf) || (!req)) +                return -1; + +        xdrmem_create (&xdr, buf, GF_MAX_AUTH_BYTES, XDR_DECODE); +        if (!xdr_auth_glusterfs_parms_v2 (&xdr, req)) { +                gf_log ("", GF_LOG_WARNING, +                        "failed to decode glusterfs v2 parameters"); +                ret  = -1; +                goto ret; +        } + +        ret = (((size_t)(&xdr)->x_private) - ((size_t)(&xdr)->x_base)); +ret: +        return ret; + +} +int +auth_glusterfs_v2_request_init (rpcsvc_request_t *req, void *priv) +{ +        if (!req) +                return -1; +        memset (req->verf.authdata, 0, GF_MAX_AUTH_BYTES); +        req->verf.datalen = 0; +        req->verf.flavour = AUTH_NULL; + +        return 0; +} + +int auth_glusterfs_v2_authenticate (rpcsvc_request_t *req, void *priv) +{ +        struct auth_glusterfs_parms_v2  au = {0,}; +        int ret = RPCSVC_AUTH_REJECT; +        int i   = 0; + +        if (!req) +                return ret; + +        ret = xdr_to_glusterfs_auth_v2 (req->cred.authdata, &au); +        if (ret == -1) { +                gf_log ("", GF_LOG_WARNING, +                        "failed to decode glusterfs credentials"); +                ret = RPCSVC_AUTH_REJECT; +                goto err; +        } + +        req->pid = au.pid; +        req->uid = au.uid; +        req->gid = au.gid; +        req->lk_owner.len = au.lk_owner.lk_owner_len; +        req->auxgidcount = au.groups.groups_len; + +        if (req->auxgidcount > GF_MAX_AUX_GROUPS) { +                gf_log ("", GF_LOG_WARNING, +                        "more than max aux gids found (%d) , truncating it " +                        "to %d and continuing", au.groups.groups_len, +                        GF_MAX_AUX_GROUPS); +                req->auxgidcount = GF_MAX_AUX_GROUPS; +        } + +        if (req->lk_owner.len > GF_MAX_LOCK_OWNER_LEN) { +                gf_log ("", GF_LOG_WARNING, +                        "lkowner field > 1k, failing authentication"); +                ret = RPCSVC_AUTH_REJECT; +                goto err; +        } + +        for (i = 0; i < req->auxgidcount; ++i) +                req->auxgids[i] = au.groups.groups_val[i]; + +        for (i = 0; i < au.lk_owner.lk_owner_len; ++i) +                req->lk_owner.data[i] = au.lk_owner.lk_owner_val[i]; + +        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Auth Info: pid: %u, uid: %d" +                ", gid: %d, owner: %s", +                req->pid, req->uid, req->gid, lkowner_utoa (&req->lk_owner)); +        ret = RPCSVC_AUTH_ACCEPT; +err: +        return ret; +} + +rpcsvc_auth_ops_t auth_glusterfs_ops_v2 = { +        .transport_init         = NULL, +        .request_init           = auth_glusterfs_v2_request_init, +        .authenticate           = auth_glusterfs_v2_authenticate +}; + +rpcsvc_auth_t rpcsvc_auth_glusterfs_v2 = { +        .authname       = "AUTH_GLUSTERFS-v2", +        .authnum        = AUTH_GLUSTERFS_v2, +        .authops        = &auth_glusterfs_ops_v2, +        .authprivate    = NULL +}; + + +rpcsvc_auth_t * +rpcsvc_auth_glusterfs_v2_init (rpcsvc_t *svc, dict_t *options) +{ +        return &rpcsvc_auth_glusterfs_v2; +}  | 
