* Invision Power Services * IP.Board v3.4.8 * Skin Functions * Last Updated: $Date: 2012-12-13 08:29:08 -0500 (Thu, 13 Dec 2012) $ * * * Owner: Matt * @author $Author: AndyMillne $ * @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: 11713 $ * */ if ( ! defined( 'IN_IPB' ) ) { print "
* Exception Codes:
* NO_SUCH_UAGENT: Could not locate user agent
* UAGENT_EXISTS: Could not rename user agent key
* MISSING_DATA: Fields are missing
* REGEX_INCORRECT: The regex is incorrect
*
*/
public function saveUserAgentFromEdit( $uagent_id, $uagent_key, $uagent_name, $uagent_regex, $uagent_regex_capture, $uagent_type, $uagent_position )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$uagent_id = intval( $uagent_id );
$uagent_key = strtolower( IPSText::alphanumericalClean( $uagent_key ) );
$uagent_name = trim( $uagent_name );
$uagent_regex = trim( $uagent_regex );
$uagent_regex_capture = intval( $uagent_regex_capture );
$uagent_type = IPSText::alphanumericalClean( $uagent_type );
$uagent_position = intval( $uagent_position );
if ( ! $uagent_id OR ! $uagent_key OR ! $uagent_name OR ! $uagent_regex OR ! $uagent_type )
{
throw new Exception( 'MISSING_DATA' );
}
//-----------------------------------------
// Fetch user agent data
//-----------------------------------------
$useragent = $this->DB->buildAndFetch( array( 'select' => '*',
'from' => 'core_uagents',
'where' => 'uagent_id=' . $uagent_id ) );
if ( ! $useragent['uagent_id'] )
{
throw new Exception( 'NO_SUCH_UAGENT' );
}
//-----------------------------------------
// Did we change the key?
//-----------------------------------------
if ( $useragent['uagent_key'] != $uagent_key )
{
$useragentTest = $this->DB->buildAndFetch( array( 'select' => '*',
'from' => 'core_uagents',
'where' => 'uagent_key=\'' . $uagent_key . '\'' ) );
if ( $useragentTest['uagent_id'] )
{
throw new Exception( "UAGENT_EXISTS" );
}
}
//-----------------------------------------
// Test syntax
//-----------------------------------------
if ( $this->testRegex( $uagent_regex ) !== TRUE )
{
throw new Exception( "REGEX_INCORRECT" );
}
//-----------------------------------------
// Update
//-----------------------------------------
$this->DB->update( 'core_uagents', array( 'uagent_key' => $uagent_key,
'uagent_name' => $uagent_name,
'uagent_regex' => str_replace( '\', '\\', $uagent_regex ),
'uagent_regex_capture' => $uagent_regex_capture,
'uagent_position' => $uagent_position,
'uagent_type' => $uagent_type ), 'uagent_id=' . $uagent_id );
//-----------------------------------------
// Recache
//-----------------------------------------
$this->rebuildUserAgentCaches();
//-----------------------------------------
// Return
//-----------------------------------------
return $uagent_id;
}
/**
* Save replacement after add
*
* @access public
* @param string User Agent "Key"
* @param string User Agent Name (Human title)
* @param string User Agent Regex
* @param int User Agent Regex Capture parenthesis #
* @param string User Agent Type (browser, search engine, other)
* @param int User Agent Position
* @return array ..of data
*
* Exception Codes:
* UAGENT_EXISTS: Could not rename user agent key
* MISSING_DATA: Fields are missing
*
*/
public function saveUserAgentFromAdd( $uagent_key, $uagent_name, $uagent_regex, $uagent_regex_capture, $uagent_type, $uagent_position )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$uagent_key = strtolower( IPSText::alphanumericalClean( $uagent_key ) );
$uagent_name = trim($uagent_name);
$uagent_regex = trim($uagent_regex);
$uagent_regex_capture = intval( $uagent_regex_capture );
$uagent_type = IPSText::alphanumericalClean( $uagent_type );
$uagent_position = intval( $uagent_position );
if ( ! $uagent_key OR ! $uagent_name OR ! $uagent_regex OR ! $uagent_type )
{
throw new Exception( 'MISSING_DATA' );
}
//-----------------------------------------
// Check for an existing user agent
//-----------------------------------------
$useragentTest = $this->DB->buildAndFetch( array( 'select' => '*',
'from' => 'core_uagents',
'where' => 'uagent_key=\'' . $uagent_key . '\'' ) );
if ( $useragentTest['uagent_id'] )
{
throw new Exception( "UAGENT_EXISTS" );
}
//-----------------------------------------
// Update
//-----------------------------------------
$this->DB->insert( 'core_uagents', array( 'uagent_key' => $uagent_key,
'uagent_name' => $uagent_name,
'uagent_regex' => str_replace( '\', '\\', $uagent_regex ),
'uagent_regex_capture' => $uagent_regex_capture,
'uagent_position' => $uagent_position,
'uagent_type' => $uagent_type ) );
$uagent_id = $this->DB->getInsertId();
//-----------------------------------------
// Recache
//-----------------------------------------
$this->rebuildUserAgentCaches();
//-----------------------------------------
// Return
//-----------------------------------------
return $uagent_id;
}
/**
* Reverts / Removes Replacement
*
* @access public
* @param int User Agent ID
* @return array All user agents for this skin set
*
* Exception Codes:
* NO_SUCH_UAGENT: Could not locate user agent
*
*/
public function removeUserAgent( $uagent_id )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$uagent_id = intval( $uagent_id );
//-----------------------------------------
// Fetch replacement data
//-----------------------------------------
$useragentTest = $this->DB->buildAndFetch( array( 'select' => '*',
'from' => 'core_uagents',
'where' => 'uagent_id=' . $uagent_id ) );
if ( ! $useragentTest['uagent_id'] )
{
throw new Exception( "NO_SUCH_UAGENT" );
}
//-----------------------------------------
// Remove it...
//-----------------------------------------
$this->DB->delete( 'core_uagents', 'uagent_id=' . $uagent_id );
//-----------------------------------------
// Recache
//-----------------------------------------
$this->rebuildUserAgentCaches();
//-----------------------------------------
// Grab the adjusted user agents
//-----------------------------------------
$useragents = $this->fetchAgents();
//-----------------------------------------
// Reeee-turn
//-----------------------------------------
return $useragents;
}
/**
* Test the user's user-agent for a match in the database
*
* @access public
* @param string [Optional: user agent raw string]
* @return array array[ 'uagent_id' => int, 'uagent_key' => string, 'uagent_name' => string, 'uagent_version' => int ]
*/
public function findUserAgentID( $userAgent='' )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$userAgent = ( $userAgent ) ? $userAgent : $this->member->user_agent;
$uagentReturn = array( 'uagent_id' => 0,
'uagent_key' => NULL,
'uagent_name' => NULL,
'uagent_type' => NULL,
'uagent_version' => 0 );
/* Hardcoded to prevent admin tampering - legacy app is selected in publicSessions */
if ( stristr( $userAgent, 'ip.ios' ) )
{
preg_match( '#^ip\.ios\s+?v([\d\.]+?),#i', $userAgent, $matches );
if ( $matches[0] )
{
return array( 'uagent_id' => -1,
'uagent_key' => 'ipsMobileApple',
'uagent_name' => 'IPS Mobile Apple',
'uagent_type' => 'mobileApp',
'uagent_version' => intval( $matches[1] ) );
}
}
else if ( stristr( $userAgent, 'ip.android' ) )
{
preg_match( '#^ip\.android\s+?v([\d\.]+?),#i', $userAgent, $matches );
if ( $matches[0] )
{
return array( 'uagent_id' => -1,
'uagent_key' => 'ipsMobileAndroid',
'uagent_name' => 'IPS Mobile Android',
'uagent_type' => 'mobileApp',
'uagent_version' => intval( $matches[1] ) );
}
}
else if ( stristr( $userAgent, 'IP-OTHER' ) ) // http://community.invisionpower.com/resources/bugs.html/_/ip-board/mobile-app-user-agents-invalid-r39508
{
preg_match( '#^IP-OTHER\/([\d].[\d]+?)#i', $userAgent, $matches );
if ( $matches[0] )
{
return array( 'uagent_id' => -1, 'uagent_key' => 'ipsMobileOther', 'uagent_name' => 'IPS Mobile Other', 'uagent_type' => 'mobileApp', 'uagent_version' => intval( $matches[1] ) );
}
}
//-----------------------------------------
// Test in the DB
//-----------------------------------------
$userAgentCache = $this->cache->getCache('useragents');
foreach( $userAgentCache as $key => $data )
{
$regex = str_replace( '#', '\\#', $data['uagent_regex'] );
if ( ! preg_match( "#{$regex}#i", $userAgent, $matches ) )
{
continue;
}
else
{
//-----------------------------------------
// Okay, we got a match - finalize
//-----------------------------------------
if ( $data['uagent_regex_capture'] )
{
$version = $matches[ $data['uagent_regex_capture'] ];
}
else
{
$version = 0;
}
$uagentReturn = array( 'uagent_id' => $data['uagent_id'],
'uagent_key' => $data['uagent_key'],
'uagent_name' => $data['uagent_name'],
'uagent_type' => $data['uagent_type'],
'uagent_version' => intval( $version ) );
break;
}
}
return $uagentReturn;
}
/**
* Test regex for errors
*
* @access public
* @param string Regex
* @return boolean (True is OK)
*/
public function testRegex( $regex )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$return = '';
$regex = str_replace( '#', '\\#', $regex );
$this->_resetMessageHandle();
//-----------------------------------------
// Test...
//-----------------------------------------
ob_start();
eval( "preg_match( '#" . $regex . "#', 'this is just a test' );" );
$return = ob_get_contents();
ob_end_clean();
//-----------------------------------------
// More data...
//-----------------------------------------
$this->_addMessage( $return );
//-----------------------------------------
// Return
//-----------------------------------------
return $return ? FALSE : TRUE;
}
}