Use default uid and gid from NFS AUTH_SYS when creating files

This commit is contained in:
Vitaliy Filippov
2025-08-24 16:03:40 +03:00
parent d8332171e9
commit fb1c3e00f4
6 changed files with 54 additions and 0 deletions
+4
View File
@@ -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
+10
View File
@@ -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;
+13
View File
@@ -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
+8
View File
@@ -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>;
};
+1
View File
@@ -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;
+18
View File
@@ -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;
}