diff -rU5 mantisbt-1.2.8/api/soap/mantisconnect.php mantisbt-1.2.8-wepl/api/soap/mantisconnect.php --- mantisbt-1.2.8/api/soap/mantisconnect.php 2011-09-06 16:23:10.000000000 +0200 +++ mantisbt-1.2.8-wepl/api/soap/mantisconnect.php 2011-09-11 19:41:48.000000000 +0200 @@ -88,11 +88,12 @@ '', array( 'id' => array( 'name' => 'id', 'type' => 'xsd:integer', 'minOccurs' => '0'), 'name' => array( 'name' => 'name', 'type' => 'xsd:string', 'minOccurs' => '0'), 'real_name' => array( 'name' => 'real_name', 'type' => 'xsd:string', 'minOccurs' => '0'), - 'email' => array( 'name' => 'email', 'type' => 'xsd:string', 'minOccurs' => '0') + 'email' => array( 'name' => 'email', 'type' => 'xsd:string', 'minOccurs' => '0'), + 'access' => array( 'name' => 'access', 'type' => 'xsd:integer','minOccurs' => '0') ) ); ### AccountDataArray $l_oServer->wsdl->addComplexType( @@ -358,10 +359,11 @@ 'struct', 'all', '', array( 'id' => array( 'name' => 'id', 'type' => 'xsd:integer', 'minOccurs' => '0' ), + 'parent_id' => array( 'name' => 'parent_id', 'type' => 'xsd:integer', 'minOccurs' => '0' ), 'name' => array( 'name' => 'name', 'type' => 'xsd:string', 'minOccurs' => '0' ), 'status' => array( 'name' => 'status', 'type' => 'tns:ObjectRef', 'minOccurs' => '0' ), 'enabled' => array( 'name' => 'enabled', 'type' => 'xsd:boolean', 'minOccurs' => '0' ), 'view_state' => array( 'name' => 'view_state', 'type' => 'tns:ObjectRef', 'minOccurs' => '0' ), 'access_min' => array( 'name' => 'access_min', 'type' => 'tns:ObjectRef', 'minOccurs' => '0' ), @@ -988,10 +990,30 @@ false, false, false, 'Get the data for the specified issue attachment.' ); ### +### PUBLIC METHODS (defined in mc_account_api.php) +### + +### mc_account_add +$l_oServer->register( 'mc_account_add', + array( + 'username' => 'xsd:string', + 'password' => 'xsd:string', + 'account' => 'tns:AccountData', + 'account_password' => 'xsd:string' + ), + array( + 'return' => 'xsd:integer' + ), + $t_namespace, + false, false, false, + 'Add a new user to the tracker (must have admin privileges)' +); + +### ### PUBLIC METHODS (defined in mc_project_api.php) ### ### mc_project_add $l_oServer->register( 'mc_project_add', @@ -1086,10 +1108,27 @@ $t_namespace, false, false, false, 'Get the issue headers that match the specified project id and paging details.' ); +### mc_project_add_user +$l_oServer->register( 'mc_project_add_user', + array( + 'username' => 'xsd:string', + 'password' => 'xsd:string', + 'project_id' => 'xsd:integer', + 'user_id' => 'xsd:integer', + 'access' => 'xsd:integer' + ), + array( + 'return' => 'xsd:integer' + ), + $t_namespace, + false, false, false, + 'Add a user to a project with access level.' +); + ### mc_project_get_users $l_oServer->register( 'mc_project_get_users', array( 'username' => 'xsd:string', 'password' => 'xsd:string', @@ -1116,10 +1155,24 @@ $t_namespace, false, false, false, 'Get the list of projects that are accessible to the logged in user.' ); +### mc_projects_get_names_user_accessible +$l_oServer->register( 'mc_projects_get_names_user_accessible', + array( + 'username' => 'xsd:string', + 'password' => 'xsd:string' + ), + array( + 'return' => 'tns:ProjectDataArray' + ), + $t_namespace, + false, false, false, + 'Get the list of name/id of projects that are accessible to the logged in user.' +); + ### mc_project_get_categories $l_oServer->register( 'mc_project_get_categories', array( 'username' => 'xsd:string', 'password' => 'xsd:string', diff -rU5 mantisbt-1.2.8/api/soap/mc_account_api.php mantisbt-1.2.8-wepl/api/soap/mc_account_api.php --- mantisbt-1.2.8/api/soap/mc_account_api.php 2011-09-06 16:23:09.000000000 +0200 +++ mantisbt-1.2.8-wepl/api/soap/mc_account_api.php 2011-09-11 19:41:48.000000000 +0200 @@ -35,5 +35,46 @@ $t_result[] = mci_account_get_array_by_id( $t_user_id ); } return $t_result; } + +/** +* Add a new user. +* +* @param string $p_username The name of the user trying to create an account. +* @param string $p_password The password of the user. +* @param Array $p_user A new AccountData structure +* @return integer the new users's users_id +*/ +function mc_account_add( $p_username, $p_password, $p_user, $p_pass ) { + $t_user_id = mci_check_login( $p_username, $p_password ); + if ( $t_user_id === false ) { + return new soap_fault( 'Client', '', 'Access Denied', 'Username/password combination was incorrect'); + } + + if ( !mci_has_administrator_access( $t_user_id ) ) { + return new soap_fault( 'Client', '', 'Access Denied', 'User does not have administrator access'); + } + + extract( $p_user, EXTR_PREFIX_ALL, 'v'); + + // validate user object + if ( is_blank($v_name) ) return new soap_fault('Client', '', 'Mandatory field "name" was missing'); + if ( is_blank($v_real_name) ) return new soap_fault('Client', '', 'Mandatory field "real_name" was missing'); + if ( is_blank($v_email) ) return new soap_fault('Client', '', 'Mandatory field "email" was missing'); + + if ( !user_is_name_valid( $v_name ) ) return new soap_fault( 'Client', '', 'user name invalid'); + if ( !user_is_name_unique( $v_name ) ) return new soap_fault( 'Client', '', 'user name exists'); + if ( !user_is_realname_valid( $v_real_name ) ) return new soap_fault( 'Client', '', 'real name invalid'); + + // set defaults + if ( is_null( $v_access ) ) $v_access = VIEWER; + + // create user account and get it's id + user_create($v_name, $p_pass, $v_email, $v_access, false, true, $v_real_name); + $t_user_id = user_get_id_by_name($v_name); + + // return id of new user back to caller + return $t_user_id; +} + diff -rU5 mantisbt-1.2.8/api/soap/mc_api.php mantisbt-1.2.8-wepl/api/soap/mc_api.php --- mantisbt-1.2.8/api/soap/mc_api.php 2011-09-06 16:23:10.000000000 +0200 +++ mantisbt-1.2.8-wepl/api/soap/mc_api.php 2011-09-11 19:41:48.000000000 +0200 @@ -207,10 +207,24 @@ } return $t_result; } +# Gets the name/id of all sub-projects that are accessible to the specified user / project. +function mci_user_get_names_accessible_subprojects( $p_user_id, $p_parent_project_id ) { + $t_result = array(); + foreach( user_get_accessible_subprojects( $p_user_id, $p_parent_project_id ) as $t_subproject_id ) { + $t_subproject_row = project_cache_row( $t_subproject_id ); + $t_subproject = array(); + $t_subproject['id'] = $t_subproject_id; + $t_subproject['name'] = $t_subproject_row['name']; + $t_subproject['subprojects'] = mci_user_get_names_accessible_subprojects( $p_user_id, $t_subproject_id ); + $t_result[] = $t_subproject; + } + return $t_result; +} + function translate_category_name_to_id( $p_category_name, $p_project_id ) { if ( !isset( $p_category_name ) ) { return 0; } diff -rU5 mantisbt-1.2.8/api/soap/mc_issue_api.php mantisbt-1.2.8-wepl/api/soap/mc_issue_api.php --- mantisbt-1.2.8/api/soap/mc_issue_api.php 2011-09-06 16:23:10.000000000 +0200 +++ mantisbt-1.2.8-wepl/api/soap/mc_issue_api.php 2011-09-11 20:13:12.000000000 +0200 @@ -645,11 +645,14 @@ $t_bug_data->additional_information = isset( $p_issue['additional_information'] ) ? $p_issue['additional_information'] : ''; # submit the issue $t_issue_id = $t_bug_data->create(); - mci_issue_set_custom_fields( $t_issue_id, $p_issue['custom_fields'], false ); + $t_fault = mci_issue_set_custom_fields( $t_issue_id, $p_issue['custom_fields'], false ); + if ($t_fault) { + return new soap_fault( 'Client', '', "mci_issue_set_custom_fields failed" . $t_fault ); + } 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 ) { diff -rU5 mantisbt-1.2.8/api/soap/mc_project_api.php mantisbt-1.2.8-wepl/api/soap/mc_project_api.php --- mantisbt-1.2.8/api/soap/mc_project_api.php 2011-09-06 16:23:10.000000000 +0200 +++ mantisbt-1.2.8-wepl/api/soap/mc_project_api.php 2011-09-11 19:41:48.000000000 +0200 @@ -78,10 +78,42 @@ return $t_result; } /** + * Get (only) the id and name for all projects accessible by the given user. + * + * @param string $p_username The name of the user trying to access the project list. + * @param string $p_password The password of the user. + * @return Array suitable to be converted into a ProjectDataArray + */ +function mc_projects_get_names_user_accessible( $p_username, $p_password ) { + $t_user_id = mci_check_login( $p_username, $p_password ); + if( $t_user_id === false ) { + return new soap_fault( 'Client', '', 'Access Denied' ); + } + + if( !mci_has_readonly_access( $t_user_id ) ) { + return new soap_fault( 'Client', '', 'Access Denied' ); + } + + $t_lang = mci_get_user_lang( $t_user_id ); + + $t_result = array(); + foreach( user_get_accessible_projects( $t_user_id ) as $t_project_id ) { + $t_project_row = project_cache_row( $t_project_id ); + $t_project = array(); + $t_project['id'] = $t_project_id; + $t_project['name'] = $t_project_row['name']; + $t_project['subprojects'] = mci_user_get_names_accessible_subprojects( $t_user_id, $t_project_id, $t_lang ); + $t_result[] = $t_project; + } + + return $t_result; +} + +/** * Get all categories of a project. * * @param string $p_username The name of the user trying to access the categories. * @param string $p_password The password of the user. * @param integer $p_project_id The id of the project to retrieve the categories for. @@ -732,20 +764,42 @@ $t_inherit_global = $p_project['inherit_global']; } else { $t_inherit_global = true; } + if ( isset( $p_project['parent_id'] ) ) { + $t_parent_id = $p_project['parent_id']; + if ( !project_exists( $t_parent_id ) ) { + return new soap_fault( 'Client', '', 'Parent project does not exist', ''); + } + } else { + $t_parent_id = false; + } + // check to make sure project doesn't already exist if( !project_is_name_unique( $t_name ) ) { return new soap_fault( 'Client', '', 'Project name exists', 'The project name you attempted to add exists already' ); } $t_project_status = mci_get_project_status_id( $t_status ); $t_project_view_state = mci_get_project_view_state_id( $t_view_state ); - // project_create returns the new project's id, spit that out to webservice caller - return project_create( $t_name, $t_description, $t_project_status, $t_project_view_state, $t_file_path, $t_enabled, $t_inherit_global ); + // project_create returns the new project's id + $t_project_id = project_create( $t_name, $t_description, $t_project_status, $t_project_view_state, $t_file_path, $t_enabled, $t_inherit_global ); + + // link new project to a parent project, if one has been specified + if ( $t_parent_id ) { + // link to parent + project_hierarchy_add($t_project_id, $t_parent_id); + + // copy custom fields from parent + project_copy_custom_fields($t_project_id, $t_parent_id); + } + + // return id of new project back to caller + return $t_project_id; + } /** * Update a project * @@ -903,10 +957,42 @@ return $t_result; } /** + * Link a user to a project with a specified access level. + * + * @param string $p_username The name of the user trying to add the user (must be administrator) + * @param string $p_password The password of the user. + * @param integer $p_project_id The id of the project to link user to. + * @param integer $p_user_id The id of the user to link to the project. + * @param integer $p_access access level. + * @return bool returns true or false depending on the success of the action + */ +function mc_project_add_user( $p_username, $p_password, $p_project_id, $p_user_id, $p_access ) { + $t_user_id = mci_check_login( $p_username, $p_password ); + if ( $t_user_id === false ) { + return new soap_fault( 'Client', '', 'Access Denied' ); + } + if ( !mci_has_administrator_access( $t_user_id ) ) { + return new soap_fault( 'Client', '', 'Access Denied', 'User does not have administrator access'); + } + + if ( !project_exists( $p_project_id ) ) { + return new soap_fault( 'Client', '', "Project '$p_project_id' does not exist." ); + } + if ( !user_exists( $p_user_id ) ) { + return new soap_fault( 'Client', '', "User '$p_user_id' does not exist." ); + } + + // add the user to the project + $t_status = project_set_user_access( $p_project_id, $p_user_id, $p_access ); + + return $t_status; +} + +/** * Get appropriate users assigned to a project by access level. * * @param string $p_username The name of the user trying to access the versions. * @param string $p_password The password of the user. * @param integer $p_project_id The id of the project to retrieve the users for. diff -rU5 mantisbt-1.2.8/core/bug_api.php mantisbt-1.2.8-wepl/core/bug_api.php --- mantisbt-1.2.8/core/bug_api.php 2011-09-06 16:23:10.000000000 +0200 +++ mantisbt-1.2.8-wepl/core/bug_api.php 2011-09-11 19:41:48.000000000 +0200 @@ -345,10 +345,12 @@ $t_status = config_get( 'bug_assigned_status' ); } else { $t_status = $this->status; } + $c_date_submitted = !is_blank( $this->date_submitted ) ? $this->date_submitted : db_now(); + # Insert the rest of the data $query = "INSERT INTO $t_bug_table ( project_id,reporter_id, handler_id,duplicate_id, priority,severity, reproducibility,status, resolution,projection, category_id,date_submitted, @@ -364,11 +366,11 @@ " . db_param() . ',' . db_param() . ',' . db_param() . ',' . db_param() . ", " . db_param() . ',' . db_param() . ',' . db_param() . ',' . db_param() . ", " . db_param() . ',' . db_param() . ',' . db_param() . ',' . db_param() . ", " . db_param() . ',' . db_param() . ',' . db_param() . ',' . db_param() . ')'; - db_query_bound( $query, Array( $this->project_id, $this->reporter_id, $this->handler_id, $this->duplicate_id, $this->priority, $this->severity, $this->reproducibility, $t_status, $this->resolution, $this->projection, $this->category_id, db_now(), db_now(), $this->eta, $t_text_id, $this->os, $this->os_build, $this->platform, $this->version, $this->build, $this->profile_id, $this->summary, $this->view_state, $this->sponsorship_total, $this->sticky, $this->fixed_in_version, $this->target_version, $this->due_date ) ); + db_query_bound( $query, Array( $this->project_id, $this->reporter_id, $this->handler_id, $this->duplicate_id, $this->priority, $this->severity, $this->reproducibility, $t_status, $this->resolution, $this->projection, $this->category_id, $c_date_submitted, db_now(), $this->eta, $t_text_id, $this->os, $this->os_build, $this->platform, $this->version, $this->build, $this->profile_id, $this->summary, $this->view_state, $this->sponsorship_total, $this->sticky, $this->fixed_in_version, $this->target_version, $this->due_date ) ); $this->id = db_insert_id( $t_bug_table ); # log new bug history_log_event_special( $this->id, NEW_BUG );