Use default uid and gid from NFS AUTH_SYS when creating files
This commit is contained in:
@@ -122,6 +122,10 @@ static void kv_continue_create(kv_create_state *st, int state)
|
|||||||
st->attrobj["ctime"] = nfstime_now_str();
|
st->attrobj["ctime"] = nfstime_now_str();
|
||||||
if (st->attrobj.find("mtime") == st->attrobj.end())
|
if (st->attrobj.find("mtime") == st->attrobj.end())
|
||||||
st->attrobj["mtime"] = st->attrobj["ctime"];
|
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);
|
st->attrs = std::move(st->attrobj);
|
||||||
resume_1:
|
resume_1:
|
||||||
// Generate inode ID
|
// Generate inode ID
|
||||||
|
|||||||
@@ -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
|
// Incoming buffer isn't needed to handle request, so return 0
|
||||||
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->out_msg.body.rbody.areply.reply_data.stat = RPC_SUCCESS;
|
||||||
rop->reply_fn = proc_it->resp_fn;
|
rop->reply_fn = proc_it->resp_fn;
|
||||||
rop->referenced = 0;
|
rop->referenced = 0;
|
||||||
|
|||||||
@@ -133,6 +133,18 @@ struct rpc_msg {
|
|||||||
};
|
};
|
||||||
typedef struct rpc_msg 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 */
|
/* 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_reply_body (XDR *, rpc_reply_body*);
|
||||||
extern bool_t xdr_rpc_msg_body (XDR *, rpc_msg_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_rpc_msg (XDR *, rpc_msg*);
|
||||||
|
extern bool_t xdr_authsys_parms (XDR *, authsys_parms*);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@@ -111,3 +111,11 @@ struct rpc_msg {
|
|||||||
u_int xid;
|
u_int xid;
|
||||||
rpc_msg_body body;
|
rpc_msg_body body;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct authsys_parms {
|
||||||
|
unsigned int stamp;
|
||||||
|
string machinename<255>;
|
||||||
|
unsigned int uid;
|
||||||
|
unsigned int gid;
|
||||||
|
unsigned int gids<16>;
|
||||||
|
};
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ struct rpc_op_t
|
|||||||
void *client;
|
void *client;
|
||||||
void *buffer;
|
void *buffer;
|
||||||
XDR *xdrs;
|
XDR *xdrs;
|
||||||
|
authsys_parms auth_sys;
|
||||||
rpc_msg in_msg, out_msg;
|
rpc_msg in_msg, out_msg;
|
||||||
rdma_msg in_rdma_msg;
|
rdma_msg in_rdma_msg;
|
||||||
rpc_rdma_errcode rdma_error;
|
rpc_rdma_errcode rdma_error;
|
||||||
|
|||||||
@@ -251,3 +251,21 @@ xdr_rpc_msg (XDR *xdrs, rpc_msg *objp)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
return TRUE;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user