Файл: admin/applications/core/modules_admin/posts/badwords.php
Строк: 212
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.3.3
* Bad Word Filters
* Last Updated: $LastChangedDate: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
* </pre>
*
* @author $Author: bfarber $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @subpackage Core
* @link http://www.invisionpower.com
* @since 27th January 2004
* @version $Rev: 10721 $
*/
if ( ! defined( 'IN_ACP' ) )
{
print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded 'admin.php'.";
exit();
}
class admin_core_posts_badwords extends ipsCommand
{
/**
* HTML skin object
*
* @var object
*/
public $html;
/**
* Main class entry point
*
* @param object ipsRegistry reference
* @return @e void [Outputs to screen]
*/
public function doExecute( ipsRegistry $registry )
{
/* Load Skin and Lang */
$this->html = $this->registry->output->loadTemplate( 'cp_skin_badwords' );
$this->html->form_code = '&module=posts&section=badwords';
$this->html->form_code_js = '&module=posts§ion=badwords';
$this->lang->loadLanguageFile( array( 'admin_posts' ) );
/* What to do */
switch( $this->request['do'] )
{
case 'badword_add':
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'badword_manage' );
$this->badwordAdd();
break;
case 'badword_remove':
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'badword_delete' );
$this->badwordRemove();
break;
case 'badword_edit':
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'badword_manage' );
$this->badwordEditForm();
break;
case 'badword_doedit':
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'badword_manage' );
$this->handleBadwordEdit();
break;
case 'badword_export':
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'badword_manage' );
$this->badwordsExport();
break;
case 'badword_import':
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'badword_manage' );
$this->badwordsImport();
break;
default:
case 'overview':
case 'badword':
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'badword_manage' );
$this->badwordsOvervew();
break;
}
/* Output */
$this->registry->output->html_main .= $this->registry->output->global_template->global_frame_wrapper();
$this->registry->output->sendOutput();
}
/**
* Remove a badword filter
*
* @return @e void
*/
public function badwordRemove()
{
/* Check ID */
$id = intval( $this->request['id'] );
if( ! $id )
{
$this->registry->output->showError( $this->lang->words['bwl_nofiter'], 11138 );
}
/* Delete */
$this->DB->delete( 'badwords', "wid={$id}" );
/* Rebuild cache and bounce */
$this->badwordsRebuildCache();
$this->registry->output->global_message = $this->lang->words['bwl_filter_removed'];
$this->registry->output->silentRedirectWithMessage( $this->settings['base_url'] . $this->html->form_code );
}
/**
* Handles the badword edit form
*
* @return @e void
*/
public function handleBadwordEdit()
{
/* Check for before */
if( ! $this->request['before'] )
{
$this->registry->output->showError( $this->lang->words['bwl_noword'], 11139 );
}
/* Check ID */
$id = intval( $this->request['id'] );
if( ! $id )
{
$this->registry->output->showError( $this->lang->words['bwl_nofilter'], 11140 );
}
/* Match */
$this->request['match'] = $this->request['match'] ? 1 : 0;
/* Swap Text */
$this->DB->setDataType( array( 'type', 'swop' ), 'string' );
$this->DB->update( 'badwords', array(
'type' => $this->request['before'], // do not trim - see bug report 34433
'swop' => $this->request['after'], // do not trim - see bug report 34433
'm_exact' => $this->request['match']
), "wid=" . $id );
/* Recache and bounce */
$this->badwordsRebuildCache();
$this->registry->output->global_message = $this->lang->words['bwl_filter_edited'];
$this->registry->output->silentRedirectWithMessage( $this->settings['base_url'] . $this->html->form_code );
}
/**
* Edit Badword Form
*
* @return @e void
* @author Josh
*/
public function badwordEditForm()
{
/* Check ID */
$id = intval( $this->request['id'] );
if( ! $id )
{
$this->registry->output->showError( $this->lang->words['bwl_nofilter'], 11141 );
}
/* Get the field */
$this->DB->build( array( 'select' => '*', 'from' => 'badwords', 'where' => "wid='{$id}'" ) );
$this->DB->execute();
if ( ! $r = $this->DB->fetch() )
{
$this->registry->output->showError( $this->lang->words['bwl_filter_404'], 11142 );
}
/* Form Fields */
$form = array();
$form['before'] = $this->registry->output->formInput('before', stripslashes( $r['type'] ) );
$form['after'] = $this->registry->output->formInput('after' , stripslashes( $r['swop'] ) );
$form['match'] = $this->registry->output->formDropdown( 'match', array( 0 => array( 1, $this->lang->words['bwl_exact'] ), 1 => array( 0, $this->lang->words['bwl_loose'] ) ), $r['m_exact'] );
/* Output */
$this->registry->output->html .= $this->html->badwordEditForm( $id, $form );
}
/**
* Handle add bad word request
*
* @return @e void
*/
public function badwordAdd()
{
/* Check for before text */
if( ! $this->request['before'] )
{
$this->registry->output->showError( $this->lang->words['bwl_noword'], 11143 );
}
/* Match */
$this->request['match'] = $this->request['match'] ? 1 : 0;
/* Insert filter */
$this->DB->setDataType( array( 'type', 'swop' ), 'string' );
$this->DB->insert( 'badwords', array(
'type' => $this->request['before'], // do not trim - see bug report 34433
'swop' => $this->request['after'], // do not trim - see bug report 34433
'm_exact' => $this->request['match']
)
);
/* Rebuild the cache */
$this->badwordsRebuildCache();
/* Bounce */
$this->registry->output->global_message = $this->lang->words['bwl_filter_new'];
$this->registry->output->silentRedirectWithMessage( $this->settings['base_url'] . $this->html->form_code );
}
/**
* Badword Overview Screen
*
* @return @e void
*/
public function badwordsOvervew()
{
/* Query the bad words */
$this->DB->build( array( 'select' => '*', 'from' => 'badwords', 'order' => 'type' ) );
$this->DB->execute();
/* Loop through the results */
$rows = array();
if ( $this->DB->getTotalRows() )
{
while ( $r = $this->DB->fetch() )
{
$words[] = $r;
}
foreach( $words as $r )
{
$r['replace'] = $r['swop'] ? stripslashes( $r['swop'] ) : '######';
$r['method'] = $r['m_exact'] ? $this->lang->words['bwl_exact'] : $this->lang->words['bwl_loose'];
$r['type'] = stripslashes( $r['type'] );
$rows[] = $r;
}
}
/* Output */
$this->registry->output->html .= $this->html->badwordsWrapper( $rows );
}
/**
* Import badwords from an xml file
*
* @return @e void
*/
public function badwordsImport()
{
/* Get Badwords XML */
try
{
$content = $this->registry->adminFunctions->importXml( 'ipb_badwords.xml' );
}
catch ( Exception $e )
{
$this->registry->output->showError( $e->getMessage() );
}
/* Check for content */
if ( ! $content )
{
$this->registry->output->global_message = $this->lang->words['bwl_upload_failed'];
$this->badwordsOvervew();
return;
}
//-----------------------------------------
// Get xml class
//-----------------------------------------
require_once( IPS_KERNEL_PATH.'classXML.php' );/*noLibHook*/
$xml = new classXML( IPS_DOC_CHAR_SET );
$xml->loadXML( $content );
if( !count( $xml->fetchElements('badword') ) )
{
$this->registry->output->global_message = $this->lang->words['bwl_upload_wrong'];
$this->badwordsOvervew();
return;
}
/* Get a list of current badwords */
$words = array();
$this->DB->build( array( 'select' => '*', 'from' => 'badwords', 'order' => 'type' ) );
$this->DB->execute();
while( $r = $this->DB->fetch() )
{
$words[ $r['type'] ] = 1;
}
/* Loop through the xml document and insert new bad words */
foreach( $xml->fetchElements('badword') as $badword )
{
$entry = $xml->fetchElementsFromRecord( $badword );
/* Get the filter settings */
$type = $entry['type'];
$swop = $entry['swop'];
$m_exact = $entry['m_exact'];
/* Skip if it's already in the db */
if ( $words[ $type ] )
{
continue;
}
/* Add to the db */
if ( $type )
{
$this->DB->insert( 'badwords', array( 'type' => $type, 'swop' => $swop, 'm_exact' => $m_exact ) );
}
}
/* Rebuild cache and bounce */
$this->badwordsRebuildCache();
$this->registry->output->global_message = $this->lang->words['bwl_upload_good'];
$this->badwordsOvervew();
}
/**
* Exports badwords to an xml file
*
* @return @e void
*/
public function badwordsExport()
{
//-----------------------------------------
// Get xml class
//-----------------------------------------
require_once( IPS_KERNEL_PATH.'classXML.php' );/*noLibHook*/
$xml = new classXML( IPS_DOC_CHAR_SET );
$xml->newXMLDocument();
$xml->addElement( 'badwordexport' );
$xml->addElement( 'badwordgroup', 'badwordexport' );
/* Query the badwords */
$this->DB->build( array( 'select' => 'type, swop, m_exact', 'from' => 'badwords', 'order' => 'type' ) );
$this->DB->execute();
/* Add the bad word entries to the xml file */
while( $r = $this->DB->fetch() )
{
$xml->addElementAsRecord( 'badwordgroup', 'badword', $r );
}
/* Create the xml document and send to the browser */
$xmlData = $xml->fetchDocument();
$this->registry->output->showDownload( $xmlData, 'ipb_badwords.xml' );
}
/**
* Rebuild badword cache
*
* @return @e void
*/
public function badwordsRebuildCache()
{
$cache = array();
$this->DB->build( array( 'select' => 'type,swop,m_exact', 'from' => 'badwords' ) );
$this->DB->execute();
while ( $r = $this->DB->fetch() )
{
$cache[] = $r;
}
usort( $cache, array( $this, '_thisUsort' ) );
$this->cache->setCache( 'badwords', $cache, array( 'array' => 1 ) );
}
/**
* Custom sort operation
*
* @param string A
* @param string B
* @return integer
*/
protected function _thisUsort($a, $b)
{
if ( IPSText::mbstrlen($a['type']) == IPSText::mbstrlen($b['type']) )
{
return 0;
}
return ( IPSText::mbstrlen($a['type']) > IPSText::mbstrlen($b['type']) ) ? -1 : 1;
}
}