IP.Board Tutorials

How to null your 4.0 beta/pre-release

Submitted by Mr_Joker, , Thread ID: 1303

Thread Closed
15-02-2015, 04:36 AM
#1
So, as some of you might know I had a few files up in the downloads for nulled copies of the coming IPS4!

So basically, all you have to do is replace your init.php file contents with this (the whole thing):

PHP Code:
<?php
/**
 * @briefInitiates IPS Social Suite constants, autoloader and exception handler
 * @author<a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
 * @copyright(c) 2001 - SVN_YYYY Invision Power Services, Inc.
 * @licensehttp://www.invisionpower.com/legal/standards/
 * @packageIPS Social Suite
 * @since18 Feb 2013
 * @versionSVN_VERSION_NUMBER
 */
 
namespace IPS;
 
/**
 * Class to contain IPS Social Suite autoloader and exception handler
 */
class IPS
{
/**
 * @briefClasses that have hooks on
 */
public static $hooks = array();

/**
 * @briefUnique key for this suite (used in http requests to defy browser caching)
 */
public static $suiteUniqueKey NULL;

/**
 * @briefDeveloper Code to be added to all namespaces
 */
private static $inDevCode '';

/**
 * @briefNamespaces developer code has been imported to
 */
private static $inDevCodeImportedTo = array();

/**
 * @briefVendors to use PSR-0 autoloader for
 */
public static $PSR0Namespaces = array();
 
/**
 * Get default constants
 *
 * @returnarray
 */
public static function defaultConstants()
{
return array(
'CP_DIRECTORY'=> 'admin',
'IN_DEV'=> FALSE,
'DEV_USE_WHOOPS'=> TRUE,
'DEV_USE_FURL_CACHE'=> FALSE,
'DEBUG_JS'=> FALSE,
'DEV_DEBUG_JS'=> TRUE,
'DEV_DEBUG_CSS'=> FALSE,
'DEV_DEBUG_TEMPLATES'=> FALSE,
'IPS_FOLDER_PERMISSION'=> 0777,
'FOLDER_PERMISSION_NO_WRITE'=> 0755,
'IPS_FILE_PERMISSION'=> 0644,
'ROOT_PATH'=> __DIR__,
'NO_WRITES'=> FALSE,
'LOG_METHOD'=> '{}',
'STORE_METHOD'=> 'Database',
'STORE_CONFIG'=> '{}',
'CACHE_METHOD'=> 'None',
'CACHE_CONFIG'=> '{}',
'EMAIL_DEBUG_PATH'=> NULL,
'BULK_MAILS_PER_CYCLE'=> 0,
'JAVA_PATH'=> "",
'ERROR_PAGE'=> 'error.html',
'QUERY_LOG'=> FALSE,
'ENFORCE_ACCESS'=> FALSE,
'THUMBNAIL_SIZE'=> '500x500',
'COOKIE_DOMAIN'=> NULL,
'COOKIE_PREFIX'=> NULL,
'CONNECT_NOSYNC_NAMES'=> FALSE,
'BYPASS_CURL'=> FALSE,
'NEXUS_TEST_GATEWAYS'=> FALSE,
'UPGRADE_MANUAL_THRESHOLD'=> 1000000,
'UPGRADE_LARGE_THRESHOLD'=> 150000,
'SKIP_SERVER_PORT'=> FALSE,
'HTMLENTITIES'=> ( version_comparephpversion(), '5.4.0''<' ) ) ? ENT_IGNORE ENT_DISALLOWED,
'SUITE_UNIQUE_KEY'=> md5( ( ( isset( $_SERVER['SERVER_NAME'] ) ) ? $_SERVER['SERVER_NAME'] : '' ) . '$Rev: 3023$'),
'USE_DEVELOPMENT_BUILDS'=> FALSE,
'DEV_WHOOPS_EDITOR'=> NULL,
);
}

/**
 * Initiate IPS Social Suite constants, autoloader and exception handler
 *
 * @returnvoid
 */
public static function init()
{
/* Set timezone */
date_default_timezone_set'UTC' );
 
/* Set default MB internal encoding */
mb_internal_encoding('UTF-8');
 
/* Define the IN_IPB constant - this needs to be in the global namespace for backwards compatibility */
define'IN_IPB'TRUE );

/* Load constants.php */
if( file_exists__DIR__ '/constants.php' ) )
{
@include_once( 
__DIR__ '/constants.php' );
}

/* Import and set defaults */
foreach ( static::defaultConstants() as $k => $v )
{
if( 
defined$k ) )
{
define'IPS\\' $kconstant$k ) );
}
else
{
define'IPS\\' $k$v );
}
}

