Файл: admin/sources/classes/sabre/files/templates.php
Строк: 305
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.3.3
* Sabre classes by Matt Mecham
* Last Updated: $Date: 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
* @link http://www.invisionpower.com
* @since Friday 18th March 2011
* @version $Revision: 10721 $
*/
class sabre_file_templates extends Sabre_DAV_File
{
protected $_skinSet = array();
protected $_template = '';
protected $_title = '';
protected $_group = '';
protected $_content = null;
public function __construct( $skinSet, $template=null, $title=null, $group=null )
{
$this->registry = ipsRegistry::instance();
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
/* Require some files for our sabre implementation */
require_once( IPS_ROOT_PATH . 'sources/classes/sabre/root/skins.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/sabre/directory/templates.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/sabre/directory/groups.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/sabre/lock/nolocks.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinFunctions.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinCaching.php' );/*noLibHook*/
$this->skinFunctions = new skinCaching( $this->registry );
$this->_skinSet = $skinSet;
$this->_group = $group;
if ( $template )
{
$this->_template = $template;
$this->_title = ( $this->_group == 'css' ) ? $template['css_group'] : $template['template_name'];
}
else
{
$this->_title = $title;
}
}
public function getName()
{
return $this->_title . '.' . ( $this->_group == 'css' ? 'css' : 'html' );
}
public function getLastModified()
{
return intval( $this->_group == 'css' ? $this->_template['css_updated'] : $this->_template['template_updated'] );
}
public function getETag()
{
$content = $this->_getTemplateContent();
return ( $content === false ) ? 'new' : md5( $content );
}
public function get()
{
$content = $this->_getTemplateContent();
return ( $content === false ) ? '' : $content;
}
public function getSize()
{
$content = $this->_getTemplateContent();
return ( $content === false ) ? 0 : strlen( $content );
}
public function getContentType()
{
if ( $this->_group != 'css' )
{
return 'text/html';
}
else if ( $this->_group == 'css' )
{
return 'text/css';
}
else
{
return null;
}
}
public function put( $data )
{
$content = stream_get_contents( $data );
if ( ! $this->_title || $this->_title == '.' || strtolower( $this->_title == '.ds_store' ) || $this->_title == 'Thumbs.db' || $this->_title == 'desktop.ini' )
{
return false;
}
/* Do what now? */
return ( $this->_group == 'css' ) ? $this->_putCss( $content ) : $this->_putTemplate( $content );
}
public function delete()
{
try
{
if ( $this->_template )
{
if ( $this->_group != 'css' )
{
$this->skinFunctions->revertTemplateBit( $this->_template['template_id'], $this->_skinSet['set_id'] );
}
else
{
$this->skinFunctions->revertCSS( $this->_template['css_id'], $this->_skinSet['set_id'] );
}
}
}
catch( Exception $err )
{
/* Catch error - it might have come from a tmp save file being renamed */
if ( $this->_group != 'css' )
{
$test = $this->DB->buildAndFetch( array( 'select' => '*',
'from' => 'skin_templates',
'where' => 'template_set_id=' . $this->_skinSet['set_id'] . ' AND template_group='' . $this->DB->addSlashes( $this->_group ) . ''',
'order' => 'template_id DESC',
'limit' => array( 0, 1 ) ) );
if ( $test['template_added_to'] > 0 && $test['template_updated'] > time() - 240 && $test['template_removable'] && $test['template_added_to'] == $this->_skinSet['set_id'] )
{
return true;
}
}
throw new Sabre_DAV_Exception_Forbidden( $err->getMessage() );
}
}
public function setName($title)
{
$title = preg_replace( '#^(.*).(css|html)$#', '1', $title );
try
{
if ( $this->_group != 'css' )
{
if ( $this->_template )
{
$this->skinFunctions->renameTemplateName( $this->_template['template_id'], $title );
/* Got a master skin of the same name? Then it's a simple edit */
$test = $this->DB->buildAndFetch( array( 'select' => '*',
'from' => 'skin_templates',
'where' => 'template_set_id=0 AND template_master_key='' . $this->_skinSet['set_master_key'] . '' AND template_name='' . $this->DB->addSlashes( $this->_title ) . '' AND template_group='' . $this->DB->addSlashes( $this->_group ) . ''' ) );
if ( $test['template_name'] )
{
/* Reset added to */
$this->DB->update( 'skin_templates', array( 'template_added_to' => 0 ), 'template_id=' . $this->_template['template_id'] );
}
}
}
else
{
if ( $this->_template )
{
$this->skinFunctions->renameCssName( $this->_template['css_id'], $title );
}
}
}
catch( Exception $err )
{
throw new Sabre_DAV_Exception_Forbidden( $err->getMessage() );
}
return true;
}
/**
* Put CSS
* @param string $content
* @throws Sabre_DAV_Exception_Forbidden
* @return boolean
*/
protected function _putCss( $content )
{
/* Clear cache */
$this->_content = null;
/* Save it! */
try
{
if ( ! empty( $this->_template['css_id'] ) && $this->_skinSet['set_id'] )
{
$this->skinFunctions->saveCSSFromEdit( $this->_template['css_id'], $this->_skinSet['set_id'], $content, $this->_title, $this->_template['css_position'], $this->_template['css_attributes'], $this->_template['css_app'], $this->_template['css_app_hide'], $this->_template['css_modules'] );
}
else
{
$this->skinFunctions->saveCSSFromAdd( $this->_skinSet['set_id'], $content, $this->_title, $this->_template['css_position'], $this->_template['css_attributes'], $this->_template['css_app'], $this->_template['css_app_hide'], $this->_template['css_modules'] );
}
}
catch( Exception $err )
{
throw new Sabre_DAV_Exception_Forbidden( $err->getMessage() );
}
return true;
}
/**
* Put template ...
* @param string $content
* @throws Sabre_DAV_Exception_Forbidden
* @return boolean
*/
protected function _putTemplate( $content )
{
/* Got a data tag? */
$params = '';
$template = '';
if ( stristr( $content, '<ips:template parameters="' ) )
{
preg_match( '#<ips:template parameters="(.+?)" />(n)?#', $content, $match );
if ( $match[1] )
{
$params = $match[1];
$template = str_replace( $match[0], '', $content );
}
}
else
{
$template = $content;
}
/* Clear cache */
$this->_content = null;
/* Save it! */
try
{
if ( ! empty( $this->_template['template_id'] ) && $this->_skinSet['set_id'] )
{
$this->skinFunctions->saveTemplateBitFromEdit( $this->_template['template_id'], $this->_skinSet['set_id'], $template, $params );
}
else
{
$newId = $this->skinFunctions->saveTemplateBitFromAdd( $this->_skinSet['set_id'], $template, $params, $this->_group, $this->_title );
/* If webdav client adds, then renames... - in delete, if trying to delete master and set specific exists, allow without error but don't delete */
if ( $newId )
{
/* Got a master skin of the same name? Then it's a simple edit */
$test = $this->DB->buildAndFetch( array( 'select' => '*',
'from' => 'skin_templates',
'where' => 'template_set_id=0 AND template_master_key='' . $this->_skinSet['set_master_key'] . '' AND template_name='' . $this->DB->addSlashes( $this->_title ) . '' AND template_group='' . $this->DB->addSlashes( $this->_group ) . ''' ) );
if ( $test['template_name'] )
{
/* Update new */
$this->DB->update( 'skin_templates', array( 'template_set_id' => $this->_skinSet['set_id'], 'template_master_key' => '' ), 'template_id=' . $newId );
$this->_template['template_set_id'] = $this->_skinSet['set_id'];
$this->_template['template_id'] = $newId;
}
}
}
}
catch( Exception $err )
{
throw new Sabre_DAV_Exception_Forbidden( $err->getMessage() );
}
return true;
}
protected function _getTemplateContent()
{
if ( ! $this->_template )
{
return false;
}
if ( $this->_content === null )
{
if ( $this->_group != 'css' )
{
$template = $this->skinFunctions->fetchTemplateBitForEdit( $this->_template['template_id'], $this->_skinSet['set_id'] );
$data = $template['template_data'];
if ( ! empty( $data ) )
{
$template['_template_content'] = '<ips:template parameters="' . IPSText::formToText( $data ) . '" />' . "n" . $template['_template_content'];
}
$this->_content = ( isset( $template['_template_content'] ) ) ? $template['_template_content'] : false;
}
else
{
$template = $this->skinFunctions->fetchCSSForEdit( $this->_template['css_id'], $this->_skinSet['set_id'] );
$this->_content = ( isset( $template['css_content'] ) ) ? $template['css_content'] : false;
}
}
return $this->_content;
}
}