Index: bug_view_advanced_page.php =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/bug_view_advanced_page.php,v retrieving revision 1.50 diff -u -r1.50 bug_view_advanced_page.php --- bug_view_advanced_page.php 5 Feb 2004 12:45:19 -0000 1.50 +++ bug_view_advanced_page.php 26 May 2004 18:12:52 -0000 @@ -17,6 +17,7 @@ require_once( $t_core_path.'bug_api.php' ); require_once( $t_core_path.'custom_field_api.php' ); require_once( $t_core_path.'file_api.php' ); + require_once( $t_core_path.'group_api.php'); require_once( $t_core_path.'compress_api.php' ); require_once( $t_core_path.'date_api.php' ); require_once( $t_core_path.'relationship_api.php' ); @@ -502,6 +503,98 @@ # User list monitoring the bug include( $t_mantis_dir . 'bug_monitor_list_view_inc.php' ); + + +?> + + + + +
+
+
+ + + + + + + + + + +
+ +
+ + + + + +
+
+
+ + +
+
+ + + + + + + + + + + > + + + + + +
+ +
+ + + + + +
+ + + + + +
+
+ + + + Index: core/bug_api.php =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/core/bug_api.php,v retrieving revision 1.50.2.1 diff -u -r1.50.2.1 bug_api.php --- core/bug_api.php 10 May 2004 13:13:24 -0000 1.50.2.1 +++ core/bug_api.php 26 May 2004 18:12:53 -0000 @@ -698,6 +698,118 @@ return db_result( $result ); } + + # -------------------- + # check to see if the bug_group combo already exists + # returns true is duplicate is found, otherwise false + function bug_includes_group( $p_bug_id, $p_group_id ) { + $t_bug_group_list_table = config_get( 'mantis_bug_group_list_table' ); + + $c_bug_id = db_prepare_int( $p_bug_id ); + $c_group_id = db_prepare_int( $p_group_id ); + + $query = "SELECT COUNT(*) + FROM $t_bug_group_list_table + WHERE bug_id='$c_bug_id' AND + group_id='$c_group_id'"; + $result = db_query( $query ); + + if ( 0 == db_result( $result ) ) { + return false; + } else { + return true; + } + } + + # -------------------- + # Returns a list of all groups that have view access to this bug + function bug_get_group_view_list( $p_bug_id ) { + $c_bug_id = db_prepare_int( $p_bug_id ); + + $t_group_bug_list_table = config_get( 'mantis_group_bug_list_table' ); + + $query = "SELECT group_id + FROM $t_group_bug_list_table + WHERE bug_id='$c_bug_id' + ORDER BY group_id"; + $result = db_query( $query ); + + return db_result( $result ); + } + + # -------------------- + # return the descriptor holding all the info from the bug_group list + # for the specified bug + function bug_get_local_group_rows( $p_bug_id ) { + $c_bug_id = db_prepare_int( $p_bug_id ); + + $t_bug_group_list_table = config_get( 'mantis_bug_group_list_table' ); + + $query = "SELECT * + FROM $t_bug_group_list_table + WHERE project_id='$c_bug_id'"; + + $result = db_query( $query ); + + $t_group_rows = array(); + $t_row_count = db_num_rows( $result ); + + for ( $i=0 ; $i < $t_row_count ; $i++ ) { + array_push( $t_group_rows, db_fetch_array( $result ) ); + } + + return $t_group_rows; + } + + # -------------------- + # Return an array of info about groups who have access to the the given bug + # For each user we have 'id', 'groupname', and 'access_level' (overall access level) + # If the second parameter is given, return only groups with an access level + # higher than the given value. + function bug_get_all_group_rows( $p_bug_id ) { + $c_bug_id = db_prepare_int( $p_bug_id ); + + $t_group_table = config_get( 'mantis_group_table' ); + $t_bug_group_list_table = config_get( 'mantis_bug_group_list_table' ); + + $t_on = ON; + + $t_access_level = ANYBODY; + + if ( VS_PRIVATE == bug_get_field( $p_bug_id, 'view_state' ) ) { + $t_access_level = max( $t_access_level, config_get( 'private_bug_threshold' ) ); + } + + $t_access_clause = ''; + + if ( $t_access_level > 0 ) { + $t_access_clause = ' AND access_level >= ' . $t_access_level; + } + + $t_groups = array(); + + // Get the project overrides + $query = "SELECT g.id, g.groupname, g.access_level + FROM $t_bug_group_list_table l, $t_group_table g + WHERE l.group_id = g.id + AND g.enabled = $t_on + AND l.bug_id = $c_bug_id + ORDER BY g.groupname"; + + $result = db_query( $query ); + $t_row_count = db_num_rows( $result ); + + for ( $i=0 ; $i < $t_row_count ; $i++ ) { + $row = db_fetch_array( $result ); + + if ( $row['access_level'] >= $t_access_level ) { + $t_groups[$row['id']] = $row; + } + } + + return multi_sort( array_values($t_groups), 'username' ); + } + #=================================== # Data Modification @@ -924,6 +1036,62 @@ return true; } + + # -------------------- + # add group to a bug view list + function bug_add_group( $p_bug_id, $p_group_id ) { + $t_bug_group_list_table = config_get( 'mantis_bug_group_list_table' ); + + $c_bug_id = db_prepare_int( $p_bug_id ); + $c_group_id = db_prepare_int( $p_group_id ); + + $query = "INSERT + INTO $t_bug_group_list_table + ( bug_id, group_id ) + VALUES + ( '$c_bug_id', '$c_group_id' )"; + + db_query( $query ); + + # db_query errors on failure so: + return true; + } + + # -------------------- + # remove group from bug view list + function bug_remove_group( $p_bug_id, $p_group_id ) { + $t_bug_group_list_table = config_get( 'mantis_bug_group_list_table' ); + + $c_bug_id = db_prepare_int( $p_bug_id ); + $c_group_id = db_prepare_int( $p_group_id ); + + $query = "DELETE FROM $t_bug_group_list_table + WHERE bug_id='$c_bug_id' AND + group_id='$c_group_id'"; + + db_query( $query ); + + # db_query errors on failure so: + return true; + } + + # -------------------- + # delete all groups from the bug view list for a given bug + # this is useful when deleting a bug + function bug_remove_all_groups( $p_bug_id ) { + $t_bug_group_list_table = config_get( 'mantis_bug_group_list_table' ); + + $c_bug_id = db_prepare_int( $p_bug_id ); + + $query = "DELETE FROM $t_bug_group_list_table + WHERE bug_id='$c_bug_id'"; + + db_query( $query ); + + # db_query errors on failure so: + return true; + } + #=================================== # Other Index: core/constant_inc.php =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/core/constant_inc.php,v retrieving revision 1.10 diff -u -r1.10 constant_inc.php --- core/constant_inc.php 11 Feb 2004 22:16:29 -0000 1.10 +++ core/constant_inc.php 26 May 2004 18:12:54 -0000 @@ -116,6 +116,9 @@ # no user define( 'NO_USER', 0 ); + + # no group + define( 'NO_GROUP', 0 ); # history constants define( 'NORMAL_TYPE', 0 ); @@ -194,6 +197,11 @@ define( 'ERROR_USER_NAME_INVALID', 805 ); define( 'ERROR_USER_DOES_NOT_HAVE_REQ_ACCESS', 806 ); + # ERROR_GROUP_* + define( 'ERROR_GROUP_NAME_NOT_UNIQUE', 1700 ); + define( 'ERROR_GROUP_NOT_FOUND', 1701 ); + define( 'ERROR_GROUP_NAME_INVALID', 1705 ); + # ERROR_AUTH_* define( 'ERROR_AUTH_INVALID_COOKIE', 900 ); Index: core/html_api.php =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/core/html_api.php,v retrieving revision 1.88 diff -u -r1.88 html_api.php --- core/html_api.php 29 Feb 2004 09:07:45 -0000 1.88 +++ core/html_api.php 26 May 2004 18:12:54 -0000 @@ -464,12 +464,14 @@ } $t_manage_user_page = 'manage_user_page.php'; + $t_manage_group_page = 'manage_group_page.php'; $t_manage_project_menu_page = 'manage_proj_page.php'; $t_manage_custom_field_page = 'manage_custom_field_page.php'; $t_documentation_page = 'documentation_page.php'; switch ( $p_page ) { case $t_manage_user_page : $t_manage_user_page = ''; break; + case $t_manage_group_page: $t_manage_group_page = ''; break; case $t_manage_project_menu_page: $t_manage_project_menu_page = ''; break; case $t_manage_custom_field_page: $t_manage_custom_field_page = ''; break; case $t_documentation_page : $t_documentation_page = ''; break; @@ -477,6 +479,7 @@ echo '
'; print_bracket_link( $t_manage_user_page, lang_get( 'manage_users_link' ) ); + print_bracket_link( $t_manage_group_page, lang_get( 'manage_groups_link' ) ); print_bracket_link( $t_manage_project_menu_page, lang_get( 'manage_projects_link' ) ); print_bracket_link( $t_manage_custom_field_page, lang_get( 'manage_custom_field_link' ) ); print_bracket_link( $t_documentation_page, lang_get( 'documentation_link' ) ); Index: core/print_api.php =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/core/print_api.php,v retrieving revision 1.72 diff -u -r1.72 print_api.php --- core/print_api.php 5 Feb 2004 01:17:13 -0000 1.72 +++ core/print_api.php 26 May 2004 18:12:54 -0000 @@ -697,6 +697,117 @@ PRINT $t_project_name.' ['.$t_access_level.'] ('.$t_view_state.') ['. lang_get( 'remove_link' ).']
'; } } + + + # -------------------- + # list of users that are NOT in the specified group and that are enabled + function print_group_user_list_option_list( $p_group_id=null ) { + global $g_mantis_group_user_list_table, $g_mantis_user_table; + + if ( null == $p_group_id ) { + return; + } + $c_group_id = (integer)$p_group_id; + + $t_adm = ADMINISTRATOR; + $query = "SELECT DISTINCT u.id, u.username + FROM $g_mantis_user_table u + LEFT JOIN $g_mantis_group_user_list_table g + ON g.user_id=u.id AND g.group_id='$c_group_id' + WHERE u.access_level<$t_adm AND + u.enabled = 1 AND + g.user_id IS NULL AND + u.access_level<'$t_adm' + ORDER BY u.username"; + $result = db_query( $query ); + $category_count = db_num_rows( $result ); + for ($i=0;$i<$category_count;$i++) { + $row = db_fetch_array( $result ); + $t_username = $row['username']; + $t_user_id = $row['id']; + PRINT ""; + } + } + + # -------------------- + # list of groups that a user is NOT in + function print_group_user_list_option_list2( $p_user_id ) { + global $g_mantis_group_user_list_table, $g_mantis_group_table; + + $c_user_id = db_prepare_int( $p_user_id ); + + $query = "SELECT DISTINCT g.id, g.groupname + FROM $g_mantis_group_table g + LEFT JOIN $g_mantis_group_user_list_table u + ON g.id=u.group_id AND u.user_id='$c_user_id' + WHERE g.enabled=1 AND + u.user_id IS NULL + ORDER BY g.groupname"; + $result = db_query( $query ); + $category_count = db_num_rows( $result ); + for ($i=0;$i<$category_count;$i++) { + $row = db_fetch_array( $result ); + $t_group_name = $row['groupname']; + $t_user_id = $row['id']; + PRINT ""; + } + } + # -------------------- + # list of groups that a user is NOT in + function print_group_user_list( $p_user_id ) { + global $g_mantis_group_user_list_table, $g_mantis_group_table; + + $c_user_id = db_prepare_int( $p_user_id ); + + $query = "SELECT DISTINCT g.id, g.groupname + FROM $g_mantis_group_table g + LEFT JOIN $g_mantis_group_user_list_table u + ON g.id=u.group_id + WHERE g.enabled=1 AND + u.user_id='$c_user_id' + ORDER BY g.groupname"; + $result = db_query( $query ); + $category_count = db_num_rows( $result ); + for ($i=0;$i<$category_count;$i++) { + $row = db_fetch_array( $result ); + $t_group_id = $row['id']; + $t_group_name = $row['groupname']; + PRINT $t_group_name.' ['.$t_access_level.'] ('.$t_view_state.') ['. lang_get( 'remove_link' ).']
'; + } + } + + + # -------------------- + # list of users that are NOT in the specified group and that are enabled + function print_bug_group_list_option_list( $p_bug_id=null ) { + global $g_mantis_bug_group_list_table, $g_mantis_group_table; + + if ( null == $p_bug_id ) { + return; + } + $c_bug_id = (integer)$p_bug_id; + + $t_adm = ADMINISTRATOR; + $query = "SELECT DISTINCT u.id, u.groupname + FROM $g_mantis_group_table u + LEFT JOIN $g_mantis_bug_group_list_table g + ON g.group_id=u.id AND g.bug_id='$c_bug_id' + WHERE u.access_level<$t_adm AND + u.enabled = 1 AND + g.group_id IS NULL AND + u.access_level<'$t_adm' + ORDER BY u.groupname"; + $result = db_query( $query ); + $category_count = db_num_rows( $result ); + for ($i=0;$i<$category_count;$i++) { + $row = db_fetch_array( $result ); + $t_groupname = $row['groupname']; + $t_group_id = $row['id']; + PRINT ""; + } + } + + # -------------------- ########################################################################### Index: lang/strings_english.txt =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/lang/strings_english.txt,v retrieving revision 1.154 diff -u -r1.154 strings_english.txt --- lang/strings_english.txt 22 Feb 2004 04:26:48 -0000 1.154 +++ lang/strings_english.txt 26 May 2004 18:12:55 -0000 @@ -203,6 +203,9 @@ $MANTIS_ERROR[ERROR_VERSION_NOT_FOUND] = 'Version not found.'; $MANTIS_ERROR[ERROR_USER_NAME_INVALID] = 'The username is invalid. Usernames may only contain letters, numbers, spaces, hyphens, and underscores.'; $MANTIS_ERROR[ERROR_USER_DOES_NOT_HAVE_REQ_ACCESS] = 'User does not have required access level'; +$MANTIS_ERROR[ERROR_GROUP_NAME_INVALID] = 'ERROR: The groupname is invalid.'; +$MANTIS_ERROR[ERROR_GROUP_NOT_FOUND] = 'ERROR: The group was not found.'; +$MANTIS_ERROR[ERROR_GROUP_NAME_NOT_UNIQUE] = 'ERROR: The groupname is not unique.'; $s_login_error = 'ERROR: your account may be disabled or the username/password you entered is incorrect.'; $s_login_cookies_disabled = 'ERROR: Your browser either doesn\'t know how to handle cookies, or refuses to handle them.'; @@ -532,6 +535,24 @@ $s_last_visit = 'Last Visit'; $s_edit_user_link = 'Edit User'; +# manage_group_page.php +$s_manage_groups_link = 'Manage Groups'; +$s_manage_groups_title = 'Manage Groups'; +$s_new_groups_title = 'New Groups'; +$s_create_new_group_link = 'Create New Group'; +$s_groupname = 'Groupname'; +$s_update_group_button = 'Update Group'; +$s_group_level = 'Group Level'; + +# manage_group_create_page.php +$s_create_new_group_title = 'Create New Group'; +$s_create_group_button = 'Create Group'; +$s_group_add_user_title = 'Add User to Group'; + +# manage_create_new_group.php +$s_created_group_part1 = 'Created group'; +$s_created_group_part2 = 'with an access level of'; + # manage_proj_add.php $s_project_added_msg = 'Project has been successfully added...'; @@ -634,6 +655,14 @@ $s_manage_user_protected_msg = 'Account protected. Access level and enabled protected. Otherwise, account has been updated...'; $s_manage_user_updated_msg = 'Account successfully updated...'; +# manage_group_page.php +$s_edit_group_title = 'Edit Group'; +$s_delete_group_button = 'Delete Group'; + +# manage_group_update.php +$s_manage_group_protected_msg = 'Group protected. Access level and enabled protected. Otherwise, account has been updated...'; +$s_manage_group_updated_msg = 'Group successfully updated...'; + # menu_inc.php $s_main_link = 'Main'; $s_view_bugs_link = 'View Bugs'; @@ -724,6 +753,12 @@ # proj_user_update.php $s_updated_user_msg = 'Successfully updated user'; +# bug_group_add +$s_bug_add_group_title = 'Add Group to View List'; +$s_bug_group_list_title = 'Group View List'; +$s_add_group_button = 'Add Group'; +$s_manage_view_list_title = 'Manage View List'; + # report_add.php $s_must_enter_category = 'You must select a category'; $s_must_enter_severity = 'You must select a severity'; Index: bug_group_add.php =================================================================== RCS file: bug_group_add.php diff -N bug_group_add.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ bug_group_add.php 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,25 @@ + + + Index: bug_group_remove.php =================================================================== RCS file: bug_group_remove.php diff -N bug_group_remove.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ bug_group_remove.php 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,22 @@ + + + Index: manage_group_create.php =================================================================== RCS file: manage_group_create.php diff -N manage_group_create.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ manage_group_create.php 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,60 @@ + + + + +
+
+' . $f_groupname . ' ' . lang_get( 'created_group_part2' ) . ' ' . $t_access_level . '
'; + + print_bracket_link( $t_redirect_url, lang_get( 'proceed' ) ); +?> +
+ + Index: manage_group_create_page.php =================================================================== RCS file: manage_group_create_page.php diff -N manage_group_create_page.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ manage_group_create_page.php 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,73 @@ + + + +
+
+
+ + + + +> + + + +> + + + +> + + + +> + + + + + + +
+ +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+
+
+ + Index: manage_group_edit_page.php =================================================================== RCS file: manage_group_edit_page.php diff -N manage_group_edit_page.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ manage_group_edit_page.php 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,187 @@ + + + + + +
+ + + +
+
+ + + + + + + +> + + + + + +> + + + + + +> + + + + + +> + + + + + + + + +
+ + +
+ : + + +
+ : + + +
+ : + + /> +
+ : + + /> +
+ +
+
+
+ +
+ + + + +
+
+
+ + + + + + + + + + +
+ +
+ + + + + +
+
+
+ + + +
+
+ + + + + + + + + + + + > + + + + + + +
+ +
+ + + + + + + +
+ + + + + + + +
+
+ + Index: manage_group_page.php =================================================================== RCS file: manage_group_page.php diff -N manage_group_page.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ manage_group_page.php 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,173 @@ + + + + + + + + + + +
+ + + + +> + + +
+ () [] +
+ +
+ + + + + +
+ + + + + + + + + + + + + +> + + + + + + + +
+ [] + + +
+ + + + /> + +
+
+ + + + + + + + + + + + + + +
+ +
+ + + Index: manage_group_update.php =================================================================== RCS file: manage_group_update.php diff -N manage_group_update.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ manage_group_update.php 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,81 @@ + + + + + + + +
+
+'; + } else if ( $result ) { # SUCCESS + echo lang_get( 'operation_successful' ) . '
'; + } else { # FAILURE + print_sql_error( $query ); + } + + print_bracket_link( $t_redirect_url, lang_get( 'proceed' ) ); +?> +
+ + Index: manage_group_user_add.php =================================================================== RCS file: manage_group_user_add.php diff -N manage_group_user_add.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ manage_group_user_add.php 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,25 @@ + + + Index: manage_group_user_remove.php =================================================================== RCS file: manage_group_user_remove.php diff -N manage_group_user_remove.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ manage_group_user_remove.php 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,27 @@ + + + Index: core/group_api.php =================================================================== RCS file: core/group_api.php diff -N core/group_api.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ core/group_api.php 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,606 @@ + 0 ) { + return false; + } else { + return true; + } + } + + # -------------------- + # Check if the groupname is unique and trigger an ERROR if it isn't + function group_ensure_name_unique( $p_groupname ) { + if ( ! group_is_name_unique( $p_groupname ) ) { + trigger_error( ERROR_USER_NAME_NOT_UNIQUE, ERROR ); + } + } + + # -------------------- + # Check if the groupname is a valid username (does not account for uniqueness) + # Return true if it is, false otherwise + function group_is_name_valid( $p_groupname ) { + # The DB field is only 32 characters + if ( strlen( $p_groupname ) > 32 ) { + return false; + } + + # Only allow a basic set of characters + if ( 0 == preg_match( '/^\w+$/', $p_groupname ) ) { + return false; + } + + # We have a valid groupname + return true; + } + + # -------------------- + # Check if the groupname is a valid groupname (does not account for uniqueness) + # Trigger an error if the username is not valid + function group_ensure_name_valid( $p_groupname ) { + if ( ! group_is_name_valid( $p_groupname ) ) { + trigger_error( ERROR_USER_NAME_INVALID, ERROR ); + } + } + + # -------------------- + # return whether user is monitoring bug for the user id and bug id + # -- NOT IMPLEMENTED YET --- dwoods + /* + function group_is_monitoring_bug( $p_group_id, $p_bug_id ) { + $c_group_id = db_prepare_int( $p_group_id ); + $c_bug_id = db_prepare_int( $p_bug_id ); + + $t_bug_monitor_table = config_get( 'mantis_bug_monitor_table' ); + + $query = "SELECT COUNT(*) + FROM $t_bug_monitor_table + WHERE user_id='$c_group_id' AND bug_id='$c_bug_id'"; + + $result = db_query( $query ); + + if ( 0 == db_result( $result ) ) { + return false; + } else { + return true; + } + } + */ + + # -------------------- + # return true if the user has access of ADMINISTRATOR or higher, false otherwise + # --- NOT IMPLEMENTED YET --- dwoods + /* + function group_is_development( $p_group_id ) { + $t_access_level = user_get_field( $p_group_id, 'access_level' ); + + if ( $t_access_level >= DEVELOPER ) { + return true; + } else { + return false; + } + } + */ + + # -------------------- + # return true is the group account is protected, false otherwise + function group_is_protected( $p_group_id ) { + return ( ON == group_get_field( $p_group_id, 'protected' ) ); + } + + # -------------------- + # Trigger an ERROR if the group is protected + function group_ensure_unprotected( $p_group_id ) { + if ( group_is_protected( $p_group_id ) ) { + trigger_error( ERROR_PROTECTED_ACCOUNT, ERROR ); + } + } + + # -------------------- + # return true is the group is enabled, false otherwise + function group_is_enabled( $p_group_id ) { + return ( ON == group_get_field( $p_group_id, 'enabled' ) ); + } + + #=================================== + # Creation / Deletion / Updating + #=================================== + + # -------------------- + # Create a user. + # returns false if error, the generated cookie string if ok + function group_create( $p_groupname, $p_access_level=null, $p_protected=false, $p_enabled=true ) { + if ( null === $p_access_level ) { + $p_access_level = config_get( 'default_new_group_access_level'); + } + + $c_groupname = db_prepare_string( $p_groupname ); + $c_access_level = db_prepare_int( $p_access_level ); + $c_protected = db_prepare_bool( $p_protected ); + $c_enabled = db_prepare_bool( $p_enabled ); + + group_ensure_name_valid( $p_groupname ); + group_ensure_name_unique( $p_groupname ); + + $t_seed = $p_username; + $t_cookie_string = auth_generate_unique_cookie_string( $t_seed ); + + $t_group_table = config_get( 'mantis_group_table' ); + + $query = "INSERT INTO $t_group_table + ( id, groupname, date_created, enabled, protected, + access_level, cookie_string ) + VALUES + ( null, '$c_groupname', NOW(), $c_enabled, $c_protected, + $c_access_level, '$t_cookie_string')"; + db_query( $query ); + + return $t_cookie_string; + } + + # -------------------- + # delete agroup + # returns true when the account was successfully deleted + function group_delete( $p_group_id ) { + $c_group_id = db_prepare_int($p_group_id); + + group_ensure_unprotected( $p_group_id ); + + $t_group_table = config_get('mantis_group_table'); + $t_group_user_list_table = config_get('mantis_group_user_list_table'); + + # Remove account + $query = "DELETE + FROM $t_group_table + WHERE id='$c_group_id'"; + db_query( $query ); + + $query = "DELETE + FROM $t_group_user_list_table + WHERE group_id='$c_group_id'"; + db_query( $query ); + + group_clear_cache( $p_group_id ); + + return true; + } + + #=================================== + # Data Access + #=================================== + + # -------------------- + # get a group id from a groupname + # return false if the groupname does not exist + function group_get_id_by_name( $p_groupname ) { + $c_groupname = db_prepare_string( $p_groupname ); + + $t_group_table = config_get( 'mantis_group_table' ); + + $query = "SELECT id + FROM $t_group_table + WHERE groupname='$c_groupname'"; + $result = db_query( $query ); + + if ( 0 == db_num_rows( $result ) ) { + return false; + } else { + return db_result( $result ); + } + } + + # -------------------- + # return all data associated with a particular group name + # return false if the groupname does not exist + function group_get_row_by_name( $p_groupname ) { + $t_group_id = group_get_id_by_name( $p_groupname ); + + if ( false === $t_group_id ) { + return false; + } + + $row = group_get_row( $t_group_id ); + + return $row; + } + + # -------------------- + # return a group row + function group_get_row( $p_group_id ) { + return group_cache_row( $p_group_id ); + } + + # -------------------- + # return the specified group field for the group id + function group_get_field( $p_group_id, $p_field_name ) { + if ( NO_GROUP == $p_group_id ) { + trigger_error( 'group_get_field() for NO_GROUP', WARNING ); + return "@null@"; + } + + $row = group_get_row( $p_group_id ); + + if ( isset( $row[$p_field_name] ) ) { + return $row[$p_field_name]; + } else { + trigger_error( ERROR_DB_FIELD_NOT_FOUND, WARNING ); + return ''; + } + } + + # -------------------- + # return the groupname or a string saying "group no longer exists" + # if the group does not exist + function group_get_name( $p_group_id ) { + $row = group_cache_row( $p_group_id, false ); + + if ( false == $row ) { + return lang_get( 'prefix_for_deleted_groups' ) . (integer)$p_group_id; + } else { + return $row['groupname']; + } + } + + # -------------------- + # return the groups's access level + function group_get_access_level( $p_group_id ) { + $t_access_level = group_get_field( $p_group_id, 'access_level' ); + + return $t_access_level; + } + + # -------------------- + # check to see if the user/group combo already exists + # returns true is duplicate is found, otherwise false + function group_includes_user( $p_group_id, $p_user_id ) { + $t_group_user_list_table = config_get( 'mantis_group_user_list_table' ); + + $c_group_id = db_prepare_int( $p_group_id ); + $c_user_id = db_prepare_int( $p_user_id ); + + $query = "SELECT COUNT(*) + FROM $t_group_user_list_table + WHERE group_id='$c_group_id' AND + user_id='$c_user_id'"; + $result = db_query( $query ); + + if ( 0 == db_result( $result ) ) { + return false; + } else { + return true; + } + } + + # -------------------- + # Return an array of info about users who are part of the given group + # For each user we have 'id', 'username', and 'access_level' (overall access level) + # If the second parameter is given, return only users with an access level + # higher than the given value. + function group_get_all_user_rows( $p_group_id, $p_access_level=ANYBODY ) { + $c_group_id = db_prepare_int( $p_group_id ); + + # Optimization when access_level is NOBODY + if ( NOBODY == $p_access_level ) { + return array(); + } + + $t_user_table = config_get( 'mantis_user_table' ); + $t_group_user_list_table = config_get( 'mantis_group_user_list_table' ); + + $t_on = ON; + + $t_access_level = $p_access_level; + + $t_access_clause = ''; + + if ( $t_access_level > 0 ) { + $t_access_clause = ' AND access_level >= ' . $t_access_level; + } + + $t_users = array(); + + $query = "SELECT id, username, access_level + FROM $t_user_table + WHERE enabled = $t_on + $t_access_clause + ORDER BY username"; + + $result = db_query( $query ); + $t_row_count = db_num_rows( $result ); + for ( $i=0 ; $i < $t_row_count ; $i++ ) { + $row = db_fetch_array( $result ); + $t_users[$row['id']] = $row; + } + + $query = "SELECT u.id, u.username + FROM $t_group_user_list_table l, $t_user_table u + WHERE l.user_id = u.id + AND u.enabled = $t_on + AND l.group_id = $c_group_id + ORDER BY u.username"; + + $result = db_query( $query ); + $t_row_count = db_num_rows( $result ); + for ( $i=0 ; $i < $t_row_count ; $i++ ) { + $row = db_fetch_array( $result ); + $f_access_level = $t_users[$row['id']]['access_level']; + if ( $f_access_level >= $p_access_level ) { + $t_users[$row['id']] = $row; + $t_users[$row['id']]['access_level'] = $f_access_level; + } else { + # If user's overridden level is lower than required, so remove + # them from the list if they were previously there + unset( $t_users[$row['id']] ); + } + } + + return multi_sort( array_values($t_users), 'username' ); + } + + # -------------------- + # Return an array of user_id's that belong to the given group, if their access + # level is above the access given. + function group_get_users( $p_group_id, $p_access_level=ANYBODY ) { + $c_group_id = db_prepare_int( $p_group_id ); + + # Optimization when access_level is NOBODY + if ( NOBODY == $p_access_level ) { + return array(); + } + + $t_user_table = config_get( 'mantis_user_table' ); + $t_group_user_list_table = config_get( 'mantis_group_user_list_table' ); + + $t_on = ON; + + $t_access_level = $p_access_level; + + $t_access_clause = ''; + + if ( $t_access_level > 0 ) { + $t_access_clause = ' AND access_level >= ' . $t_access_level; + } + + $t_users = array(); + + // Get the project overrides + $query = "SELECT u.id, u.username + FROM $t_group_user_list_table l, $t_user_table u + WHERE l.user_id = u.id + AND u.enabled = $t_on + AND l.group_id = $c_group_id + ORDER BY u.username"; + + $result = db_query( $query ); + $t_row_count = db_num_rows( $result ); + for ( $i=0 ; $i < $t_row_count ; $i++ ) { + $row = db_fetch_array( $result ); + + if ( $f_access_level >= $p_access_level ) { + $t_users[$row['id']] = $row; + array_push( $t_users, $row['id'] ); + } + } + + return $t_users; + } + + + #=================================== + # Data Modification + #=================================== + + # -------------------- + # add user to a group + function group_add_user( $p_group_id, $p_user_id ) { + $t_group_user_list_table = config_get( 'mantis_group_user_list_table' ); + + $c_group_id = db_prepare_int( $p_group_id ); + $c_user_id = db_prepare_int( $p_user_id ); + + $query = "INSERT + INTO $t_group_user_list_table + ( group_id, user_id ) + VALUES + ( '$c_group_id', '$c_user_id' )"; + + db_query( $query ); + + # db_query errors on failure so: + return true; + } + + # -------------------- + # remove user from group + function group_remove_user( $p_group_id, $p_user_id ) { + $t_group_user_list_table = config_get( 'mantis_group_user_list_table' ); + + $c_group_id = db_prepare_int( $p_group_id ); + $c_user_id = db_prepare_int( $p_user_id ); + + $query = "DELETE FROM $t_group_user_list_table + WHERE group_id='$c_group_id' AND + user_id='$c_user_id'"; + + db_query( $query ); + + # db_query errors on failure so: + return true; + } + + # -------------------- + # delete all users from the group user list for a given group + # this is useful when deleting a group + function group_remove_all_users( $p_group_id ) { + $t_group_user_list_table = config_get( 'mantis_group_user_list_table' ); + + $c_group_id = db_prepare_int( $p_group_id ); + + $query = "DELETE FROM $t_group_user_list_table + WHERE group_id='$c_group_id'"; + + db_query( $query ); + + # db_query errors on failure so: + return true; + } + + # -------------------- + # Set a group field + function group_set_field( $p_group_id, $p_field_name, $p_field_value ) { + $c_group_id = db_prepare_int( $p_group_id ); + $c_field_name = db_prepare_string( $p_field_name ); + $c_field_value = db_prepare_string( $p_field_value ); + + group_ensure_unprotected( $p_group_id ); + + $t_group_table = config_get( 'mantis_group_table' ); + + $query = "UPDATE $t_group_table + SET $c_field_name='$c_field_value' + WHERE id='$c_group_id'"; + + db_query( $query ); + + group_clear_cache( $p_group_id ); + + #db_query() errors on failure so: + return true; + } + + # -------------------- + # + + # -------------------- + # Set the user's groupname to the given string after checking that it is valid + function group_set_name( $p_group_id, $p_groupname ) { + group_ensure_name_valid( $p_groupname ); + group_ensure_name_unique( $p_groupname ); + + return group_set_field( $p_group_id, 'groupname', $p_groupname ); + } + + +?>