/* Load developer code */
if( IN_DEV and file_existsROOT_PATH '/dev/function_overrides.php' ) )
{
self::$inDevCode file_get_contentsROOT_PATH '/dev/function_overrides.php' );
}

/* Set autoloader */
spl_autoload_register'\IPS\IPS::autoloader'truetrue );

/* Set error handlers */
if ( \IPS\IN_DEV AND \IPS\DEV_USE_WHOOPS and file_existsROOT_PATH '/dev/Whoops/Run.php' ) )
{
self::$PSR0Namespaces['Whoops'] = ROOT_PATH '/dev/Whoops';
$whoops = new \Whoops\Run;
$ipsHandler = new \Whoops\Handler\IPSHandler;
if ( \
IPS\DEV_WHOOPS_EDITOR )
{
$ipsHandler->setEditor( \IPS\DEV_WHOOPS_EDITOR );
}
$whoops->pushHandler$ipsHandler );
$jsonHandler = new \Whoops\Handler\JsonResponseHandler;
$jsonHandler->onlyForAjaxRequeststrue );
$whoops->pushHandler$jsonHandler );
$whoops->register();
}
else
{
set_error_handler'\IPS\IPS::errorHandler' );
set_exception_handler'\IPS\IPS::exceptionHandler' );
}
 
/* Init hooks */
if ( file_exists( \IPS\ROOT_PATH '/plugins/hooks.txt' ) )
{
$mtime filemtime( \IPS\ROOT_PATH '/plugins/hooks.txt' );

$encrypted file_get_contents( \IPS\ROOT_PATH '/plugins/hooks.txt' );
$decrypted '';
for ( 
$i 0$i mb_strlen$encrypted ); $i++ )
{
$decrypted .= chrordmb_substr$encrypted$i) ) - mb_substr$mtime, ( $i mb_strlen$mtime ) ) - 1) );
}

if ( !( 
self::$hooks = @json_decode$decryptedTRUE ) ) )
{
self::$hooks = array();
}
}
}
 
/**
 * Autoloader
 *
 * @paramstring$classnameClass to load
 * @returnvoid
 */
public static function autoloader$classname )
{
/* Separate by namespace */
$bits explode'\\'ltrim$classname'\\' ) );

/* If this doesn't belong to us, try a PSR-0 loader or ignore it */
$vendorName array_shift$bits );
if( 
$vendorName !== 'IPS' )
{
if ( isset( 
self::$PSR0Namespaces$vendorName ] ) )
{
@include_once( 
self::$PSR0Namespaces$vendorName ] . DIRECTORY_SEPARATOR implodeDIRECTORY_SEPARATOR$bits ) . '.php' );
}

return;
}

/* Work out what namespace we're in */
$class array_pop$bits );
$namespace = empty( $bits ) ? 'IPS' : ( 'IPS\\' implode'\\'$bits ) );
$inDevCode '';

/* We only need to load the file if we don't have the underscore-prefixed one */
if( !class_exists"{$namespace}\\_{$class}"FALSE ) )
{
/* Locate file */
$path ROOT_PATH '/';
$sourcesDirSet FALSE;
foreach ( 
array_merge$bits, array( $class ) ) as $i => $bit )
{
if( 
ctype_lower$bit ) === TRUE )
{
if( 
$i === )
{
$path .= 'applications/';
}
else
{
$sourcesDirSet TRUE;
}
}
elseif ( 
$i === and $bit === 'Upgrade' )
{
$bit mb_strtolower$bit );
}
elseif( 
$sourcesDirSet === FALSE )
{
if( 
$i === )
{
$path .= 'system/';
}
elseif ( 
$i === and $bit === 'Application' )
{
// do nothing
}
else
{
$path .= 'sources/';
}
$sourcesDirSet TRUE;
}

$path .= "{$bit}/";
}

/* Load it */
$path = \substr$path0, -) . '.php';
if( !
file_exists$path ) )
{
$path = \substr$path0, -) . \substr$path, \strrpos$path'/' ) );
if ( !
file_exists$path ) )
{
return 
FALSE;
}
}
require_once( 
$path );

/* Is it an interface? */
if ( interface_exists"{$namespace}\\{$class}"FALSE ) )
{
return;
}

/* Doesn't exist? */
if( !class_exists"{$namespace}\\_{$class}"FALSE ) )
{
trigger_error"Class {$classname} could not be loaded. Ensure it has been properly prefixed with an underscore and is in the correct namespace."E_USER_ERROR );
}

