%PDF- %PDF-
| Direktori : /www/loslex_o/tracker/core/commands/ |
| Current File : /www/loslex_o/tracker/core/commands/ConfigsGetCommand.php |
<?php
# MantisBT - A PHP based bugtracking system
# MantisBT is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# MantisBT is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with MantisBT. If not, see <http://www.gnu.org/licenses/>.
use Mantis\Exceptions\ClientException;
/**
* A command that gets a set of config options.
*
* The following query string parameters are supported:
* - option/option[]: can be a string or an array
* - project_id: an optional parameter for project id to get configs for. Default ALL_PROJECTS (0).
* - user_id: an optional parameter for user id to get configs for. Default current user.
* can be 0 for ALL_USERS.
*
* The response will include a config key that is an array of requested configs. Configs
* that are not public or are not defined will be filtered out, and request will still succeed.
* This is to make it easier to request configs that maybe defined in some versions of MantisBT
* but not others.
*
* Note that only users with ADMINISTRATOR access can fetch configuration for other users.
*/
class ConfigsGetCommand extends Command {
/**
* Array of option names
*/
private $options;
/**
* The project id to retrieve options for, or ALL_PROJECTS.
*/
private $project_id;
/**
* The user id to retrieve options for, or ALL_USERS
*/
private $user_id;
/**
* Constructor
*
* @param array $p_data The command data.
*/
function __construct( array $p_data ) {
parent::__construct( $p_data );
}
/**
* Validate the data.
*/
function validate() {
$this->options = $this->query( 'option' );
if( !is_array( $this->options ) ) {
$this->options = array( $this->options );
}
$this->project_id = $this->query( 'project_id' );
if( is_null( $this->project_id ) ) {
$this->project_id = ALL_PROJECTS;
}
if( $this->project_id != ALL_PROJECTS && !project_exists( $this->project_id ) ) {
throw new ClientException(
sprintf( "Project '%d' not found", $this->project_id ),
ERROR_PROJECT_NOT_FOUND,
array( $this->project_id ) );
}
$this->user_id = $this->query( 'user_id' );
if( is_null( $this->user_id ) ) {
$this->user_id = auth_get_current_user_id();
} else {
if( $this->user_id != ALL_USERS &&
$this->user_id != auth_get_current_user_id() &&
!current_user_is_administrator() ) {
throw new ClientException(
'Admin access required to get configs for other users',
ERROR_ACCESS_DENIED );
}
if( $this->user_id != ALL_USERS && !user_exists( $this->user_id ) ) {
throw new ClientException(
sprintf( "User '%d' not found.", $this->user_id ),
ERROR_USER_BY_ID_NOT_FOUND,
array( $this->user_id ) );
}
}
}
/**
* Process the command.
*
* @returns array Command response
*/
protected function process() {
$t_configs = array();
foreach( $this->options as $t_option ) {
# Filter out undefined configs rather than error, they may be valid in some MantisBT versions but not
# others.
if( !config_is_set( $t_option ) ) {
continue;
}
# Filter out private configs, since they can be private in some configs but public in others.
if( config_is_private( $t_option ) ) {
continue;
}
$t_value = config_get( $t_option, /* default */ null, $this->user_id, $this->project_id );
if( ConfigsGetCommand::config_is_enum( $t_option ) ) {
$t_value = ConfigsGetCommand::config_get_enum_as_array( $t_option, $t_value );
}
$t_config_pair = array(
'option' => $t_option,
'value' => $t_value
);
$t_configs[] = $t_config_pair;
}
# wrap all configs into a configs attribute to allow adding other information if needed in the future
# that belongs outside the configs response.
return array( 'configs' => $t_configs );
}
/**
* Checks if the specific config option is an enum.
*
* @param string $p_option The option name.
* @return bool true enum, false otherwise.
*/
private static function config_is_enum( $p_option ) {
return stripos( $p_option, '_enum_string' ) !== false;
}
/**
* Gets the enum config option as an array with the id as the key and the value
* as an array with name and label (localized name) keys.
*
* @param string $p_enum_name The enum config option name.
* @param string $p_enum_string_value The enum config option value.
* @return array The enum array.
*/
private static function config_get_enum_as_array( $p_enum_name, $p_enum_string_value ) {
$t_enum_assoc_array = MantisEnum::getAssocArrayIndexedByValues( $p_enum_string_value );
$t_localized_enum_string = lang_get( $p_enum_name );
$t_enum_array = array();
foreach( $t_enum_assoc_array as $t_id => $t_name ) {
$t_label = MantisEnum::getLocalizedLabel( $p_enum_string_value, $t_localized_enum_string, $t_id );
$t_enum_entry = array( 'id' => $t_id, 'name' => $t_name, 'label' => $t_label );
$t_enum_array[] = $t_enum_entry;
}
return $t_enum_array;
}
}