diff --git a/src/nfs/nfs_kv_create.cpp b/src/nfs/nfs_kv_create.cpp index bbfff19b..c39b98dd 100644 --- a/src/nfs/nfs_kv_create.cpp +++ b/src/nfs/nfs_kv_create.cpp @@ -122,6 +122,10 @@ static void kv_continue_create(kv_create_state *st, int state) st->attrobj["ctime"] = nfstime_now_str(); if (st->attrobj.find("mtime") == st->attrobj.end()) st->attrobj["mtime"] = st->attrobj["ctime"]; + if (st->rop->auth_sys.uid && st->attrobj.find("uid") == st->attrobj.end()) + st->attrobj["uid"] = (uint64_t)st->rop->auth_sys.uid; + if (st->rop->auth_sys.gid && st->attrobj.find("gid") == st->attrobj.end()) + st->attrobj["gid"] = (uint64_t)st->rop->auth_sys.gid; st->attrs = std::move(st->attrobj); resume_1: // Generate inode ID diff --git a/src/nfs/nfs_proxy.cpp b/src/nfs/nfs_proxy.cpp index 0ab94ad6..b143af20 100644 --- a/src/nfs/nfs_proxy.cpp +++ b/src/nfs/nfs_proxy.cpp @@ -1168,6 +1168,16 @@ int nfs_client_t::handle_rpc_op(rpc_op_t *rop) // Incoming buffer isn't needed to handle request, so return 0 return 0; } + if (rop->in_msg.body.cbody.cred.flavor == RPC_AUTH_SYS) + { + // Parse authentication header + if (!xdr_decode(rop->xdrs, rop->in_msg.body.cbody.cred.body.data, rop->in_msg.body.cbody.cred.body.size, (xdrproc_t)xdr_authsys_parms, &rop->auth_sys)) + { + rop->out_msg.body.rbody.areply.reply_data.stat = RPC_GARBAGE_ARGS; + rpc_queue_reply(rop); + return 0; + } + } rop->out_msg.body.rbody.areply.reply_data.stat = RPC_SUCCESS; rop->reply_fn = proc_it->resp_fn; rop->referenced = 0; diff --git a/src/nfs/proto/rpc.h b/src/nfs/proto/rpc.h index bce97ddf..9551ff98 100644 --- a/src/nfs/proto/rpc.h +++ b/src/nfs/proto/rpc.h @@ -133,6 +133,18 @@ struct rpc_msg { }; typedef struct rpc_msg rpc_msg; +struct authsys_parms { + u_int stamp; + xdr_string_t machinename; + u_int uid; + u_int gid; + struct { + u_int gids_len; + u_int *gids_val; + } gids; +}; +typedef struct authsys_parms authsys_parms; + /* the xdr functions */ @@ -151,6 +163,7 @@ extern bool_t xdr_rpc_rejected_reply (XDR *, rpc_rejected_reply*); extern bool_t xdr_rpc_reply_body (XDR *, rpc_reply_body*); extern bool_t xdr_rpc_msg_body (XDR *, rpc_msg_body*); extern bool_t xdr_rpc_msg (XDR *, rpc_msg*); +extern bool_t xdr_authsys_parms (XDR *, authsys_parms*); #ifdef __cplusplus diff --git a/src/nfs/proto/rpc.x b/src/nfs/proto/rpc.x index 6f71b05b..ac425d59 100644 --- a/src/nfs/proto/rpc.x +++ b/src/nfs/proto/rpc.x @@ -111,3 +111,11 @@ struct rpc_msg { u_int xid; rpc_msg_body body; }; + +struct authsys_parms { + unsigned int stamp; + string machinename<255>; + unsigned int uid; + unsigned int gid; + unsigned int gids<16>; +}; diff --git a/src/nfs/proto/rpc_impl.h b/src/nfs/proto/rpc_impl.h index 965beb0f..6a7bbacb 100644 --- a/src/nfs/proto/rpc_impl.h +++ b/src/nfs/proto/rpc_impl.h @@ -35,6 +35,7 @@ struct rpc_op_t void *client; void *buffer; XDR *xdrs; + authsys_parms auth_sys; rpc_msg in_msg, out_msg; rdma_msg in_rdma_msg; rpc_rdma_errcode rdma_error; diff --git a/src/nfs/proto/rpc_xdr.cpp b/src/nfs/proto/rpc_xdr.cpp index c3bba80d..124aa51d 100644 --- a/src/nfs/proto/rpc_xdr.cpp +++ b/src/nfs/proto/rpc_xdr.cpp @@ -251,3 +251,21 @@ xdr_rpc_msg (XDR *xdrs, rpc_msg *objp) return FALSE; return TRUE; } + +bool_t +xdr_authsys_parms (XDR *xdrs, authsys_parms *objp) +{ + + if (!xdr_u_int (xdrs, &objp->stamp)) + return FALSE; + if (!xdr_string (xdrs, &objp->machinename, 255)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->uid)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->gid)) + return FALSE; + if (!xdr_array (xdrs, (char **)&objp->gids.gids_val, (u_int *) &objp->gids.gids_len, 16, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + return TRUE; +}