Files
IPB/upload/sources/action_admin/acppermissions.php
T
2025-12-19 00:24:35 -08:00

1372 lines
42 KiB
PHP

<?php
/*
+--------------------------------------------------------------------------
| Invision Power Board 2.2.2
| =============================================
| by Matthew Mecham
| (c) 2001 - 2006 Invision Power Services, Inc.
| http://www.invisionpower.com
| =============================================
| Web: http://www.invisionboard.com
| http://www.ibresource.ru/products/invisionpowerboard/
| Time: Monday 05th of March 2007 10:10:54 PM
| Release: e3790216629e5a2aaf37070b32237f06
| Licence Info: http://www.invisionboard.com/?license
| http://www.ibresource.ru/license
+---------------------------------------------------------------------------
| INVISION POWER BOARD ÍÅ ßÂËßÅÒÑß ÁÅÑÏËÀÒÍÛÌ ÏÐÎÃÐÀÌÌÍÛÌ ÎÁÅÑÏÅ×ÅÍÈÅÌ!
| Ïðàâà íà ÏÎ ïðèíàäëåæàò Invision Power Services
| Ïðàâà íà ïåðåâîä IBResource (http://www.ibresource.ru)
+---------------------------------------------------------------------------
| > $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 "<h1>Íåâåðíûé âõîä</h1> Ó âàñ íåò äîñòóïà ê ýòîìó ôàéëó. Åñëè ïðîâîäèëîñü îáíîâëåíèå, óáåäèòåñü, ÷òî íå çàáûëè îáíîâèòü ôàéë admin.php.";
exit();
}
/**
* ACP MODULE: ACP Permissions
*
* Manage ACP permissions
*
* @package InvisionPowerBoard
* @subpackage ActionAdmin
* @author Matt Mecham
* @version 2.1
* @since 2.1.0.2005-07-08
*/
class ad_acppermissions
{
/**
* Member info array
*
* @var array
*/
var $member_info = array();
/*-------------------------------------------------------------------------*/
// AUTO RUN
/*-------------------------------------------------------------------------*/
function auto_run()
{
//-----------------------------------------
// Make sure we're a root admin, or else!
//-----------------------------------------
if ( $this->ipsclass->member['mgroup'] != $this->ipsclass->vars['admin_group'] )
{
$this->ipsclass->admin->error("Èçâèíèòå, íî ýòè ôóíêöèè äîñòóïíû òîëüêî äëÿ ãëàâíûõ àäìèíèñòðàòîðîâ");
}
$this->html = $this->ipsclass->acp_load_template('cp_skin_admin');
//-----------------------------------------
// What to do?
//-----------------------------------------
switch( $this->ipsclass->input['code'] )
{
case 'acpperms-list':
$this->acpperms_list();
break;
case 'acpperms-dev-source-to-xml':
$this->acpperms_dev_source_to_xml();
break;
case 'acpperms-dev-report-missing':
$this->acpperms_dev_report_missing();
break;
case 'acpperms-dev-report-language':
$this->acpperms_dev_report_language();
break;
case 'accperms-xml-import':
$this->acpperms_xml_import();
break;
case 'acpperms-member-add':
$this->acpperms_member_add();
break;
case 'acpperms-member-add-complete':
$this->acpperms_member_add_complete();
break;
case 'accperms-member-remove':
$this->accperms_member_remove();
break;
case 'acpperms-xml-display':
$this->acpperms_xml_display();
break;
case 'acpperms-xml-save-tabs':
$this->acpperms_xml_save( 'tabs' );
break;
case 'acpperms-xml-save-group':
$this->acpperms_xml_save( 'group' );
break;
case 'acpperms-xml-save-mainbit':
$this->acpperms_xml_save( 'mainbit' );
break;
case 'acpperms-xml-save-bits':
$this->acpperms_xml_save( 'bits' );
break;
default:
$this->acpperms_list();
break;
}
}
/*-------------------------------------------------------------------------*/
// ACP Perms: Remove member (and call him names)
/*-------------------------------------------------------------------------*/
/**
* ACP Perms: XML display screen (depending on tab and other input)
*
* @return void
* @since 2.1.0.2005-7-11
*/
function accperms_member_remove()
{
//-------------------------------
// INIT
//-------------------------------
$member_id = intval( $this->ipsclass->input['mid'] );
//-------------------------------
// Check...
//-------------------------------
if ( ! $member_id )
{
$this->ipsclass->main_msg = "Âû íå óêàçàëè ID ïîëüçîâàòåëÿ";
}
//-------------------------------
// Remove member's row
//-------------------------------
$this->ipsclass->DB->build_and_exec_query( array( 'delete' => 'admin_permission_rows', 'where' => 'row_member_id='.$member_id ) );
//-------------------------------
// Print
//-------------------------------
$this->ipsclass->main_msg = "Îãðàíè÷åíèÿ äîñòóïà â àäìèíöåíòð óäàëåíû";
$this->acpperms_list();
}
/*-------------------------------------------------------------------------*/
// ACP Perms: XML Display
/*-------------------------------------------------------------------------*/
/**
* ACP Perms: XML display screen (depending on tab and other input)
*
* @return void
* @since 2.1.0.2005-7-11
*/
function acpperms_xml_save( $type='tabs' )
{
//-------------------------------
// INIT
//-------------------------------
$this->member_id = intval( $this->ipsclass->input['member_id'] );
$this->tab = trim( $this->ipsclass->input['tab'] ) ? trim( $this->ipsclass->input['tab'] ) : trim( $this->ipsclass->input['perm_main'] );
$this->perm_main = $this->tab;
$this->perm_child = trim( $this->ipsclass->input['perm_child'] );
$this->member_info = array();
//-------------------------------
// Check...
//-------------------------------
if ( ! $this->member_id )
{
exit();
}
//-------------------------------
// Get Member info
//-------------------------------
$this->ipsclass->DB->build_query( array( 'select' => 'p.*',
'from' => array( 'admin_permission_rows' => 'p' ),
'where' => 'p.row_member_id='.$this->member_id,
'add_join' => array( 0 => array(
'select' => 'm.*',
'from' => array( 'members' => 'm' ),
'where' => 'm.id=p.row_member_id',
'type' => 'inner' ) ),
'order' => 'm.members_display_name DESC' ) );
$this->ipsclass->DB->exec_query();
$this->member_info = $this->ipsclass->DB->fetch_row();
//-------------------------------
// Unpack array
//-------------------------------
$this->member_info['_perm_cache'] = unserialize( $this->member_info['row_perm_cache'] );
//-------------------------------
// What up?
//-------------------------------
switch( $type )
{
case 'tabs':
$this->member_info['_perm_cache'][ $this->perm_main ] = intval( $this->ipsclass->input['result'] );
break;
case 'mainbit':
$this->member_info['_perm_cache'][ $this->perm_main.':'.$this->perm_child ] = intval( $this->ipsclass->input['result'] );
break;
case 'bits':
//-------------------------------
// Get bits to save...
//-------------------------------
foreach( $_REQUEST as $key => $value )
{
if ( preg_match( "#^pbfs_(.+?)$#i", $key, $match ) )
{
if ( $match[1] )
{
$_bit = $match[1];
$_bitvalue = intval( $this->ipsclass->input[ $match[0] ] );
$this->member_info['_perm_cache'][ $this->perm_main.':'.$this->perm_child.':'.$_bit ] = intval( $_bitvalue );
}
}
}
break;
case 'group':
//-------------------------------
// Allow perms to this bit
//-------------------------------
$this->member_info['_perm_cache'][ $this->perm_main.':'.$this->perm_child ] = intval( $this->ipsclass->input['result'] );
//-------------------------------
// Get bits from DB
//-------------------------------
$this->ipsclass->DB->build_query( array( 'select' => '*', 'from' => 'admin_permission_keys', 'where' => "perm_main='{$this->perm_main}' AND perm_child='{$this->perm_child}'" ) );
$this->ipsclass->DB->exec_query();
while ( $r = $this->ipsclass->DB->fetch_row() )
{
if ( $r['perm_main'] AND $r['perm_child'] AND $r['perm_bit'] )
{
$this->member_info['_perm_cache'][ $r['perm_main'].':'.$r['perm_child'].':'.$r['perm_bit'] ] = intval( $this->ipsclass->input['result'] );
}
}
break;
}
$this->ipsclass->DB->do_update( 'admin_permission_rows', array( 'row_perm_cache' => serialize( $this->member_info['_perm_cache'] ),
'row_updated' => time() ), 'row_member_id='.$this->member_id );
//-------------------------------
// Print
//-------------------------------
$this->acpperms_xml_display();
}
/*-------------------------------------------------------------------------*/
// ACP Perms: XML Display
/*-------------------------------------------------------------------------*/
/**
* ACP Perms: XML display screen (depending on tab and other input)
*
* @return void
* @since 2.1.0.2005-7-11
*/
function acpperms_xml_display()
{
//-------------------------------
// INIT
//-------------------------------
$this->member_id = intval( $this->ipsclass->input['member_id'] );
$this->tab = trim( $this->ipsclass->input['tab'] ) ? trim( $this->ipsclass->input['tab'] ) : trim( $this->ipsclass->input['perm_main'] );
$this->func = trim( $this->ipsclass->input['func'] );
$this->perm_main = $this->tab;
$this->perm_child = trim( $this->ipsclass->input['perm_child'] );
$this->lang = array();
$this->member_info = array();
$tab_html = '';
$content = '';
$tabinit = array();
//-------------------------------
// Check...
//-------------------------------
if ( ! $this->member_id )
{
exit();
}
//-------------------------------
// Get lang: NEEDS SORTIN'
//-------------------------------
require_once( ROOT_PATH."cache/lang_cache/ru/acp_lang_acpperms.php" );
$this->lang = $lang;
//-------------------------------
// Get Member info
//-------------------------------
$this->ipsclass->DB->build_query( array( 'select' => 'p.*',
'from' => array( 'admin_permission_rows' => 'p' ),
'where' => 'p.row_member_id='.$this->member_id,
'add_join' => array( 0 => array(
'select' => 'm.*',
'from' => array( 'members' => 'm' ),
'where' => 'm.id=p.row_member_id',
'type' => 'inner' ) ),
'order' => 'm.members_display_name DESC' ) );
$this->ipsclass->DB->exec_query();
$this->member_info = $this->ipsclass->DB->fetch_row();
//-------------------------------
// Unpack array
//-------------------------------
$this->member_info['_perm_cache'] = unserialize( $this->member_info['row_perm_cache'] );
//-------------------------------
// Build tab HTML
//-------------------------------
$onoff['content'] = 'taboff';
$onoff['lookandfeel'] = 'taboff';
$onoff['tools'] = 'taboff';
$onoff['components'] = 'taboff';
$onoff['admin'] = 'taboff';
$onoff['help'] = 'taboff';
$onoff[ $this->tab ] = 'tabon';
foreach( $onoff as $t => $s )
{
$tabinit[ $t ] = intval($this->member_info['_perm_cache'][ $t ]);
}
//echo "<pre>";print_r($tabinit);echo "</pre>";
$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 .= "<textarea style='width:100%;height:400px'><"."?php\n#Íå çàïîëíÿéòå ïóñòûå ïîëÿ, îíè çàïîëíÿòñÿ àâòîìàòè÷åñêè\n\$lang = array(\n{$content}\n);\n?"."></textarea>";
$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 .= "<span style='color:red;font-weight:bold'>{$_name}.php íåò èíôîðìàöèè î ïðàâàõ äîñòóïà....</span><br />";
}
else
{
$content .= "<span style='color:green'>{$_name}.php åñòü èíôîðìàöèÿ î ïðàâàõ äîñòóïà....</span><br />";
}
}
$this->ipsclass->html .= $content;
$this->ipsclass->admin->page_title = "Ïðàâà äîñòóïà àäìèíèñòðàòîðîâ";
$this->ipsclass->admin->page_detail = "Ýòà ñåêöèÿ ïîçâîëèò âàì óïðàâëÿòü ïðàâàìè äîñòóïà àäìèíèñòðàòîðîâ.";
$this->ipsclass->admin->output();
}
/*-------------------------------------------------------------------------*/
// Go through sources, regex out permission checks, build XML document
/*-------------------------------------------------------------------------*/
/**
* Source folder to XML
*
* Generate new XML of permission bits
*
* @return void
* @since 2.1.0.2005-7-7
*/
function acpperms_dev_source_to_xml()
{
//-------------------------------
// INIT
//-------------------------------
$content = "";
//-------------------------------
// Pick through dir
//-------------------------------
$master = $this->_acpperms_parse_source_folder();
//-----------------------------------------
// Get xml mah-do-dah
//-----------------------------------------
require_once( KERNEL_PATH.'class_xml.php' );
$xml = new class_xml();
//-----------------------------------------
// Start...
//-----------------------------------------
$xml->xml_set_root( 'permsexport', array( 'exported' => time(), 'versionid' => '2.1.0', 'type' => 'master' ) );
//-----------------------------------------
// Get group
//-----------------------------------------
$xml->xml_add_group( 'permsgroup' );
//-------------------------------
// ...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']) )
{
foreach( $master[ $_name ]['perm_bits'] as $_bit => $bit_data )
{
$content = array();
$content[] = $xml->xml_build_simple_tag( 'acpperm_bit' , $bit_data['name'] );
$content[] = $xml->xml_build_simple_tag( 'acpperm_main' , $master[ $_name ]['perm_main'] );
$content[] = $xml->xml_build_simple_tag( 'acpperm_child' , $master[ $_name ]['perm_child'] );
$entry[] = $xml->xml_build_entry( 'perm', $content );
}
}
}
$xml->xml_add_entry_to_group( 'permsgroup', $entry );
$xml->xml_format_document();
//-----------------------------------------
// Send to browser.
//-----------------------------------------
$this->ipsclass->admin->show_download( $xml->xml_document, 'ipb_acpperms.xml', '', 0 );
exit();
}
/*-------------------------------------------------------------------------*/
// Go through sources, regex out permission checks
/*-------------------------------------------------------------------------*/
/**
* Parse sources folder
*
* Parse sources folder, put all perm into $master array
*
* @return array $master array
* @since 2.1.0.2005-7-7
*/
function _acpperms_parse_source_folder()
{
//-------------------------------
// INIT
//-------------------------------
$dir = ROOT_PATH . "sources/action_admin";
$master = array();
//-------------------------------
// Load lang file...
//-------------------------------
require_once( ROOT_PATH . 'cache/lang_cache/ru/acp_lang_acpperms.php' );
$this->lang = $lang;
//-------------------------------
// Loop....
//-------------------------------
$handle = opendir($dir);
while ( ( $file = readdir($handle) ) !== false )
{
if ( ($file != ".") && ($file != "..") && ($file != '.DS_Store') )
{
if ( is_file( $dir."/".$file ) )
{
//-------------------------------
// Open file and get perm rows
//-------------------------------
$code = implode( '', file( $dir."/".$file ) );
$_name = str_replace( ".php", "", $file );
$master[ $_name ] = array();
//-------------------------------
// Get perm main....
//-------------------------------
preg_match( '#var\s+?\$perm_main\s+?=\s+?[\'"](.+?)[\'"];#', $code, $match );
$master[ $_name ]['perm_main'] = $match[1];
//-------------------------------
// Get perm child....
//-------------------------------
preg_match( '#var\s+?\$perm_child\s+?=\s+?[\'"](.+?)[\'"];#', $code, $match );
$master[ $_name ]['perm_child'] = $match[1];
if ( $master[ $_name ]['perm_main'] AND $master[ $_name ]['perm_child'] )
{
//-------------------------------
// Get perm rows
//-------------------------------
preg_match_all( '#cp_permission_check\(\s+?\$this->perm_main\.[\'"]\|[\'"]\.\$this->perm_child\.[\'"]\:(.+?)[\'"]\s+?\);#i', $code, $match );
for ($i=0; $i < count($match[0]); $i++)
{
$_bit = trim($match[1][$i]);
$master[ $_name ]['perm_bits'][ $_bit ]['name'] = $_bit;
$master[ $_name ]['perm_bits'][ $_bit ]['langstring'] = $lang[ $master[ $_name ]['perm_main'].':'.$master[ $_name ]['perm_child'].':'.$_bit ];
}
}
}
}
}
closedir($handle);
return $master;
}
/*-------------------------------------------------------------------------*/
// List current members
/*-------------------------------------------------------------------------*/
/**
* List members
*
* @return array $master array
* @since 2.1.0.2005-7-7
*/
function acpperms_list()
{
$this->ipsclass->admin->nav[] = array( $this->ipsclass->form_code, 'Óïðàâëåíèå îãðàíè÷åíèÿìè' );
//-------------------------------
// INIT
//-------------------------------
$content = "";
$rows = array();
$admin_groups = array();
//-------------------------------
// Get current ACP listed members
//-------------------------------
$this->ipsclass->DB->build_query( array( 'select' => 'p.*',
'from' => array( 'admin_permission_rows' => 'p' ),
'add_join' => array( 0 => array(
'select' => 'm.members_display_name, m.id, m.mgroup',
'from' => array( 'members' => 'm' ),
'where' => 'm.id=p.row_member_id',
'type' => 'inner' ) ),
'order' => 'm.members_display_name DESC' ) );
$this->ipsclass->DB->exec_query();
while( $r = $this->ipsclass->DB->fetch_row() )
{
//-------------------------------
// (Alex) Cross
//-------------------------------
$r['_date'] = $this->ipsclass->get_date( $r['row_updated'], 'SHORT', 1 );
$r['_group_name'] = $this->ipsclass->cache['group_cache'][ $r['mgroup'] ]['g_title'];
$content .= $this->html->acp_perms_row($r);
}
$this->ipsclass->html .= $this->html->acp_perms_overview( $content );
$this->ipsclass->admin->page_title = "Óïðàâëåíèå îãðàíè÷åíèÿìè";
$this->ipsclass->admin->page_detail = "Ýòà ñåêöèÿ ïîçâîëèò âàì óïðàâëÿòü îãðàíè÷åíèåì ïðàâ àäìèíèñòðàòîðîâ.";
$this->ipsclass->admin->output();
}
}
?>