/* Stuff for developer mode */
if( IN_DEV )
{
try
{
$reflection = new \ReflectionClass"{$namespace}\\_{$class});

/* Import our code to override forbidden functions */
if( !in_array( \strtolower$namespace ), self::$inDevCodeImportedTo ) )
{
$inDevCode self::$inDevCode;
self::$inDevCodeImportedTo[] = \strtolower$namespace );
}

/* Any classes which extend a core PHP class are exempt from our rules */
$parent $reflection->getParentClass();
if( 
$parent === false or \substr$parent->getNamespaceName(), 0) === 'IPS' )
{
/* Make sure it's name follows our standards */
if( !preg_match'/^_[A-Z]+$/i'$reflection->getShortName() ) )
{
trigger_error"{$classname} does not follow our naming conventions. Please rename using only alphabetic characters and PascalCase. (PHP Coding Standards: Classes.5)"E_USER_ERROR );
}

/* Loop methods */
$hasNonAbstract FALSE;
$hasNonStatic FALSE;
foreach ( 
$reflection->getMethods() as $method )
{
if ( \
substr$method->getDeclaringClass()->getName(), 0) === 'IPS' )
{
/* Make sure it's not private */
if( $method->isPrivate() )
{
trigger_error"{$classname}::{$method->name} is declared as private. In order to ensure that hooks are able to work freely, please use protected instead. (PHP Coding Standards: Functions and Methods.4)"E_USER_ERROR );
}

/* We need to know for later if we have non-abstract methods */
if( !$method->isAbstract() )
{
$hasNonAbstract TRUE;
}

/* We need to know for later if we have non-static methods */
if( !$method->isStatic() )
{
$hasNonStatic TRUE;
}

/* Make sure the name follows our conventions */
if(
!
preg_match'/^_?[a-z][A-Za-z0-9]*$/'$method->name )// Normal pattern most methods should match
and
!
preg_match'/^get_/i'$method->name )// get_* is allowed
and
!
preg_match'/^set_/i'$method->name )// set_* is allowed
and
!
preg_match'/^parse_/i'$method->name )// parse_* is allowed
and
!
preg_match'/^setBitwise_/i'$method->name )// set_Bitiwse_* is allowed
and
!
in_array$method->name, array(// PHP's magic methods are allowed (except __sleep and __wakeup as we don't allow serializing)
'__construct',
'__destruct',
'__call',
'__callStatic',
'__get',
'__set',
'__isset',
'__unset',
'__toString',
'__invoke',
'__set_state',
'__clone',
) )
) {
trigger_error"{$classname}::{$method->name} does not follow our naming conventions. Please rename using only alphabetic characters and camelCase. (PHP Coding Standards: Functions and Methods.1-3)"E_USER_ERROR );
}
}
}

/* Loop properties */
foreach ( $reflection->getProperties() as $property )
{
$hasNonAbstract TRUE;

/* Make sure it's not private */
if( $property->isPrivate() )
{
trigger_error"{$classname}::\${$property->name} is declared as private. In order to ensure that hooks are able to work freely, please use protected instead. (PHP Coding Standards: Properties and Variables.3)"E_USER_ERROR );
}

/* Make sure the name follows our conventions */
if( !preg_match'/^_?[a-z][A-Za-z]*$/'$property->name ) )
{
trigger_error"{$classname}::\${$property->name} does not follow our naming conventions. Please rename using only alphabetic characters and camelCase. (PHP Coding Standards: Properties and Variables.1-2)"E_USER_ERROR );
}
}

/* Check an interface wouldn't be more appropriate */
if( !$hasNonAbstract )
{
trigger_error"You do not have any non-abstract methods in {$classname}. Please use an interface instead. (PHP Coding Standards: Classes.7)"E_USER_ERROR );
}

/* Check we have at least one non-static method (unless this class is abstract or has a parent) */
elseif( !$reflection->isAbstract() and $reflection->getParentClass() === FALSE and !$hasNonStatic and $reflection->getNamespacename() !== 'IPS\Output\Plugin' and !in_array'extensions'$bits ) and !in_array'templateplugins'$bits ) )
{
trigger_error"You do not have any methods in {$classname} which are not static. Please refactor. (PHP Coding Standards: Functions and Methods.6)"E_USER_ERROR );
}
}
}
catch ( \
Exception $e ) {}
}
}

/* Monkey Patch */
self::monkeyPatch$namespace$class$inDevCode );
}

/**
 * Monkey Patch
 *
 * @paramstring$namespaceThe namespace
 * @paramstring$finalClassThe final class name we want to be able to use (without namespace)
 * @paramstring$extraCodeAny additonal code to import before the class is defined
 * @returnnull
 */
