]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds unix group handling better now
authoranwleung <anwleung@29311d96-e01e-0410-9327-a35deaab8ce9>
Sat, 10 Mar 2007 20:44:01 +0000 (20:44 +0000)
committeranwleung <anwleung@29311d96-e01e-0410-9327-a35deaab8ce9>
Sat, 10 Mar 2007 20:44:01 +0000 (20:44 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1197 29311d96-e01e-0410-9327-a35deaab8ce9

branches/aleung/security1/ceph/client/SyntheticClient.cc
branches/aleung/security1/ceph/mds/CInode.h
branches/aleung/security1/ceph/mds/Locker.cc
branches/aleung/security1/ceph/osd/OSD.cc

index e443c09a139ead2ef0ccd5dfb502bbefbdb845a5..6097cd9744e37338dd9066a95436f45c96a508d0 100644 (file)
@@ -59,7 +59,7 @@ void parse_syn_options(vector<char*>& args)
         syn_iargs.push_back( atoi(args[++i]) );
         syn_iargs.push_back( atoi(args[++i]) );
       } else if (strcmp(args[i],"writebatch") == 0) {
-          syn_modes.push_back( SYNCLIENT_MODE_WRITEBATCH );
+       syn_modes.push_back( SYNCLIENT_MODE_WRITEBATCH );
         syn_iargs.push_back( atoi(args[++i]) );
         syn_iargs.push_back( atoi(args[++i]) );
         syn_iargs.push_back( atoi(args[++i]) );
index 8f50f1ef2615f5ed74a03051bd063b0e0d7ccf1d..de40b6b60b6d77581d05bf8d83699682925bea2e 100644 (file)
@@ -186,9 +186,9 @@ protected:
   // secure capabilities
   // will be dependant based on MDS collection policy!
   map<uid_t, ExtCap>  ext_caps;
-  //ExtCap *user_cap;
-  //ExtCap *group_cap;
-  //ExtCap *world_cap;
+  ExtCap *user_cap;
+  ExtCap *group_cap;
+  ExtCap *world_cap;
 
   map<int, int>         mds_caps_wanted;     // [auth] mds -> caps wanted
   int                   replica_caps_wanted; // [replica] what i've requested from auth
@@ -403,7 +403,12 @@ protected:
       return &(ext_caps[user]);
     return 0;
   }
-
+  ExtCap* get_unix_user_cap() { return user_cap; }
+  ExtCap* get_unix_group_cap() { return group_cap; }
+  ExtCap* get_unix_world_cap() { return world_cap; }
+  void set_unix_user_cap(ExtCap* extcap) { user_cap = new ExtCap(*extcap); }
+  void set_unix_group_cap(ExtCap* extcap) { group_cap = new ExtCap(*extcap); }
+  void set_unix_world_cap(ExtCap* extcap) { world_cap = new ExtCap(*extcap); }
 
   void replicate_relax_locks() {
     assert(is_auth());
index fe124bbe08f1b237df4ac62004e7590b83babaa9..7f752ed648bcfdad4b51799953b603500e81bc4e 100644 (file)
@@ -233,14 +233,27 @@ ExtCap* Locker::issue_new_extcaps(CInode *in, int mode, MClientRequest *req) {
   my_want |= FILE_MODE_RW;
 
   // check cache
-  ExtCap *ext_cap = in->get_user_extcap(my_user);
+  ExtCap *ext_cap;
+  // unix groups
+  if (g_conf.mds_group == 1) {
+    if (my_user == in->get_uid())
+      ext_cap = in->get_unix_user_cap();
+    else if(my_group == in->get_gid())
+      ext_cap = in->get_unix_group_cap();
+    else
+      ext_cap = in->get_unix_world_cap();
+  }
+  // no grouping
+  else
+    ext_cap = in->get_user_extcap(my_user);
 
   if (!ext_cap) {
     // make new cap
     // unix grouping
     if (g_conf.mds_group == 1) {
 
-      // new group
+      // checking who is in groups
+      // is this a new group?
       if (mds->unix_groups_map.count(my_group) == 0) {
        // make a group & add user
        CapGroup group(my_user);
@@ -253,8 +266,8 @@ ExtCap* Locker::issue_new_extcaps(CInode *in, int mode, MClientRequest *req) {
        mds->unix_groups_byhash[group.get_root_hash()] = group;
        // put pointer into map
        mds->unix_groups_map[my_group] = group.get_root_hash();
+       cout << "New group " << my_group << " from user " << my_user << endl;
       }
-
       // add user to group if not in group
       hash_t my_hash = mds->unix_groups_map[my_group];
       if (!(mds->unix_groups_byhash[my_hash].contains(my_user))) {
@@ -277,8 +290,6 @@ ExtCap* Locker::issue_new_extcaps(CInode *in, int mode, MClientRequest *req) {
 
        cout << "User " << my_user << " added to group " << my_group << endl;
       }
-      else
-       cout << "User " << my_user << " already in group " << my_group << endl;
 
       //get hash for gid
       hash_t gid_hash = mds->unix_groups_map[my_group];
@@ -296,8 +307,8 @@ ExtCap* Locker::issue_new_extcaps(CInode *in, int mode, MClientRequest *req) {
     else
       ext_cap = new ExtCap(my_want, my_user, in->ino());
     
+    // set capability id
     ext_cap->set_id(cap_id_count, mds->get_nodeid());
-    // increment capability count
     cap_id_count++;
 
     dout(3) << "Made new " << my_want << " capability for uid: "
@@ -306,7 +317,16 @@ ExtCap* Locker::issue_new_extcaps(CInode *in, int mode, MClientRequest *req) {
     ext_cap->sign_extcap(mds->getPrvKey());
 
     // caches this capability in the inode
-    in->add_user_extcap(my_user,ext_cap);
+    if (g_conf.mds_group == 1) {
+      if (my_user == in->get_uid())
+       in->set_unix_user_cap(ext_cap);
+      else if(my_user == in->get_gid())
+       in->set_unix_group_cap(ext_cap);
+      else
+       in->set_unix_world_cap(ext_cap);
+    }
+    else
+      in->add_user_extcap(my_user,ext_cap);
 
   }
   // we want to index based on mode, so we can cache more caps
index a82a2ee948182ef782d791022a2c182832d0d1b4..06d0cb497f80cc3a81f8fac008107756a5ac157c 100644 (file)
@@ -445,16 +445,16 @@ void OSD::handle_osd_update_reply(MOSDUpdateReply *m) {
 
   cout << "hande_osd_update_reply for " << my_hash << endl;
   dout(10) << "hande_osd_update_reply for " << my_hash << endl;
-
-  // add the new list to our cache
-  user_groups[my_hash].set_list(m->get_list());
-
+  
   // verify
   if (m->verify_list(monmap->get_key()))
     cout << "List verification succeeded" << endl;
   else
     cout << "List verification failed" << endl;
 
+  // add the new list to our cache
+  user_groups[my_hash].set_list(m->get_list());
+
   // wait up the waiter(s)
   // this signals all update waiters
   //for (list<Cond*>::iterator p = update_waiter_cond[my_hash].begin();