* Invision Power Services * IP.Board v3.4.9 * Skin Functions * Last Updated: $Date: 2011-05-05 12:03:47 +0100 (Thu, 05 May 2011) $ * * * Owner: Matt * @author $Author: ips_terabyte $ * @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 9th March 2005 11:03 * @version $Revision: 8644 $ * */ if ( ! defined( 'IN_IPB' ) ) { print "

Incorrect access

You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files."; exit(); } class skinGenerator extends skinCaching { /**#@+ * Registry objects * * @access protected * @var object */ protected $registry; protected $DB; protected $settings; protected $request; protected $lang; protected $member; protected $memberData; protected $cache; protected $caches; /**#@-*/ /** * Constructor * * @access public * @param object Registry object * @return @e void */ public function __construct( ipsRegistry $registry ) { /* Make object */ parent::__construct( $registry ); } /** * Return JSON payload URL * @return string Skin Generator URL */ public function getJsonUrl() { $inDev = ( IN_DEV ) ? 1 : 0; return 'http://ips-skin-gen.invisionpower.com/index.php?v=' . IPB_LONG_VERSION . '&k=' . urlencode( $this->settings['ipb_reg_number'] ) . '&i=' . $inDev; } /** * Delete a user's session * @param int $skinSetId */ public function convertToFull( $skinSetId ) { /* Current session? */ $session = $this->getSessionBySkinId( $skinSetId ); if ( $session['sg_member_id'] ) { $this->deleteUserSession( $session['sg_member_id'] ); } /* Tweak skin */ $this->DB->update( 'skin_collections', array( 'set_by_skin_gen' => 0 ), 'set_id=' . $skinSetId ); } /** * Check to make sure we're GTG ... */ public function healthCheck() { $warnings = array(); /* Can write into images */ if ( ! is_writable( DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_images' ) ) { $warnings[] = 'Cannot write to image directory'; } return ( count( $warnings ) ) ? $warnings : true; } /** * Fetches the JSON from the remote server and writes it */ public function buildLocalJsonCache() { /* Now fetch JSON data from the server and write it */ require_once( IPS_KERNEL_PATH . 'classFileManagement.php' );/*noLibHook*/ $files = new classFileManagement(); $json = $files->getFileContents( $this->getJsonUrl() ); if ( $json ) { $cacheFile = IPS_CACHE_PATH . 'cache/skinGenJsonCache.js'; if ( file_exists( $cacheFile ) ) { @unlink( $cacheFile ); } file_put_contents( $cacheFile, $json ); @chmod( $cacheFile, 0777 ); } else { throw new Exception( "JSON_NOT_RETURNED"); } return true; } /** * Saves the skin and that * @param array css, storedSettings, storedClasses * @param int Member Id */ public function save( array $data, $memberId ) { $session = $this->getUserSession( $memberId ); if ( empty( $session['sg_session_id'] ) ) { throw new Exception( 'NO_SESSION_FOUND' ); } /* Update session */ $this->DB->update( 'skin_collections', array( 'set_skin_gen_data' => serialize( $data ) ), 'set_id=\'' . $session['sg_skin_set_id'] . '\'' ); /* Write CSS_EXISTS extras css */ try { $this->saveCSSFromAdd( $session['sg_skin_set_id'], trim( $data['css'] ), 'ipb_skingen', 999, '', 'core' ); } catch( Exception $e ) { if ( $e->getMessage() == 'CSS_EXISTS' ) { $css = $this->fetchCSS( $session['sg_skin_set_id'] ); $this->saveCSSFromEdit( $css['ipb_skingen']['css_id'], $session['sg_skin_set_id'], trim( $data['css'] ), 'ipb_skingen', 999, '', 'core' ); } } /* Update replacements */ $replacements = $this->fetchReplacements( $session['sg_skin_set_id'] ); /* Set transparent logo */ $this->saveReplacementFromEdit( $replacements['logo_img']['replacement_id'], $session['sg_skin_set_id'], '{style_image_url}/logo_transparent.png', 'logo_img' ); /* Flag for rebuild */ $this->flagSetForRecache( $session['sg_skin_set_id'] ); /* Delete session */ $this->deleteUserSession( $memberId ); } /** * Resets the member's skin * @param int Member Id */ public function resetMemberAndSwitchSkin( $memberId ) { $session = $this->getUserSession( $memberId ); if ( empty( $session['sg_session_id'] ) ) { throw new Exception( 'NO_SESSION_FOUND' ); } IPSMember::save( $memberId, array( 'core' => array( 'bw_using_skin_gen' => 0, 'skin' => $session['sg_skin_set_id'] ) ) ); } /** * Set a user's session * @param int $memberId * @param array */ public function setUserSession( $memberId, $data ) { if ( ! empty( $memberId ) AND ! empty( $data['skin_set_id'] ) ) { $sessionKey = md5( uniqid() ); $this->deleteUserSession( $memberId ); if ( empty( $data['set_skin_gen_data'] ) ) { $skin = $this->fetchSkinData( $data['skin_set_id'] ); $data['set_skin_gen_data'] = $skin['set_skin_gen_data']; } $this->DB->insert( 'skin_generator_sessions', array( 'sg_session_id' => $sessionKey, 'sg_member_id' => $memberId, 'sg_skin_set_id' => $data['skin_set_id'], 'sg_date_start' => IPS_UNIX_TIME_NOW, 'sg_data' => ( is_array( $data ) ) ? serialize( $data ) : $data ) ); /* Flag user */ IPSMember::save( $memberId, array( 'core' => array( 'bw_using_skin_gen' => 1 ) ) ); return $sessionKey; } else { return false; } } /** * Delete a user's session * @param int $memberId * @param null */ public function deleteUserSession( $memberId ) { $this->DB->delete( 'skin_generator_sessions', 'sg_member_id=' . intval( $memberId ) ); /* Flag user */ IPSMember::save( $memberId, array( 'core' => array( 'bw_using_skin_gen' => 0 ) ) ); } /** * Get a user's session * @param int $memberId */ public function getUserSession( $memberId ) { $session = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'skin_generator_sessions', 'where' => 'sg_member_id=' . intval( $memberId ) ) ); if ( ! empty( $session['sg_session_id'] ) ) { if ( IPSLib::isSerialized( $session['sg_data'] ) ) { $session['sg_data_array'] = unserialize( $session['sg_data'] ); if ( IPSLib::isSerialized( $session['sg_data_array']['set_skin_gen_data'] ) ) { $session['skin_gen_data'] = unserialize( $session['sg_data_array']['set_skin_gen_data'] ); } } return $session; } else { /* Prevent this from loading again */ IPSMember::save( $memberId, array( 'core' => array( 'bw_using_skin_gen' => 0 ) ) ); return false; } } /** * Get a user's session * @param int $skinSetId */ public function getSessionBySkinId( $skinSetId ) { $session = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'skin_generator_sessions', 'where' => 'sg_skin_set_id=' . intval( $skinSetId ) ) ); if ( ! empty( $session['sg_session_id'] ) ) { if ( IPSLib::isSerialized( $session['sg_data'] ) ) { $session['sg_data_array'] = unserialize( $session['sg_data'] ); if ( IPSLib::isSerialized( $session['sg_data_array']['set_skin_gen_data'] ) ) { $session['skin_gen_data'] = unserialize( $session['sg_data_array']['set_skin_gen_data'] ); } } return $session; } else { return false; } } }