public static function monkeyPatch$namespace$finalClass$extraCode '' )
{
$realClass "_{$finalClass}";
if( isset( 
self::$hooks"\\{$namespace}\\{$finalClass}] ) )
{
foreach ( 
self::$hooks"\\{$namespace}\\{$finalClass}] as $id => $data )
{
$contents "namespace {$namespace}; "str_replace'_HOOK_CLASS_'$realClassfile_get_contentsROOT_PATH '/' $data['file'] ) );
if( @eval( 
$contents ) !== FALSE )
{
$realClass $data['class'];
}
}
}

$reflection = new \ReflectionClass"{$namespace}\\_{$finalClass});
if( eval( 
"namespace {$namespace}; "$extraCode . ( $reflection->isAbstract() ? 'abstract' '' )." class {$finalClass} extends {$realClass} {}" ) === FALSE )
{
trigger_error"There was an error initiating the class {$namespace}\\{$finalClass}."E_USER_ERROR );
}
}

/**
 * Error Handler
 *
 * @paramint$errnoError number
 * @paramerrstr$errstrError message
 * @paramstring$errfileFile
 * @paramint$errlineLine
 * @paramarray$traceBacktract
 * @returnvoid
 */
public static function errorHandler$errno$errstr$errfile$errline$trace=NULL )
{
/* We don't care about these in production */
if ( in_array$errno, array( E_NOTICEE_DEPRECATED ) ) )
{
return;
}
 
/* This means the error suppressor was used, so we should ignore any non-fatal errors */
if ( error_reporting() === )
{
return 
false;
}

throw new \
ErrorException$errstr$errno0$errfile$errline );
}

/**
 * Exception Handler
 *
 * @param\Exception$exceptionException class
 * @returnvoid
 */
public static function exceptionHandler$exception )
{
try
{
\
IPS\Output::i()->error'generic_error'"EX{$exception->getCode()}"500"<pre>{$exception}</pre>" );
}
catch ( \
Exception $e )
{
if( isset( 
$_SERVER['SERVER_PROTOCOL'] ) and \strstr$_SERVER['SERVER_PROTOCOL'], '/1.0' ) !== false )
{
header"HTTP/1.0 500 Internal Server Error" );
}
else
{
header"HTTP/1.1 500 Internal Server Error" );
}

require \
IPS\ROOT_PATH '/' . \IPS\ERROR_PAGE;
}
exit;
}

/**
 * Get license key data
 *
 * @returnarray|NULL
 */
public static function licenseKey()
{
/* Get the cached value */
$cached NULL;
if ( isset( \
IPS\Data\Store::i()->license_data ) )
{
$cached = \IPS\Data\Store::i()->license_data;
 
/* If it's younger than 21 days, just use that */
if ( $cached['fetched'] > ( time() - 1814400 ) )
{
return 
$cached['data'];
}
}

$response'{"key": "ABCDE-FGHIJ-KLMNO-PQRST-UVWXY", "url": "http:\/\/' $_SERVER['HTTP_HOST'] . '", "test_url": "http:\/\/localhost", "edition": "Complete", "cloud": true, "active": true, "expires": "2020-12-31 00:00:00", "products": { "spam": true, "forums": true, "calendar": true, "pages": true, "ccs": true, "board": true, "blog": true, "gallery": true, "downloads": true, "content": true, "nexus": true, "copyright": true }, "chat_limit": 999, "support": "Premium"}';
$responsejson_decode$response TRUE );

/* Update the license info in the store */
\IPS\Data\Store::i()->license_data= array( 'fetched' => time(), 'data' => $response );
 
/* Return */
return $response;
}

/**
 * Check license key
 *
 * @paramstringThe license key
 * @paramstringThe site URL
 * @returnvoid
 * @throws\DomainException
 */
public static function checkLicenseKey$val$url )
{
$response'{"key": "ABCDE-FGHIJ-KLMNO-PQRST-UVWXY", "url": "http:\/\/' $_SERVER['HTTP_HOST'] . '", "test_url": "http:\/\/localhost", "edition": "Complete", "cloud": true, "active": true, "expires": "2020-12-31 00:00:00", "products": { "spam": true, "forums": true, "calendar": true, "pages": true, "ccs": true, "board": true, "blog": true, "gallery": true, "downloads": true, "content": true, "nexus": true, "copyright": true }, "chat_limit": 999, "support": "Premium"}';
$responsejson_decode$response TRUE );
}
}
 
/* Init */
IPS::init(); 


Then, upload it and you are set to go. When prompted for a license, enter whatever you want. And this works, simply because your board will think you are using the pre-release key and never check if it's real. And as long as IPS doesn't update this file, this should work on any and all releases for IPS4.

Enjoy! If theres any problem let me know below i'll help you :8

Users browsing this thread: 5 Guest(s)