@@ -219,8 +219,6 @@ BOOL exmdb_server::remove_store_properties(const char *dir,
219219BOOL exmdb_server::get_mbox_perm (const char *dir,
220220 const char *username, uint32_t *ppermission) try
221221{
222- char sql_string[128 ];
223-
224222 if (!exmdb_server::is_private ())
225223 return FALSE ;
226224 auto pdb = db_engine_get_db (dir);
@@ -272,23 +270,24 @@ BOOL exmdb_server::get_mbox_perm(const char *dir,
272270 if (fid == PRIVATE_FID_IPMSUBTREE && perm & frightsOwner)
273271 *ppermission |= frightsGromoxStoreOwner;
274272 }
275- pstmt.finalize ();
276273
277274 /* add in mlist permissions(?) */
278- snprintf (sql_string, std::size (sql_string), " SELECT "
279- " username, permission FROM permissions" );
280- pstmt = pdb->prep (sql_string);
281- if (pstmt == nullptr )
282- return FALSE ;
283- while (pstmt.step () == SQLITE_ROW) {
284- auto ben = pstmt.col_text (0 );
285- if (!mysql_adaptor_check_mlist_include (ben, username))
286- continue ;
287- auto perm = pstmt.col_uint64 (1 );
288- auto fid = pstmt.col_uint64 (2 );
289- *ppermission |= perm;
290- if (fid == PRIVATE_FID_IPMSUBTREE && perm & frightsOwner)
291- *ppermission |= frightsGromoxStoreOwner;
275+ std::vector<std::string> group_memberships;
276+ auto err = mysql_adaptor_get_user_groups_rec (username, group_memberships);
277+ if (err != 0 )
278+ return false ;
279+ for (auto &&group : group_memberships) {
280+ pstmt.reset ();
281+ pstmt.bind_text (1 , group.c_str ());
282+ while (pstmt.step () == SQLITE_ROW) {
283+ auto fid = pstmt.col_uint64 (0 );
284+ if (seen_fid.find (fid) != seen_fid.end ())
285+ continue ;
286+ auto perm = pstmt.col_uint64 (1 );
287+ *ppermission |= perm;
288+ if (fid == PRIVATE_FID_IPMSUBTREE && perm & frightsOwner)
289+ *ppermission |= frightsGromoxStoreOwner;
290+ }
292291 }
293292 pstmt.finalize ();
294293 pdb.reset ();
0 commit comments