View Issue Details

IDProjectCategoryView StatusLast Update
0003389mantisbtbugtrackerpublic2003-12-13 04:34
Reportersmhanson Assigned Tovboctor  
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Summary0003389: Problems upgrading exister user to administrator
Description

A user entered as, say, reporter or developer in a private project is later promoted to administrator. He still has only his old rights for that project until he is removed from the project, which he cannot do himself.

TagsNo tags attached.
Attached Files
upgrade_access_level_to_admin.diff (4,104 bytes)   
Index: manage_user_update.php
===================================================================
RCS file: /cvsroot/mantisbt/mantisbt/manage_user_update.php,v
retrieving revision 1.29
diff -u -r1.29 manage_user_update.php
--- manage_user_update.php	18 Feb 2003 02:18:01 -0000	1.29
+++ manage_user_update.php	28 Oct 2003 10:16:00 -0000
@@ -47,6 +47,12 @@
 
 	$t_old_protected = user_get_field( $f_user_id, 'protected' );
 
+	# Project specific access rights override global levels, hence, for users who are changed
+	# to be administrators, we have to remove project specific rights.
+        if ( ( $c_access_level >= ADMINISTRATOR ) && ( !user_is_administrator( $c_user_id ) ) ) {
+		user_delete_project_specific_access_levels( $c_user_id );
+	}
+
 	# if the user is already protected and the admin is not removing the
 	#  protected flag then don't update the access level and enabled flag.
 	#  If the user was unprotected or the protected flag is being turned off
@@ -64,8 +70,8 @@
 	    		WHERE id='$c_user_id'";
 	}
 
-    $result = db_query( $query );
-    $t_redirect_url = 'manage_user_page.php';
+	$result = db_query( $query );
+	$t_redirect_url = 'manage_user_page.php';
 ?>
 <?php html_page_top1() ?>
 <?php
Index: core/user_api.php
===================================================================
RCS file: /cvsroot/mantisbt/mantisbt/core/user_api.php,v
retrieving revision 1.60
diff -u -r1.60 user_api.php
--- core/user_api.php	25 Aug 2003 22:24:44 -0000	1.60
+++ core/user_api.php	28 Oct 2003 10:16:04 -0000
@@ -318,17 +318,55 @@
 	}
 
 	# --------------------
-	# delete an account
+	# delete project-specific user access levels.
+	# returns true when successfully deleted
+	function user_delete_project_specific_access_levels( $p_user_id ) {
+		$c_user_id 					= db_prepare_int($p_user_id);
+
+		user_ensure_unprotected( $p_user_id );
+
+		$t_project_user_list_table 	= config_get('mantis_project_user_list_table');
+
+		$query = "DELETE
+				  FROM $t_project_user_list_table
+				  WHERE user_id='$c_user_id'";
+		db_query( $query );
+
+		user_clear_cache( $p_user_id );
+
+		return true;
+	}
+
+	# --------------------
+	# delete profiles for the specified user
+	# returns true when successfully deleted
+	function user_delete_profiles( $p_user_id ) {
+		$c_user_id 					= db_prepare_int($p_user_id);
+
+		user_ensure_unprotected( $p_user_id );
+
+		$t_user_profile_table 		= config_get('mantis_user_profile_table');
+
+		# Remove associated profiles
+		$query = "DELETE
+				  FROM $t_user_profile_table
+				  WHERE user_id='$c_user_id'";
+		db_query( $query );
+
+		user_clear_cache( $p_user_id );
+
+		return true;
+        }
+
+	# --------------------
+	# delete a user account (account, profiles, preferences, project-specific access levels)
 	# returns true when the account was successfully deleted
 	function user_delete( $p_user_id ) {
 		$c_user_id 					= db_prepare_int($p_user_id);
 
-    	user_ensure_unprotected( $p_user_id );
+		user_ensure_unprotected( $p_user_id );
 
 		$t_user_table 				= config_get('mantis_user_table');
-		$t_user_profile_table 		= config_get('mantis_user_profile_table');
-		$t_user_pref_table 			= config_get('mantis_user_pref_table');
-		$t_project_user_list_table 	= config_get('mantis_project_user_list_table');
 
 		# Remove account
 		$query = "DELETE
@@ -337,23 +375,18 @@
 		db_query( $query );
 
 		# Remove associated profiles
-		$query = "DELETE
-				  FROM $t_user_profile_table
-				  WHERE user_id='$c_user_id'";
-		db_query( $query );
+		user_delete_profiles( $p_user_id );
 
 		# Remove associated preferences
 		user_pref_delete_all( $p_user_id );
 
-		$query = "DELETE
-				  FROM $t_project_user_list_table
-				  WHERE user_id='$c_user_id'";
-		db_query( $query );
+		# Remove project specific access levels
+		user_delete_project_specific_access_levels( $p_user_id );
 
 		user_clear_cache( $p_user_id );
 
 		return true;
-    }
+	}
 
 	#===================================
 	# Data Access

Activities

vboctor

vboctor

2003-10-27 23:19

manager   ~0004685

The way the access level of a user is determined is as follows:

  • query for a project specific access level.
  • if no project specific access level, and project is public use global access level.
  • otherwise user has no access.

The easiest way to fix this and not introduce extra queries when acquiring the current user's access level, is to delete the user's project-specific access levels when the user's access level is set to administrator.

smhanson

smhanson

2003-10-28 08:59

reporter   ~0004688

Then something like this could be added at line 50 of manage_user_update.php

if updating user to admin, remove from all projects

if (!user_is_administrator($c_user_id) && $c_access_level == ADMINISTRATOR) {
$t_project_ids = user_get_accessible_projects($c_user_id);
foreach ($t_project_ids as $t_project_id) {
project_remove_user($t_project_id, $c_user_id);
}
}

vboctor

vboctor

2003-10-28 11:32

manager   ~0004689

I attached a patch which fixes the problem. The idea is similar to what you mentioned with some differences:

  • Added user_delete_project_specific_access_levels() and called it from the manage_user_update.php.
  • When checking $c_access_level, use >= ADMINISTRATOR.
  • Check $c_access_level then user_is_administrator() for speed.

Let me know if applying the patches solves your problem.

vboctor

vboctor

2003-10-28 11:34

manager   ~0004690

We should also consider adding a DB upgrade step that deletes all project specific access rights for any user with access level equal to administrator.

smhanson

smhanson

2003-10-29 10:21

reporter   ~0004691

The patch works for me. Thanks!

vboctor

vboctor

2003-10-29 14:06

manager   ~0004693

Fixed in CVS. Will be available in next release.

Related Changesets

MantisBT: master d5674886

2003-10-28 05:37

vboctor


Details Diff
Fix 0003389: Problems upgrading existing users to administrator.

M manage_user_update.php
- Deleting project specific access levels for users who are upgraded to ADMINISTRATORS.

M core/user_api.php
- (user_delete_project_specific_access_levels) Added to delete project specific access levels for a user
- (user_delete_profiles) Added to delete profiles associated with a user.

git-svn-id: http://mantisbt.svn.sourceforge.net/svnroot/mantisbt/trunk@2270 <a class="text" href="/?p=mantisbt.git;a=object;h=f5dc347c">f5dc347c</a>-c33d-0410-90a0-b07cc1902cb9
Affected Issues
0003389
mod - core/user_api.php Diff File
mod - doc/ChangeLog Diff File
mod - manage_user_update.php Diff File