From fbe08c7830ec9df28ec3531498bcbf4430b199fd Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Mon, 8 Mar 2010 06:44:51 -0800 Subject: [PATCH] mon: let prepare_new_pool assign an auid. Add new version that takes an MPoolOp and checks permissions first. --- src/mon/OSDMonitor.cc | 23 ++++++++++++++++++++--- src/mon/OSDMonitor.h | 4 ++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 10df2313050e1..1f1b54af5e11b 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1003,7 +1003,19 @@ bool OSDMonitor::preprocess_command(MMonCommand *m) return false; } -int OSDMonitor::prepare_new_pool(string& name) +int OSDMonitor::prepare_new_pool(MPoolOp *m) +{ + //check permissions for the auid, then pass off to next function + Session * session = (Session *) m->get_connection()->get_priv(); + if (m->auid) { + if(check_privileges(m->auid, session->caps, MON_CAP_W)) { + prepare_new_pool(m->name, m->auid); + } else return -EPERM; + } else prepare_new_pool(m->name, session->caps.auid); + return 0; +} + +int OSDMonitor::prepare_new_pool(string& name, __u64 auid) { if (osdmap.name_pool.count(name)) { return -EEXIST; @@ -1019,6 +1031,7 @@ int OSDMonitor::prepare_new_pool(string& name) pending_inc.new_pools[pool].v.lpg_num = 0; pending_inc.new_pools[pool].v.lpgp_num = 0; pending_inc.new_pools[pool].v.last_change = pending_inc.epoch; + pending_inc.new_pools[pool].v.auid = auid; pending_inc.new_pool_names[pool] = name; return 0; } @@ -1367,8 +1380,12 @@ bool OSDMonitor::prepare_pool_op (MPoolOp *m) bool OSDMonitor::prepare_pool_op_create (MPoolOp *m) { - int err = prepare_new_pool(m->name); - paxos->wait_for_commit(new OSDMonitor::C_PoolOp(this, m, err, pending_inc.epoch)); + int err = prepare_new_pool(m); + if (!err) { + paxos->wait_for_commit(new OSDMonitor::C_PoolOp(this, m, err, pending_inc.epoch)); + } else { + _pool_op(m, err, pending_inc.epoch); + } return true; } diff --git a/src/mon/OSDMonitor.h b/src/mon/OSDMonitor.h index 2ca0438c14f4e..a88a699964a58 100644 --- a/src/mon/OSDMonitor.h +++ b/src/mon/OSDMonitor.h @@ -89,6 +89,8 @@ private: bool prepare_pool_op (MPoolOp *m); bool prepare_pool_op_create (MPoolOp *m); bool prepare_pool_op_delete(MPoolOp *m); + int prepare_new_pool(string& name, __u64 auid = CEPH_AUTH_UID_DEFAULT); + int prepare_new_pool(MPoolOp *m); void _pool_op(MPoolOp *m, int replyCode, epoch_t epoch); //check that the provided caps allow the given action in auid's name @@ -156,8 +158,6 @@ private: bool preprocess_command(MMonCommand *m); bool prepare_command(MMonCommand *m); - int prepare_new_pool(string& name); - void mark_all_down(); void send_latest(PaxosServiceMessage *m, epoch_t start=0); -- 2.39.5