$Date: 2006-10-06 04:09:22 -0500 (Fri, 06 Oct 2006) $ | > $Revision: 611 $ | > $Author: matt $ +--------------------------------------------------------------------------- | | > Email Error Logs Stuff | > Module written by Matt Mecham | > Date started: 7th April 2004 | | > Module Version Number: 1.0.0 | > DBA Checked: Mon 24th May 2004 +-------------------------------------------------------------------------- */ /** * ACP MODULE: ACP Permissions * * Manage ACP permissions * * @package InvisionPowerBoard * @subpackage ActionAdmin * @author Matt Mecham * @version 2.1 * @since 2.1.0.2005-07-08 */ /** * */ if ( ! defined( 'IN_ACP' ) ) { print "
";print_r($tabinit);echo ""; $tab_html = $this->html->acp_xml_tabs( $onoff, $this->member_id, $tabinit ); //print $tab_html;exit; //------------------------------- // What to do? //------------------------------- if ( $this->perm_main ) { //------------------------------- // Show side menu w/ global opt //------------------------------- if ( $this->member_info['_perm_cache'][ $this->perm_main ] ) { $content = $this->acpperms_xml_show_global(); } else { $content = $this->html->acp_xml_tab_no_access( $this->member_info ); } } else { //------------------------------- // Show welcome screen //------------------------------- $content = $this->acpperms_xml_show_welcome(); } //------------------------------- // Print //------------------------------- if ( IPB_ACP_AJAX_UTF_CONVERT ) { $tab_html = $this->ipsclass->txt_convert_charsets($tab_html, $this->ipsclass->vars['gb_char_set'], 'utf-8'); $content = $this->ipsclass->txt_convert_charsets($content, $this->ipsclass->vars['gb_char_set'], 'utf-8'); } print $this->html->acp_xml_wrap( $tab_html, $content ); exit(); } /*-------------------------------------------------------------------------*/ // ACP Perms: XML Display: Global /*-------------------------------------------------------------------------*/ /** * ACP Perms: XML display screen [ GLOBAL ] * * @return void * @since 2.1.0.2005-7-8 */ function acpperms_xml_show_global() { //------------------------------- // INIT //------------------------------- $content = ''; $sidebar = ''; $sidebar_content = ''; $rows = array(); $bits = array(); $menu_data = array(); $main = ''; $main_content = ''; $main_img_classes = array( 'tick' => 'img-boxed-off', 'cross' => 'img-boxed-off' ); $lang_map = array( 'add' => 'Разрешить ДОБАВЛЕНИЕ', 'edit' => 'Разрешить РЕДАКТИРОВАНИЕ', 'remove' => 'Разрешить УДАЛЕНИЕ', 'import' => 'Разрешить ИМПОРТИРОВАНИЕ', 'export' => 'Разрешить ЭКСПОРТИРОВАНИЕ', 'rebuild' => 'Разрешить ОБНОВЛЕНИЕ', 'recount' => 'Разрешить ПЕРЕСЧЕТ', 'recache' => 'Разрешить КЕШИРОВАНИЕ', 'view' => 'Разрешить ПРОСМОТР', 'search' => 'Разрешить ПОИСК', 'log' => 'Разрешить УПРАВЛЕНИЕ ЛОГАМИ', 'show' => 'Разрешить ПРОСМОТР ОСНОВНОГО', 'upload' => "Разрешить ЗАГРУЗКУ", 'do' => "Разрешить ПРИМЕНЕНИЕ", ); //------------------------------- // Not components? //------------------------------- if ( $this->perm_main != 'components' ) { //------------------------------- // Get all groups with this tab //------------------------------- $this->ipsclass->DB->cache_add_query( 'acpperms_get_main_groups', array( 'perm_main' => $this->perm_main ) ); $this->ipsclass->DB->cache_exec_query(); //------------------------------- // Loop through and build side //------------------------------- while ( $r = $this->ipsclass->DB->fetch_row() ) { $rows[] = $r; if ( ! $this->perm_child ) { //------------------------------- // Just set up the default one //------------------------------- $this->perm_child = $r['perm_child']; } } } else { //------------------------------- // Get component menus //------------------------------- $this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'components', 'where' => 'com_enabled=1', 'order' => 'com_position ASC' ) ); $this->ipsclass->DB->simple_exec(); while( $com = $this->ipsclass->DB->fetch_row() ) { $menu_data[ $com['com_section'] ] = unserialize( $com['com_menu_data'] ); if ( is_array( $menu_data[ $com['com_section'] ] ) and count( $menu_data[ $com['com_section'] ] ) ) { if ( ! $this->perm_child ) { $this->perm_child = $com['com_section']; } //------------------------------- // Populate rows //------------------------------- $rows[] = array( 'perm_main' => 'components', 'perm_child' => $com['com_section'] ); $this->lang[ 'components:'.$com['com_section'] ] = $com['com_title']; } } } //------------------------------- // Go froo the rows //------------------------------- foreach( $rows as $r ) { $key = $r['perm_main'].':'.$r['perm_child']; $lang_bit = $this->lang[ $key ]; $sidebar_content .= $this->perm_child == $r['perm_child'] ? $this->html->acp_xml_global_sidebar_link_chosen( $lang_bit, $this->member_id, $r['perm_main'], $r['perm_child'], intval($this->member_info['_perm_cache'][ $key ]) ) : $this->html->acp_xml_global_sidebar_link( $lang_bit, $this->member_id, $r['perm_main'], $r['perm_child'], intval($this->member_info['_perm_cache'][ $key ]) ); } $sidebar = $this->html->acp_xml_global_sidebar_wrap( $sidebar_content ); //------------------------------- // Get main content //------------------------------- $main_value = intval( $this->member_info['_perm_cache'][ $this->perm_main .':'. $this->perm_child ] ); $main_class = $main_value ? 'perms-green' : 'perms-red'; //------------------------------- // Not components? //------------------------------- if ( $this->perm_main != 'components' ) { $this->ipsclass->DB->build_query( array( 'select' => '*', 'from' => 'admin_permission_keys', 'where' => "perm_main='{$this->perm_main}' AND perm_child='{$this->perm_child}'", 'order' => 'perm_bit ASC' ) ); $this->ipsclass->DB->exec_query(); while ( $bit = $this->ipsclass->DB->fetch_row() ) { $bits[] = $bit; } } //------------------------------- // IS components //------------------------------- else { if( count($menu_data[ $this->perm_child ]) ) { foreach( $menu_data[ $this->perm_child ] as $menu_array ) { if ( $menu_array['menu_permbit'] ) { $bits[] = array( 'perm_main' => 'components', 'perm_child' => $this->perm_child, 'perm_bit' => $menu_array['menu_permbit'] ); if ( $menu_array['menu_permlang'] ) { $this->lang[ 'components:'.$this->perm_child.':'.$menu_array['menu_permbit'] ] = $menu_array['menu_permlang']; } } } } } //------------------------------- // Loop and print //------------------------------- foreach( $bits as $bit ) { $img_classes = array( 'tick' => 'img-boxed-off', 'cross' => 'img-boxed-off' ); # Set up key perm_main:perm_child:perm_bit $key = $this->perm_main.':'.$this->perm_child.':'.$bit['perm_bit']; # Got a specific language entry? Use it $lang_bit = $this->lang[ $key ] ? $this->lang[ $key ] : $lang_map[ $bit['perm_bit'] ]; # Got a row in the DB matching KEY? $value = intval( $this->member_info['_perm_cache'][ $key ] ); # Set up BG class for perm bit $class = $value ? 'perms-green' : 'perms-red'; # Set up BG class again... actually enabled this bit yet? $class = $main_value ? $class : 'perms-gray'; # Img classes - cross or ticked? $value ? $img_classes['tick'] = 'img-boxed' : $img_classes['cross'] = 'img-boxed'; $main_content .= $this->html->acp_xml_global_main_row( $lang_bit, $bit['perm_bit'], $value, $class, $img_classes ); } //------------------------------- // Set up main-wrap contents //------------------------------- # Img classes - cross or ticked? $main_value ? $main_img_classes['tick'] = 'img-boxed' : $main_img_classes['cross'] = 'img-boxed'; if( $main_content ) { $main = $this->html->acp_xml_global_main_wrap( $main_content, $main_class, $main_value, $main_img_classes ); } else { $main = $this->html->acp_xml_global_main_nocomponents( 'perm-gray' ); } //------------------------------- // Print it //------------------------------- return $this->html->acp_xml_main_wrap( $sidebar, $main ); } /*-------------------------------------------------------------------------*/ // ACP Perms: XML Display: Welcome /*-------------------------------------------------------------------------*/ /** * ACP Perms: XML display screen [ WELCOME ] * * @return void * @since 2.1.0.2005-7-8 */ function acpperms_xml_show_welcome() { //------------------------------- // INIT //------------------------------- $content = ''; //------------------------------- // Check... //------------------------------- return $this->html->acp_xml_welcome( $this->member_info ); } /*-------------------------------------------------------------------------*/ // ACP Perms: Add member complete /*-------------------------------------------------------------------------*/ /** * ACP Perms: Add member complete * * Checks input, adds row to DB if OK * * @return void * @since 2.1.0.2005-7-8 */ function acpperms_member_add_complete() { //------------------------------- // INIT //------------------------------- $name = trim( $this->ipsclass->input['entered_name'] ); $isok = 0; //------------------------------- // Check... //------------------------------- if ( ! $name ) { $this->ipsclass->main_msg = "Вы не указали имя пользователя."; $this->acpperms_member_add(); } //------------------------------- // Get member... //------------------------------- $this->ipsclass->DB->cache_add_query( 'login_getmember_by_dname', array( 'username' => strtolower($name) ) ); $this->ipsclass->DB->cache_exec_query(); $member = $this->ipsclass->DB->fetch_row(); //------------------------------- // Check... //------------------------------- if ( ! $member['id'] ) { $this->ipsclass->main_msg = "Пользователь «{$name}» не найден."; $this->acpperms_member_add(); } //------------------------------- // Already got 'em //------------------------------- $test = $this->ipsclass->DB->build_and_exec_query( array( 'select' => 'row_member_id', 'from' => 'admin_permission_rows', 'where' => 'row_member_id='.$member['id'] ) ); if ( $test['row_member_id'] ) { $this->ipsclass->main_msg = "Пользователь «{$name}» уже имеет ограничения доступа в админцентр."; $this->acpperms_member_add(); } //------------------------------- // Is Root admin? //------------------------------- if ( $this->ipsclass->vars['admin_group'] == $member['mgroup'] ) { $this->ipsclass->main_msg = "Пользователь «{$name}» не может быть ограничен, поскольку находится в группе главных администраторов."; $this->acpperms_member_add(); } //------------------------------- // Primary ACP group? //------------------------------- if ( $this->ipsclass->cache['group_cache'][ $member['mgroup'] ]['g_access_cp'] ) { $isok = 1; } //------------------------------- // Secondary ACP group? //------------------------------- else if ( $member['mgroup_others'] ) { foreach( explode( ',', $member['mgroup_others'] ) as $gid ) { if ( $this->ipsclass->cache['group_cache'][ $gid ]['g_access_cp'] ) { $isok = 1; break; } } } //------------------------------- // Not oK? //------------------------------- if ( ! $isok ) { $this->ipsclass->main_msg = "Пользователя «{$member['members_display_name']}» нельзя добавить, поскольку он не имеет доступ в админцентр."; $this->acpperms_member_add(); } //------------------------------- // A-OK //------------------------------- $this->ipsclass->DB->build_and_exec_query( array( 'delete' => 'admin_permission_rows', 'where' => 'row_member_id='.$member['id'] ) ); $this->ipsclass->DB->do_insert( 'admin_permission_rows', array( 'row_member_id' => $member['id'], 'row_perm_cache' => serialize( array() ), 'row_updated' => time() ) ); $this->ipsclass->main_msg = "Пользователь «{$member['members_display_name']}» успешно добавлен и сейчас не имеет доступа в админцентр, но вы можете дать ему права через управление ограничениями."; $this->acpperms_list(); } /*-------------------------------------------------------------------------*/ // ACP Perms: Add member form /*-------------------------------------------------------------------------*/ /** * ACP Perms: Add member form * * Shows form asking for input * * @return void * @since 2.1.0.2005-7-7 */ function acpperms_member_add() { $this->ipsclass->admin->nav[] = array( $this->ipsclass->form_code, 'Управление ограничениями' ); $this->ipsclass->admin->nav[] = array( '' , 'Добавить администратора' ); //------------------------------- // INIT //------------------------------- //------------------------------- // Show the form //------------------------------- $this->ipsclass->html .= $this->html->acp_perms_add_admin_form(); $this->ipsclass->admin->page_title = "Ограничение администратора"; $this->ipsclass->admin->page_detail = "Эта секция позволит вам управлять ограничением прав доступа в админцентр для администраторов."; $this->ipsclass->admin->output(); } /*-------------------------------------------------------------------------*/ // ACP: Import ACP Permissions file /*-------------------------------------------------------------------------*/ /** * Import XML file * * Grabs XML file, parses it and updates missing entries * * @return void * @since 2.1.0.2005-7-7 */ function acpperms_xml_import( $noreturn=0 ) { //----------------------------------------- // INIT //----------------------------------------- $updated = 0; $inserted = 0; $cur_perms = array(); //----------------------------------------- // Get file //----------------------------------------- if ( $_FILES['FILE_UPLOAD']['name'] == "" or ! $_FILES['FILE_UPLOAD']['name'] or ($_FILES['FILE_UPLOAD']['name'] == "none") ) { //----------------------------------------- // check and load from server //----------------------------------------- if ( ! $this->ipsclass->input['file_location'] ) { $this->ipsclass->main_msg = "Указанный файл не найден."; $this->acpperms_list(); } if ( ! file_exists( ROOT_PATH . $this->ipsclass->input['file_location'] ) ) { $this->ipsclass->main_msg = "Невозможно найти файл: " . ROOT_PATH . $this->ipsclass->input['file_location']; $this->acpperms_list(); } if ( preg_match( "#\.gz$#", $this->ipsclass->input['file_location'] ) ) { if ( $FH = @gzopen( ROOT_PATH.$this->ipsclass->input['file_location'], 'rb' ) ) { while ( ! @gzeof( $FH ) ) { $content .= @gzread( $FH, 1024 ); } @gzclose( $FH ); } } else { if ( $FH = @fopen( ROOT_PATH.$this->ipsclass->input['file_location'], 'rb' ) ) { $content = @fread( $FH, filesize(ROOT_PATH.$this->ipsclass->input['file_location']) ); @fclose( $FH ); } } } else { //----------------------------------------- // Get uploaded schtuff //----------------------------------------- $tmp_name = $_FILES['FILE_UPLOAD']['name']; $tmp_name = preg_replace( "#\.gz$#", "", $tmp_name ); $content = $this->ipsclass->admin->import_xml( $tmp_name ); } //----------------------------------------- // Get current permission keys. //----------------------------------------- $this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'admin_permission_keys' ) ); $this->ipsclass->DB->simple_exec(); while ( $r = $this->ipsclass->DB->fetch_row() ) { $cur_perms[ $r['perm_key'] ] = $r['perm_key']; } //----------------------------------------- // Get xml mah-do-dah //----------------------------------------- require_once( KERNEL_PATH.'class_xml.php' ); $xml = new class_xml(); //----------------------------------------- // Unpack the datafile //----------------------------------------- $xml->xml_parse_document( $content ); //----------------------------------------- // Fix up... //----------------------------------------- if ( ! is_array( $xml->xml_array['permsexport']['permsgroup']['perm'][0] ) ) { //----------------------------------------- // Ensure [0] is populated //----------------------------------------- $tmp = $xml->xml_array['permsexport']['permsgroup']['perm']; unset($xml->xml_array['permsexport']['permsgroup']['perm']); $xml->xml_array['permsexport']['permsgroup']['perm'][0] = $tmp; } //----------------------------------------- // Loop through and sort out settings... //----------------------------------------- foreach( $xml->xml_array['permsexport']['permsgroup']['perm'] as $entry ) { //----------------------------------------- // Do we have a row matching this already? //----------------------------------------- $_perm_main = $entry['acpperm_main']['VALUE']; $_perm_child = $entry['acpperm_child']['VALUE']; $_perm_bit = $entry['acpperm_bit']['VALUE']; $_perm_key = $_perm_main.':'.$_perm_child.':'.$_perm_bit; if ( ! $cur_perms[ $_perm_key ] ) { $this->ipsclass->DB->do_insert( 'admin_permission_keys', array( 'perm_key' => $_perm_key, 'perm_main' => $_perm_main, 'perm_child' => $_perm_child, 'perm_bit' => $_perm_bit ) ); $inserted++; } } $this->ipsclass->main_msg = "Добавлено ограничений: $inserted"; if ( ! $noreturn ) { $this->acpperms_list(); } } /*-------------------------------------------------------------------------*/ // ACP: DEV: Build report: Language file /*-------------------------------------------------------------------------*/ /** * Build language file basics * * Generate language files with empty keys * * @return void * @since 2.1.0.2005-7-7 */ function acpperms_dev_report_language() { $this->ipsclass->admin->nav[] = array( $this->ipsclass->form_code, 'Права доступа в админцентр: инструменты разработчика' ); //------------------------------- // INIT //------------------------------- $content = ""; $temp = ""; //------------------------------- // Pick through dir //------------------------------- $master = $this->_acpperms_parse_source_folder(); //------------------------------- // ...Check for matches //------------------------------- foreach( $master as $_name => $data ) { //------------------------------- // Got anything? //------------------------------- if ( $master[ $_name ]['perm_main'] AND $master[ $_name ]['perm_child'] AND count($master[ $_name ]['perm_bits']) ) { $permkey = $master[ $_name ]['perm_main'].':'.$master[ $_name ]['perm_child']; $temp[ $permkey ][] = str_pad("'".$permkey."'", 45, " " ) . "=>\t" . '"'. $this->lang[ $permkey ]. '",'."\n"; foreach( $master[ $_name ]['perm_bits'] as $_bit => $bit_data ) { $bitkey = $master[ $_name ]['perm_main'].':'.$master[ $_name ]['perm_child'].':'.$_bit; $temp[ $bitkey ][] = str_pad("'".$bitkey."'", 45, " " ) . "=>\t" . '"'. $bit_data['langstring']. '",'."\n"; } } } //------------------------------- // Re-order by key //------------------------------- ksort( $temp ); //------------------------------- // Implode //------------------------------- foreach( $temp as $data ) { foreach( $data as $line ) { $content .= $line; } } //------------------------------- // Add in single entries //------------------------------- foreach( array( 'admin', 'content', 'lookandfeel', 'components', 'tools', 'help' ) as $bitkey ) { $content .= str_pad("'".$bitkey."'", 45, " " ) . "=>\t" . '"'. $this->lang[ $bitkey ]. '",'."\n"; } $this->ipsclass->html .= ""; $this->ipsclass->admin->page_title = "Права доступа администраторов"; $this->ipsclass->admin->page_detail = "Эта секция позволит вам управлять правами доступа администраторов."; $this->ipsclass->admin->output(); } /*-------------------------------------------------------------------------*/ // ACP: DEV: Build report: Missing sources /*-------------------------------------------------------------------------*/ /** * Build missing files report * * Generate list of files which don't have permission info * * @return void * @since 2.1.0.2005-7-7 */ function acpperms_dev_report_missing() { $this->ipsclass->admin->nav[] = array( $this->ipsclass->form_code, 'Права доступа в админцентр: инструменты разработчика' ); //------------------------------- // INIT //------------------------------- $content = ""; //------------------------------- // Pick through dir //------------------------------- $master = $this->_acpperms_parse_source_folder(); //------------------------------- // ...Check for matches //------------------------------- foreach( $master as $_name => $data ) { //------------------------------- // Got anything? //------------------------------- if ( ! count($master[ $_name ]['perm_bits']) ) { $content .= "{$_name}.php нет информации о правах доступа....