} else { if ($t_reopen_issue && $t_existing_bug->status < $t_closed_status && $t_existing_bug->reporter_id === auth_get_current_user_id() && config_get('allow_reporter_reopen')) { $t_can_bypass_status_access_thresholds = true; } } if (!$t_can_bypass_status_access_thresholds) { trigger_error(ERROR_ACCESS_DENIED, ERROR); } } if ($t_reopen_issue) { # for everyone allowed to reopen an issue, set the reopen resolution $t_updated_bug->resolution = config_get('bug_reopen_resolution'); } } # Validate any change to the handler of an issue. $t_issue_is_sponsored = sponsorship_get_amount(sponsorship_get_all_ids($f_bug_id)) > 0; if ($t_existing_bug->handler_id !== $t_updated_bug->handler_id) { access_ensure_bug_level(config_get('update_bug_assign_threshold'), $f_bug_id); if ($t_issue_is_sponsored && !access_has_bug_level(config_get('handle_sponsored_bugs_threshold'), $f_bug_id)) { trigger_error(ERROR_SPONSORSHIP_HANDLER_ACCESS_LEVEL_TOO_LOW, ERROR); } if ($t_updated_bug->handler_id !== NO_USER) { if (!access_has_bug_level(config_get('handle_bug_threshold'), $f_bug_id, $t_updated_bug->handler_id)) { trigger_error(ERROR_HANDLER_ACCESS_TOO_LOW, ERROR); } if ($t_issue_is_sponsored && !access_has_bug_level(config_get('assign_sponsored_bugs_threshold'), $f_bug_id)) { trigger_error(ERROR_SPONSORSHIP_ASSIGNER_ACCESS_LEVEL_TOO_LOW, ERROR); } } } # Check whether the category has been undefined when it's compulsory.
require_api('bug_api.php'); require_api('collapse_api.php'); require_api('config_api.php'); require_api('constant_inc.php'); require_api('current_user_api.php'); require_api('form_api.php'); require_api('helper_api.php'); require_api('lang_api.php'); require_api('print_api.php'); require_api('sponsorship_api.php'); require_api('utility_api.php'); # # Determine whether the sponsorship section should be shown. # if (config_get('enable_sponsorship') == ON && access_has_bug_level(config_get('view_sponsorship_total_threshold'), $f_bug_id)) { $t_sponsorship_ids = sponsorship_get_all_ids($f_bug_id); $t_sponsorships_exist = count($t_sponsorship_ids) > 0; $t_can_sponsor = !bug_is_readonly($f_bug_id) && !current_user_is_anonymous(); $t_show_sponsorships = $t_sponsorships_exist || $t_can_sponsor; } else { $t_show_sponsorships = false; } # # Sponsorship Box # if ($t_show_sponsorships) { ?> <a id="sponsorships"></a> <br /> <?php
/** * Update bug to reflect sponsorship change * This is to be called after adding/updating/deleting sponsorships * @param int $p_bug_id * @return null */ function sponsorship_update_bug($p_bug_id) { $t_total_amount = sponsorship_get_amount(sponsorship_get_all_ids($p_bug_id)); bug_set_field($p_bug_id, 'sponsorship_total', $t_total_amount); bug_update_date($p_bug_id); }
/** * Build the bug raw data visible for specified user to be translated and sent by email to the user * (Filter the bug data according to user access level) * return array with bug data. See usage in email_format_bug_message(...) * @param int $p_user_id * @param int $p_bug_id * @param string $p_message_id * @return array */ function email_build_visible_bug_data($p_user_id, $p_bug_id, $p_message_id) { $t_project_id = bug_get_field($p_bug_id, 'project_id'); $t_user_access_level = user_get_access_level($p_user_id, $t_project_id); $t_user_bugnote_order = user_pref_get_pref($p_user_id, 'bugnote_order'); $t_user_bugnote_limit = user_pref_get_pref($p_user_id, 'email_bugnote_limit'); $row = bug_get_extended_row($p_bug_id); $t_bug_data = array(); $t_bug_data['email_bug'] = $p_bug_id; if ($p_message_id !== 'email_notification_title_for_action_bug_deleted') { $t_bug_data['email_bug_view_url'] = string_get_bug_view_url_with_fqdn($p_bug_id); } if (access_compare_level($t_user_access_level, config_get('view_handler_threshold'))) { if (0 != $row['handler_id']) { $t_bug_data['email_handler'] = user_get_name($row['handler_id']); } else { $t_bug_data['email_handler'] = ''; } } $t_bug_data['email_reporter'] = user_get_name($row['reporter_id']); $t_bug_data['email_project_id'] = $row['project_id']; $t_bug_data['email_project'] = project_get_field($row['project_id'], 'name'); $t_category_name = category_full_name($row['category_id'], false); $t_bug_data['email_category'] = $t_category_name; $t_bug_data['email_date_submitted'] = $row['date_submitted']; $t_bug_data['email_last_modified'] = $row['last_updated']; $t_bug_data['email_status'] = $row['status']; $t_bug_data['email_severity'] = $row['severity']; $t_bug_data['email_priority'] = $row['priority']; $t_bug_data['email_reproducibility'] = $row['reproducibility']; $t_bug_data['email_resolution'] = $row['resolution']; $t_bug_data['email_fixed_in_version'] = $row['fixed_in_version']; if (!is_blank($row['target_version']) && access_compare_level($t_user_access_level, config_get('roadmap_view_threshold'))) { $t_bug_data['email_target_version'] = $row['target_version']; } $t_bug_data['email_summary'] = $row['summary']; $t_bug_data['email_description'] = $row['description']; $t_bug_data['email_additional_information'] = $row['additional_information']; $t_bug_data['email_steps_to_reproduce'] = $row['steps_to_reproduce']; $t_bug_data['set_category'] = '[' . $t_bug_data['email_project'] . '] ' . $t_category_name; $t_bug_data['custom_fields'] = custom_field_get_linked_fields($p_bug_id, $t_user_access_level); $t_bug_data['bugnotes'] = bugnote_get_all_visible_bugnotes($p_bug_id, $t_user_bugnote_order, $t_user_bugnote_limit, $p_user_id); # put history data if (ON == config_get('history_default_visible') && access_compare_level($t_user_access_level, config_get('view_history_threshold'))) { $t_bug_data['history'] = history_get_raw_events_array($p_bug_id, $p_user_id); } # Sponsorship Information if (config_get('enable_sponsorship') == ON && access_has_bug_level(config_get('view_sponsorship_total_threshold'), $p_bug_id, $p_user_id)) { $t_sponsorship_ids = sponsorship_get_all_ids($p_bug_id); $t_bug_data['sponsorship_total'] = sponsorship_get_amount($t_sponsorship_ids); if (access_has_bug_level(config_get('view_sponsorship_details_threshold'), $p_bug_id, $p_user_id)) { $t_bug_data['sponsorships'] = array(); foreach ($t_sponsorship_ids as $id) { $t_bug_data['sponsorships'][] = sponsorship_get($id); } } } $t_bug_data['relations'] = relationship_get_summary_text($p_bug_id); return $t_bug_data; }
/** * allows bug deletion : * delete the bug, bugtext, bugnote, and bugtexts selected * @param array p_bug_id integer representing bug id * @return bool (always true) * @access public */ function bug_delete($p_bug_id) { $c_bug_id = (int) $p_bug_id; $t_bug_table = db_get_table('bug'); $t_bug_text_table = db_get_table('bug_text'); # call pre-deletion custom function helper_call_custom_function('issue_delete_validate', array($p_bug_id)); # log deletion of bug history_log_event_special($p_bug_id, BUG_DELETED, bug_format_id($p_bug_id)); email_bug_deleted($p_bug_id); # call post-deletion custom function. We call this here to allow the custom function to access the details of the bug before # they are deleted from the database given it's id. The other option would be to move this to the end of the function and # provide it with bug data rather than an id, but this will break backward compatibility. helper_call_custom_function('issue_delete_notify', array($p_bug_id)); # Unmonitor bug for all users bug_unmonitor($p_bug_id, null); # Delete custom fields custom_field_delete_all_values($p_bug_id); # Delete bugnotes bugnote_delete_all($p_bug_id); # Delete all sponsorships sponsorship_delete(sponsorship_get_all_ids($p_bug_id)); # MASC RELATIONSHIP # we delete relationships even if the feature is currently off. relationship_delete_all($p_bug_id); # MASC RELATIONSHIP # Delete files file_delete_attachments($p_bug_id); # Detach tags tag_bug_detach_all($p_bug_id, false); # Delete the bug history history_delete($p_bug_id); # Delete bug info revisions bug_revision_delete($p_bug_id); # Delete the bugnote text $t_bug_text_id = bug_get_field($p_bug_id, 'bug_text_id'); $query = "DELETE FROM {$t_bug_text_table}\n\t\t\t\t WHERE id=" . db_param(); db_query_bound($query, array($t_bug_text_id)); # Delete the bug entry $query = "DELETE FROM {$t_bug_table}\n\t\t\t\t WHERE id=" . db_param(); db_query_bound($query, array($c_bug_id)); bug_clear_cache($p_bug_id); bug_text_clear_cache($p_bug_id); # db_query errors on failure so: return true; }
if (bug_is_readonly($f_bug_id) || !access_has_bug_level(access_get_status_threshold($f_new_status, $t_bug->project_id), $f_bug_id, $t_current_user_id)) { access_denied(); } } } $t_can_update_due_date = access_has_bug_level(config_get('due_date_update_threshold'), $f_bug_id); if ($t_can_update_due_date) { require_js('jscalendar/calendar.js'); require_js('jscalendar/lang/calendar-en.js'); require_js('jscalendar/calendar-setup.js'); require_css('calendar-blue.css'); } # get new issue handler if set, otherwise default to original handler $f_handler_id = gpc_get_int('handler_id', $t_bug->handler_id); if (config_get('bug_assigned_status') == $f_new_status) { $t_bug_sponsored = config_get('enable_sponsorship') && sponsorship_get_amount(sponsorship_get_all_ids($f_bug_id)) > 0; if ($t_bug_sponsored && !access_has_bug_level(config_get('assign_sponsored_bugs_threshold'), $f_bug_id)) { trigger_error(ERROR_SPONSORSHIP_ASSIGNER_ACCESS_LEVEL_TOO_LOW, ERROR); } if ($f_handler_id != NO_USER) { if (!access_has_bug_level(config_get('handle_bug_threshold'), $f_bug_id, $f_handler_id)) { trigger_error(ERROR_HANDLER_ACCESS_TOO_LOW, ERROR); } if ($t_bug_sponsored && !access_has_bug_level(config_get('handle_sponsored_bugs_threshold'), $f_bug_id, $f_handler_id)) { trigger_error(ERROR_SPONSORSHIP_HANDLER_ACCESS_LEVEL_TOO_LOW, ERROR); } } } $t_status_label = str_replace(' ', '_', MantisEnum::getLabel(config_get('status_enum_string'), $f_new_status)); html_page_top(bug_format_summary($f_bug_id, SUMMARY_CAPTION)); print_recently_visited();
function bug_delete($p_bug_id) { $c_bug_id = db_prepare_int($p_bug_id); $t_bug_table = config_get('mantis_bug_table'); $t_bug_text_table = config_get('mantis_bug_text_table'); # log deletion of bug history_log_event_special($p_bug_id, BUG_DELETED, bug_format_id($p_bug_id)); email_bug_deleted($p_bug_id); # Unmonitor bug for all users bug_unmonitor($p_bug_id, null); # Delete custom fields custom_field_delete_all_values($p_bug_id); # Delete bugnotes bugnote_delete_all($p_bug_id); # Delete all sponsorships sponsorship_delete(sponsorship_get_all_ids($p_bug_id)); # MASC RELATIONSHIP # we delete relationships even if the feature is currently off. relationship_delete_all($p_bug_id); # MASC RELATIONSHIP # Delete files file_delete_attachments($p_bug_id); # Delete the bug history history_delete($p_bug_id); # Delete the bugnote text $t_bug_text_id = bug_get_field($p_bug_id, 'bug_text_id'); $query = "DELETE FROM {$t_bug_text_table}\n\t\t\t\t WHERE id='{$t_bug_text_id}'"; db_query($query); # Delete the bug entry $query = "DELETE FROM {$t_bug_table}\n\t\t\t\t WHERE id='{$c_bug_id}'"; db_query($query); bug_clear_cache($p_bug_id); bug_text_clear_cache($p_bug_id); # db_query() errors on failure so: return true; }