View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0003389 | mantisbt | bugtracker | public | 2003-10-27 11:06 | 2003-12-13 04:34 |
| Reporter | smhanson | Assigned To | vboctor | ||
| Priority | normal | Severity | minor | Reproducibility | always |
| Status | closed | Resolution | fixed | ||
| Summary | 0003389: 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. | ||||
| Tags | No 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
| ||||
|
The way the access level of a user is determined is as follows:
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. |
|
|
Then something like this could be added at line 50 of manage_user_update.php if updating user to admin, remove from all projectsif (!user_is_administrator($c_user_id) && $c_access_level == ADMINISTRATOR) { |
|
|
I attached a patch which fixes the problem. The idea is similar to what you mentioned with some differences:
Let me know if applying the patches solves your problem. |
|
|
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. |
|
|
The patch works for me. Thanks! |
|
|
Fixed in CVS. Will be available in next release. |
|
|
MantisBT: master d5674886 2003-10-28 05:37 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 | ||