Пример #1
0
/**
 * Add an issue to the database.
 *
 * @param string   $p_username The name of the user trying to add the issue.
 * @param string   $p_password The password of the user.
 * @param stdClass $p_issue    A IssueData structure containing information about the new issue.
 * @return integer The id of the created issue.
 */
function mc_issue_add($p_username, $p_password, stdClass $p_issue)
{
    global $g_project_override;
    $t_user_id = mci_check_login($p_username, $p_password);
    if ($t_user_id === false) {
        return mci_soap_fault_login_failed();
    }
    $p_issue = SoapObjectsFactory::unwrapObject($p_issue);
    $t_project = $p_issue['project'];
    $t_project_id = mci_get_project_id($t_project);
    $g_project_override = $t_project_id;
    # ensure that helper_get_current_project() calls resolve to this project id
    if (!mci_has_readwrite_access($t_user_id, $t_project_id)) {
        return mci_soap_fault_access_denied($t_user_id);
    }
    $t_handler_id = isset($p_issue['handler']) ? mci_get_user_id($p_issue['handler']) : 0;
    $t_priority_id = isset($p_issue['priority']) ? mci_get_priority_id($p_issue['priority']) : config_get('default_bug_priority');
    $t_severity_id = isset($p_issue['severity']) ? mci_get_severity_id($p_issue['severity']) : config_get('default_bug_severity');
    $t_status_id = isset($p_issue['status']) ? mci_get_status_id($p_issue['status']) : config_get('bug_submit_status');
    $t_reproducibility_id = isset($p_issue['reproducibility']) ? mci_get_reproducibility_id($p_issue['reproducibility']) : config_get('default_bug_reproducibility');
    $t_resolution_id = isset($p_issue['resolution']) ? mci_get_resolution_id($p_issue['resolution']) : config_get('default_bug_resolution');
    $t_projection_id = isset($p_issue['projection']) ? mci_get_projection_id($p_issue['projection']) : config_get('default_bug_resolution');
    $t_eta_id = isset($p_issue['eta']) ? mci_get_eta_id($p_issue['eta']) : config_get('default_bug_eta');
    $t_view_state_id = isset($p_issue['view_state']) ? mci_get_view_state_id($p_issue['view_state']) : config_get('default_bug_view_status');
    $t_summary = $p_issue['summary'];
    $t_description = $p_issue['description'];
    $t_notes = isset($p_issue['notes']) ? $p_issue['notes'] : array();
    # TODO: #17777: Add test case for mc_issue_add() and mc_issue_note_add() reporter override
    if (isset($p_issue['reporter'])) {
        $t_reporter_id = mci_get_user_id($p_issue['reporter']);
        if ($t_reporter_id != $t_user_id) {
            # Make sure that active user has access level required to specify a different reporter.
            $t_specify_reporter_access_level = config_get('webservice_specify_reporter_on_add_access_level_threshold');
            if (!access_has_project_level($t_specify_reporter_access_level, $t_project_id, $t_user_id)) {
                return mci_soap_fault_access_denied($t_user_id, 'Active user does not have access level required to specify a different issue reporter');
            }
        }
    } else {
        $t_reporter_id = $t_user_id;
    }
    if ($t_project_id == 0 || !project_exists($t_project_id)) {
        if ($t_project_id == 0) {
            return SoapObjectsFactory::newSoapFault('Client', "Project '" . $t_project->name . "' does not exist.");
        } else {
            return SoapObjectsFactory::newSoapFault('Client', "Project with id '" . $t_project_id . "' does not exist.");
        }
    }
    if (!access_has_project_level(config_get('report_bug_threshold'), $t_project_id, $t_user_id)) {
        return mci_soap_fault_access_denied('User \'' . $t_user_id . '\' does not have access right to report issues');
    }
    $t_access_check_result = mci_issue_handler_access_check($t_user_id, $t_project_id, 0, $t_handler_id);
    if ($t_access_check_result !== true) {
        return $t_access_check_result;
    }
    $t_category = isset($p_issue['category']) ? $p_issue['category'] : null;
    $t_category_id = translate_category_name_to_id($t_category, $t_project_id);
    if ($t_category_id == 0 && !config_get('allow_no_category')) {
        if (!isset($p_issue['category']) || is_blank($p_issue['category'])) {
            return SoapObjectsFactory::newSoapFault('Client', 'Category field must be supplied.');
        } else {
            return SoapObjectsFactory::newSoapFault('Client', 'Category \'' . $p_issue['category'] . '\' not found for project \'' . $t_project_id . '\'.');
        }
    }
    if (isset($p_issue['version']) && !is_blank($p_issue['version']) && !version_get_id($p_issue['version'], $t_project_id)) {
        $t_version = $p_issue['version'];
        $t_error_when_version_not_found = config_get('webservice_error_when_version_not_found');
        if ($t_error_when_version_not_found == ON) {
            $t_project_name = project_get_name($t_project_id);
            return SoapObjectsFactory::newSoapFault('Client', 'Version \'' . $t_version . '\' does not exist in project \'' . $t_project_name . '\'.');
        } else {
            $t_version_when_not_found = config_get('webservice_version_when_not_found');
            $t_version = $t_version_when_not_found;
        }
    }
    if (is_blank($t_summary)) {
        return SoapObjectsFactory::newSoapFault('Client', 'Mandatory field \'summary\' is missing.');
    }
    if (is_blank($t_description)) {
        return SoapObjectsFactory::newSoapFault('Client', 'Mandatory field \'description\' is missing.');
    }
    $t_bug_data = new BugData();
    $t_bug_data->profile_id = 0;
    $t_bug_data->project_id = $t_project_id;
    $t_bug_data->reporter_id = $t_reporter_id;
    $t_bug_data->handler_id = $t_handler_id;
    $t_bug_data->priority = $t_priority_id;
    $t_bug_data->severity = $t_severity_id;
    $t_bug_data->reproducibility = $t_reproducibility_id;
    $t_bug_data->status = $t_status_id;
    $t_bug_data->resolution = $t_resolution_id;
    $t_bug_data->projection = $t_projection_id;
    $t_bug_data->category_id = $t_category_id;
    $t_bug_data->date_submitted = isset($p_issue['date_submitted']) ? $p_issue['date_submitted'] : '';
    $t_bug_data->last_updated = isset($p_issue['last_updated']) ? $p_issue['last_updated'] : '';
    $t_bug_data->eta = $t_eta_id;
    $t_bug_data->profile_id = isset($p_issue['profile_id']) ? $p_issue['profile_id'] : 0;
    $t_bug_data->os = isset($p_issue['os']) ? $p_issue['os'] : '';
    $t_bug_data->os_build = isset($p_issue['os_build']) ? $p_issue['os_build'] : '';
    $t_bug_data->platform = isset($p_issue['platform']) ? $p_issue['platform'] : '';
    $t_bug_data->version = isset($p_issue['version']) ? $p_issue['version'] : '';
    $t_bug_data->fixed_in_version = isset($p_issue['fixed_in_version']) ? $p_issue['fixed_in_version'] : '';
    $t_bug_data->build = isset($p_issue['build']) ? $p_issue['build'] : '';
    $t_bug_data->view_state = $t_view_state_id;
    $t_bug_data->summary = $t_summary;
    $t_bug_data->sponsorship_total = isset($p_issue['sponsorship_total']) ? $p_issue['sponsorship_total'] : 0;
    if (isset($p_issue['sticky']) && access_has_project_level(config_get('set_bug_sticky_threshold', null, null, $t_project_id), $t_project_id)) {
        $t_bug_data->sticky = $p_issue['sticky'];
    }
    if (isset($p_issue['due_date']) && access_has_global_level(config_get('due_date_update_threshold'))) {
        $t_bug_data->due_date = SoapObjectsFactory::parseDateTimeString($p_issue['due_date']);
    } else {
        $t_bug_data->due_date = date_get_null();
    }
    if (access_has_project_level(config_get('roadmap_update_threshold'), $t_bug_data->project_id, $t_user_id)) {
        $t_bug_data->target_version = isset($p_issue['target_version']) ? $p_issue['target_version'] : '';
    }
    # omitted:
    # var $bug_text_id
    # $t_bug_data->profile_id;
    # extended info
    $t_bug_data->description = $t_description;
    $t_bug_data->steps_to_reproduce = isset($p_issue['steps_to_reproduce']) ? $p_issue['steps_to_reproduce'] : '';
    $t_bug_data->additional_information = isset($p_issue['additional_information']) ? $p_issue['additional_information'] : '';
    # submit the issue
    $t_issue_id = $t_bug_data->create();
    log_event(LOG_WEBSERVICE, 'created new issue id \'' . $t_issue_id . '\'');
    $t_set_custom_field_error = mci_issue_set_custom_fields($t_issue_id, $p_issue['custom_fields'], false);
    if ($t_set_custom_field_error != null) {
        return $t_set_custom_field_error;
    }
    if (isset($p_issue['monitors'])) {
        mci_issue_set_monitors($t_issue_id, $t_user_id, $p_issue['monitors']);
    }
    if (isset($t_notes) && is_array($t_notes)) {
        foreach ($t_notes as $t_note) {
            $t_note = SoapObjectsFactory::unwrapObject($t_note);
            if (isset($t_note['view_state'])) {
                $t_view_state = $t_note['view_state'];
            } else {
                $t_view_state = config_get('default_bugnote_view_status');
            }
            $t_note_type = isset($t_note['note_type']) ? (int) $t_note['note_type'] : BUGNOTE;
            $t_note_attr = isset($t_note['note_type']) ? $t_note['note_attr'] : '';
            $t_view_state_id = mci_get_enum_id_from_objectref('view_state', $t_view_state);
            $t_note_id = bugnote_add($t_issue_id, $t_note['text'], mci_get_time_tracking_from_note($t_issue_id, $t_note), $t_view_state_id == VS_PRIVATE, $t_note_type, $t_note_attr, $t_user_id, false);
            # don't send mail
            log_event(LOG_WEBSERVICE, 'bugnote id \'' . $t_note_id . '\' added to issue \'' . $t_issue_id . '\'');
        }
    }
    if (isset($p_issue['tags']) && is_array($p_issue['tags'])) {
        mci_tag_set_for_issue($t_issue_id, $p_issue['tags'], $t_user_id);
    }
    email_bug_added($t_issue_id);
    if ($t_bug_data->status != config_get('bug_submit_status')) {
        history_log_event($t_issue_id, 'status', config_get('bug_submit_status'));
    }
    if ($t_bug_data->resolution != config_get('default_bug_resolution')) {
        history_log_event($t_issue_id, 'resolution', config_get('default_bug_resolution'));
    }
    return $t_issue_id;
}
Пример #2
0
    }
    # copy attachments from parent
    if ($f_copy_attachments_from_parent) {
        file_copy_attachments($f_master_bug_id, $t_bug_id);
    }
}
helper_call_custom_function('issue_create_notify', array($t_bug_id));
# Allow plugins to post-process bug data with the new bug ID
event_signal('EVENT_REPORT_BUG', array($t_bug_data, $t_bug_id));
email_new_bug($t_bug_id);
// log status and resolution changes if they differ from the default
if ($t_bug_data->status != config_get('bug_submit_status')) {
    history_log_event($t_bug_id, 'status', config_get('bug_submit_status'));
}
if ($t_bug_data->resolution != config_get('default_bug_resolution')) {
    history_log_event($t_bug_id, 'resolution', config_get('default_bug_resolution'));
}
form_security_purge('bug_report');
html_page_top1();
if (!$f_report_stay) {
    html_meta_redirect('view_all_bug_page.php');
}
html_page_top2();
?>
<br />
<div align="center">
<?php 
echo lang_get('operation_successful') . '<br />';
print_bracket_link(string_get_bug_view_url($t_bug_id), sprintf(lang_get('view_submitted_bug_link'), $t_bug_id));
print_bracket_link('view_all_bug_page.php', lang_get('view_bugs_link'));
if ($f_report_stay) {
Пример #3
0
 function save_bug($p_project_id, $p_user_id)
 {
     require 'ProfileAcraExt.php';
     $t_project_id = $p_project_id;
     global $g_cache_current_user_id;
     $g_cache_current_user_id = $p_user_id;
     $t_bug_data = new BugData();
     $t_bug_data->project_id = $t_project_id;
     $t_bug_data->reporter_id = $p_user_id;
     $t_bug_data->build = gpc_get_string('APP_VERSION_CODE', '');
     $t_bug_data->platform = "Android";
     $t_bug_data->os = gpc_get_string('ANDROID_VERSION', '');
     //gpc_get_string( 'os', '' );
     $t_os_build = gpc_get_string('BUILD', '');
     if (preg_match('/DISPLAY\\s*=\\s*(.*)/', $t_os_build, $t_match)) {
         var_dump($t_match);
         $t_os_build = $t_match[1];
     } else {
         $t_os_build = gpc_get_string('ANDROID_VERSION', '');
     }
     $t_bug_data->os_build = $t_os_build;
     //gpc_get_string( 'os_build', '' );
     $t_bug_data->version = gpc_get_string('APP_VERSION_NAME', '');
     $t_bug_data->profile_id = profile_create_unique(ALL_USERS, $t_bug_data->platform, $t_bug_data->os, $t_bug_data->os_build, "");
     $t_bug_data->handler_id = gpc_get_int('handler_id', 0);
     $t_bug_data->view_state = gpc_get_int('view_state', config_get('default_bug_view_status', 'VS_PRIVATE', 'acra_reporter'));
     $t_bug_data->category_id = $this->get_category_id($p_project_id);
     //gpc_get_int( 'category_id', 0 );
     $t_bug_data->reproducibility = 10;
     //gpc_get_int( 'reproducibility', config_get( 'default_bug_reproducibility' ) );
     $t_bug_data->severity = CRASH;
     //gpc_get_int( 'severity', config_get( 'default_bug_severity' ) );
     $t_bug_data->priority = HIGH;
     //gpc_get_int( 'priority', config_get( 'default_bug_priority' ) );
     $t_bug_data->projection = gpc_get_int('projection', config_get('default_bug_projection'));
     $t_bug_data->eta = gpc_get_int('eta', config_get('default_bug_eta'));
     $t_bug_data->resolution = OPEN;
     //gpc_get_string('resolution', config_get( 'default_bug_resolution' ) );
     $t_bug_data->status = NEW_;
     //gpc_get_string( 'status', config_get( 'bug_submit_status' ) );
     $t_bug_data->description = gpc_get_string('STACK_TRACE');
     //gpc_get_string( 'description' );
     $t_bug_data->summary = get_bug_summary_by_version(gpc_get_string('APP_VERSION_NAME', ''), $t_bug_data->description, $t_project_id);
     $t_bug_data->steps_to_reproduce = gpc_get_string('LOGCAT', "");
     $t_bug_data->additional_information = gpc_get_string('CRASH_CONFIGURATION', "");
     $t_bug_data->due_date = gpc_get_string('USER_CRASH_DATE', '');
     if (is_blank($t_bug_data->due_date)) {
         $t_bug_data->due_date = date_get_null();
     }
     $f_files = gpc_get_file('ufile', null);
     /** @todo (thraxisp) Note that this always returns a structure */
     $f_report_stay = gpc_get_bool('report_stay', false);
     $f_copy_notes_from_parent = gpc_get_bool('copy_notes_from_parent', false);
     helper_call_custom_function('issue_create_validate', array($t_bug_data));
     # Validate the custom fields before adding the bug.
     $t_related_custom_field_ids = custom_field_get_linked_ids($t_bug_data->project_id);
     foreach ($t_related_custom_field_ids as $t_id) {
         $t_def = custom_field_get_definition($t_id);
         # Produce an error if the field is required but wasn't posted
         if (!gpc_isset_custom_field($t_id, $t_def['type']) && $t_def['require_report']) {
             error_parameters(lang_get_defaulted(custom_field_get_field($t_id, 'name')));
             trigger_error(ERROR_EMPTY_FIELD, ERROR);
         }
         if (!custom_field_validate($t_id, gpc_get_custom_field("custom_field_{$t_id}", $t_def['type'], NULL))) {
             error_parameters(lang_get_defaulted(custom_field_get_field($t_id, 'name')));
             trigger_error(ERROR_CUSTOM_FIELD_INVALID_VALUE, ERROR);
         }
     }
     # Allow plugins to pre-process bug data
     $t_bug_data = event_signal('EVENT_REPORT_BUG_DATA', $t_bug_data);
     # Ensure that resolved bugs have a handler
     if ($t_bug_data->handler_id == NO_USER && $t_bug_data->status >= config_get('bug_resolved_status_threshold')) {
         $t_bug_data->handler_id = $this->get_user_id();
     }
     # Create the bug
     $t_bug_id = $t_bug_data->create();
     # Mark the added issue as visited so that it appears on the last visited list.
     last_visited_issue($t_bug_id);
     # Handle the file upload
     if ($f_files != null) {
         $t_files = helper_array_transpose($f_files);
         if ($t_files != null) {
             foreach ($t_files as $t_file) {
                 if (!empty($t_file['name'])) {
                     file_add($t_bug_id, $t_file, 'bug');
                 }
             }
         }
     }
     # Handle custom field submission
     foreach ($t_related_custom_field_ids as $t_id) {
         # Do not set custom field value if user has no write access
         if (!custom_field_has_write_access($t_id, $t_bug_id)) {
             continue;
         }
         $t_def = custom_field_get_definition($t_id);
         if (!custom_field_set_value($t_id, $t_bug_id, gpc_get_custom_field("custom_field_{$t_id}", $t_def['type'], $t_def['default_value']), false)) {
             error_parameters(lang_get_defaulted(custom_field_get_field($t_id, 'name')));
             trigger_error(ERROR_CUSTOM_FIELD_INVALID_VALUE, ERROR);
         }
     }
     $f_master_bug_id = gpc_get_int('m_id', 0);
     $f_rel_type = gpc_get_int('rel_type', -1);
     if ($f_master_bug_id > 0) {
         # it's a child generation... let's create the relationship and add some lines in the history
         # update master bug last updated
         bug_update_date($f_master_bug_id);
         # Add log line to record the cloning action
         history_log_event_special($t_bug_id, BUG_CREATED_FROM, '', $f_master_bug_id);
         history_log_event_special($f_master_bug_id, BUG_CLONED_TO, '', $t_bug_id);
         if ($f_rel_type >= 0) {
             # Add the relationship
             relationship_add($t_bug_id, $f_master_bug_id, $f_rel_type);
             # Add log line to the history (both issues)
             history_log_event_special($f_master_bug_id, BUG_ADD_RELATIONSHIP, relationship_get_complementary_type($f_rel_type), $t_bug_id);
             history_log_event_special($t_bug_id, BUG_ADD_RELATIONSHIP, $f_rel_type, $f_master_bug_id);
             # update relationship target bug last updated
             bug_update_date($t_bug_id);
             # Send the email notification
             email_relationship_added($f_master_bug_id, $t_bug_id, relationship_get_complementary_type($f_rel_type));
         }
         # copy notes from parent
         if ($f_copy_notes_from_parent) {
             $t_parent_bugnotes = bugnote_get_all_bugnotes($f_master_bug_id);
             foreach ($t_parent_bugnotes as $t_parent_bugnote) {
                 $t_private = $t_parent_bugnote->view_state == VS_PRIVATE;
                 bugnote_add($t_bug_id, $t_parent_bugnote->note, $t_parent_bugnote->time_tracking, $t_private, $t_parent_bugnote->note_type, $t_parent_bugnote->note_attr, $t_parent_bugnote->reporter_id, FALSE, FALSE);
             }
         }
     }
     helper_call_custom_function('issue_create_notify', array($t_bug_id));
     # Allow plugins to post-process bug data with the new bug ID
     event_signal('EVENT_REPORT_BUG', array($t_bug_data, $t_bug_id));
     email_new_bug($t_bug_id);
     // log status and resolution changes if they differ from the default
     if ($t_bug_data->status != config_get('bug_submit_status')) {
         history_log_event($t_bug_id, 'status', config_get('bug_submit_status'));
     }
     if ($t_bug_data->resolution != config_get('default_bug_resolution')) {
         history_log_event($t_bug_id, 'resolution', config_get('default_bug_resolution'));
     }
     return $t_bug_id;
 }