@@ -765,12 +765,20 @@ namespace {
765
765
766
766
private:
767
767
768
+ // Data structures used in tracking user/group permissions.
769
+
768
770
std::map<std::string,std::string> users_{}, groups_{};
769
771
std::map<std::string,std::list<std::string>> members_{};
770
772
std::map<std::string,int > user_entry_{};
771
773
std::multimap<int ,std::string> user_perms_{}, group_perms_{};
772
774
std::string owner_{};
773
775
776
+ // idx_ is both:
777
+ // - an index into the target permissions array (in the JSON) when filling that element.
778
+ // - an internal flag which, when non-zero, means that the user permissions tracking data structures have been computed.
779
+ // It is used by `reset_perms', thus also indirectly by `calc_perm_info', to determine the need to re-initialize those
780
+ // structures before (re-)computation.
781
+
774
782
int idx_{0 };
775
783
776
784
rsComm_t *conn{};
@@ -783,15 +791,6 @@ namespace {
783
791
784
792
bool is_group ( const std::string& gid ) {
785
793
return groups_.find (gid) != groups_.end ();
786
- /*
787
- try {
788
- groups_.at(gid);
789
- }
790
- catch (const std::out_of_range&) {
791
- return false;
792
- }
793
- return true;
794
- */
795
794
}
796
795
797
796
// Is the given user a member of the given group ?
@@ -801,9 +800,8 @@ namespace {
801
800
const auto & user_list = members_.at (group_id);
802
801
return std::find ( user_list.begin (), user_list.end (), user_id) != user_list.end ();
803
802
}
804
- catch (...) {
805
- std::cerr << (" unknown error\n " );
806
- throw ;
803
+ catch (const std::out_of_range&) {
804
+ irods::log (LOG_ERROR, fmt::format (" '{}' is not a group id" , group_id));
807
805
}
808
806
return false ;
809
807
}
@@ -813,14 +811,14 @@ namespace {
813
811
// Helper method. Reset the data structures that track existing permissions.
814
812
815
813
void calc_user_info () {
816
- irods::query q{conn, " select USER_GROUP_NAME,USER_GROUP_ID,USER_NAME,USER_ID" };
817
- for (const auto & c: q) {
818
- if (c [1 ] != c [3 ]) {
819
- members_[c [1 ]].push_back (c [3 ]);
820
- groups_[c [1 ]]=c [0 ];
814
+ irods::query q{ conn, " select USER_GROUP_NAME,USER_GROUP_ID,USER_NAME,USER_ID" };
815
+ for (const auto & row : q) {
816
+ if (row [1 ] != row [3 ]) {
817
+ members_[row [1 ]].push_back (row [3 ]);
818
+ groups_[row [1 ]]=row [0 ];
821
819
}
822
820
else {
823
- users_[c [3 ]]=c [2 ];
821
+ users_[row [3 ]]=row [2 ];
824
822
}
825
823
}
826
824
}
@@ -851,7 +849,7 @@ namespace {
851
849
// Copy constructor, preserves user, group and is-a-member information, but resets other data structures
852
850
// in preparation for recomputing permissions info.
853
851
854
- permissions_calculator (const permissions_calculator & x, rsComm_t *_conn)
852
+ permissions_calculator (const permissions_calculator& x, rsComm_t *_conn)
855
853
: users_{x.users_ }
856
854
, groups_{x.groups_ }
857
855
, members_{x.members_ }
@@ -864,7 +862,7 @@ namespace {
864
862
865
863
void get_perms_list (nlohmann::json & j, const std::string & obj_id, const std::string & obj_type)
866
864
{
867
- calc_perm_info ( obj_id, obj_type);
865
+ calc_perm_info ( obj_id, obj_type); // idx_ member will be zero after this call.
868
866
869
867
for (const auto & [pm,gid] : group_perms_) {
870
868
j[" userPermissions" ][idx_][" permission" ] = perm_names.at (pm);
@@ -895,7 +893,7 @@ namespace {
895
893
// Calculate ownership and permissions for the object of the given ID
896
894
// Note obj_type should be either "DATA" or "COLL".
897
895
898
- void permissions_calculator::calc_perm_info ( const std::string & obj_id, const std::string & obj_type)
896
+ void permissions_calculator::calc_perm_info (const std::string& obj_id, const std::string& obj_type)
899
897
{
900
898
reset_perms (); // reset the variables used to calculate owner, user_perms and group_perms
901
899
// for later conversion to JSON for indexing.
@@ -932,11 +930,11 @@ namespace {
932
930
or higher privilege.
933
931
*/
934
932
for (const auto & [uid,iperm] : user_entry_) {
935
- bool include_user = true ;
936
- for (auto it = group_perms_.lower_bound (iperm); it!= group_perms_.end (); it++) {
937
- if (is_member_of (uid,it->second )) { include_user = false ; break ; }
938
- }
939
- if (include_user) { user_perms_.insert ( make_pair (iperm, uid)); }
933
+ bool include_user = true ;
934
+ for (auto it = group_perms_.lower_bound (iperm); it!= group_perms_.end (); it++) {
935
+ if (is_member_of (uid,it->second )) { include_user = false ; break ; }
936
+ }
937
+ if (include_user) { user_perms_.insert ( make_pair (iperm, uid)); }
940
938
}
941
939
// group_perms and user_perms are now ready for storing into the metadata index
942
940
}
0 commit comments