How to make a time limit for sockets? - php

How to make socket time limit ?
http://pastebin.com/0q3NeLAX
I tried socket_time_limit and others, but didnt help.
I want that if socket does not received any information, it will be closed after X seconds.
function QueryMinecraft( $IP, $Port = 25565 )
{
$Socket = Socket_Create( AF_INET, SOCK_STREAM, SOL_TCP );
if( $Socket === FALSE || #Socket_Connect( $Socket, $IP, (int)$Port ) === FALSE )
{
return FALSE;
}
Socket_Send( $Socket, "\xFE", 1, 0 );
$Len = Socket_Recv( $Socket, $Data, 256, 0 );
Socket_Close( $Socket );
if( $Len < 4 || $Data[ 0 ] != "\xFF" )
{
return FALSE;
}
$Data = SubStr( $Data, 3 );
$Data = iconv( 'UTF-16BE', 'UTF-8', $Data );
$Data = Explode( "\xA7", $Data );
return Array(
'HostName' => SubStr( $Data[ 0 ], 0, -1 ),
'Players' => isset( $Data[ 1 ] ) ? IntVal( $Data[ 1 ] ) : 0,
'MaxPlayers' => isset( $Data[ 2 ] ) ? IntVal( $Data[ 2 ] ) : 0
);
}

I would not use the sockets extension for this, I only use that for advanced socket operations that cannot be done using fsockopen(). The reason for this is that the sockets extension is not always available, whereas fsockopen() usually is.
Here is how I would write your code, with a data receive timeout:
function QueryMinecraft( $IP, $Port = 25565 )
{
// Seconds to wait for a successful connection
$connectTimeout = 5;
// Seconds to wait for data
$receiveTimeout = 5;
$Socket = fsockopen($IP, $port, $errNo, $errStr, $connectTimeout);
if( !$Socket || !stream_set_timeout( $Socket, $receiveTimeout ) )
{
return FALSE;
}
fwrite( $Socket, "\xFE" );
$Data = fread( $Socket, 256 );
fclose( $Socket );
if( strlen( $Data ) < 4 || $Data[ 0 ] != "\xFF" )
{
return FALSE;
}
$Data = SubStr( $Data, 3 );
$Data = iconv( 'UTF-16BE', 'UTF-8', $Data );
$Data = Explode( "\xA7", $Data );
return Array(
'HostName' => SubStr( $Data[ 0 ], 0, -1 ),
'Players' => isset( $Data[ 1 ] ) ? IntVal( $Data[ 1 ] ) : 0,
'MaxPlayers' => isset( $Data[ 2 ] ) ? IntVal( $Data[ 2 ] ) : 0
);
}

Related

Alternative way to store values to an array dynamically w.r.t the deprecated code to do the same

I'm working on a project version upgrade whereby emails are being fetched from Gmail and stored to database.
I'm seekng the alternative for line no.
"$this->_walk($obj, &$msg[], $main_content_type);"
as this doesn't work in new versions of PHP.
Is there any work around to achieve the same result which is a single array of all mail values?
function _walk( $object, $msg, $main_content_type = "" )
{
if ( !isset( $object->parts ) )
{
$ctype = "";
$ctype = trim( $object->ctype_primary ) . "/" . trim( $object->ctype_secondary );
if ( isset( $object->disposition ) && ( !strcasecmp( trim( $object->disposition ), "attachment" ) || ( !strcasecmp( trim( $object->disposition ), "inline" ) && ( ( strcasecmp( $ctype, "text/plain" ) && strcasecmp( $ctype, "text/html" ) ) ) ) ) )
{
$ctype .= trim( $object->disposition );
}
switch ( strtolower( $ctype ) )
{
case "text/html":
$msg .= $object->body;
break;
case "text/plain":
$enc = $object->headers[ 'content-transfer-encoding' ];
if ( $enc != "quoted-printable" ) {
$msg .= nl2br( $object->body );
} else {
$msg .= html_entity_decode( $object->body );
}
break;
case "image/jpeg":
case "image/gif":
case "image/jpg":
case "image/bmp":
$name = trim( $object->headers[ 'name' ] );
$cid = trim( $object->headers[ 'content-id' ] );
$cid = str_ireplace( "<", "", $cid );
$cid = str_ireplace( ">", "", $cid );
if ( empty( $name ) )
trim( strtok( $object->headers[ 'content-type' ], "=" ) );
$name = trim( strtok( "=\"" ) );
if ( empty( $name ) ) {
$name = $cid . "." . substr( $object->headers[ 'content-type' ], strrpos( $object->headers[ 'content-type' ], "/" ) + 1 );
}
$temp = $this->mailFolder . "/tmp/";
$name = mt_rand( 100, 999999 ) . "_" . $name;
#mkdir( $temp, 777 );
$tmpfile = $temp . $name;
$fp = fopen( $tmpfile, "w" );
fwrite( $fp, $object->body );
fclose( $fp );
$msg .= $name;
break;
default:
$name = trim( $object->headers[ 'name' ] );
if ( isset( $object->headers[ 'content-id' ] ) ) {
$cid = trim( $object->headers[ 'content-id' ] );
$cid = str_ireplace( "<", "", $cid );
$cid = str_ireplace( ">", "", $cid );
$extension = substr( $object->headers[ 'content-type' ], strpos( $object->headers[ 'content-type' ], "/" ) + 1, strpos( $object->headers[ 'content-type' ], ";" ) - strpos( $object->headers[ 'content-type' ], "/" ) - 1 );
$name = $cid . "." . $extension;
}
if ( isset( $object->ctype_parameters[ 'name' ] ) ) {
$name = trim( $object->ctype_parameters[ 'name' ] );
}
if ( empty( $name ) && isset( $object->d_parameters[ 'filename' ] ) ) {
$name = trim( $object->d_parameters[ 'filename' ] );
}
if ( empty( $name ) && strrpos( trim( $object->headers[ 'content-type' ] ), "=" ) !== FALSE ) {
$name = substr( trim( $object->headers[ 'content-type' ] ), strrpos( trim( $object->headers[ 'content-type' ] ), "=" ) + 2, -1 );
}
if ( empty( $name ) ) {
$name = 'ForwardedMessage.eml';
}
$temp = $this->mailFolder . "/tmp/";
$name = mt_rand( 100, 999999 ) . "_" . $name;
#mkdir( $temp, 777 );
$tmpfile = $temp . $name;
$fp = fopen( $tmpfile, "w" );
fwrite( $fp, $object->body );
fclose( $fp );
$msg .= $name;
break;
}
} else {
foreach ( $object->parts as $obj ) {
$this->_walk( $obj, &$msg[], $main_content_type );
}
}
return $msg;
}

How add font php

I have such a small request because I have a php code and I do not know how to add a font to it, I know I have to add an imageloadfont but when it adds the generator just does not work. I've tried everything in my mind and nothing at all.
<?php
if( isSet( $_GET[ 'Address' ] ) )
{
$szAddress = $_GET[ 'Address' ];
$szExploded = explode( ":", $szAddress );
$szServerIP = $szExploded[ 0 ];
$szServerPort = $szExploded[ 1 ];
$Query = new SourceQuery( );
$Info = Array( );
$Rules = Array( );
$Players = Array( );
try
{
$Query -> Connect( $szServerIP, $szServerPort, DEF__TIME_OUT);
$Info = $Query -> GetInfo( );
$Players = $Query -> GetPlayers( );
$Rules = $Query -> GetRules( );
}
catch( Exception $e )
{
$Exception = $e;
}
$Query -> Disconnect( );
header( "Content-type: image/png" );
$rImage = imagecreatefrompng( DEF__IMAGE_NAME );
$iColor = imagecolorallocate( $rImage, DEF__COLOR_RED, DEF__COLOR_GREEN, DEF__COLOR_BLUE );
// bool imagestring ( resource $image , int $font , int $x , int $y , string $string , int $color )
imagestring( $rImage, DEF__ADDRESS_TEXT_SIZE, DEF__ADDRESS_X, DEF__ADDRESS_Y, $szAddress, $iColor );
if( $Info[ 'MaxPlayers' ] != 0 )
{
$szHostName = MIRAGE;
$szMapName = $Info[ 'Map' ];
if( strlen( $szHostName ) > DEF__HOSTNAME_MAX_TEXT_LEN )
{
$szHostName = substr( $Info[ 'HostName' ], 0, DEF__HOSTNAME_MAX_TEXT_LEN ). ' ...';
}
if( strlen( $szMapName ) > DEF__MAP_MAX_TEXT_LEN )
{
$szMapName = substr( $szMapName, 0, DEF__MAP_MAX_TEXT_LEN ). '..';
}
imagestring( $rImage, DEF__HOSTNAME_TEXT_SIZE, DEF__HOSTNAME_X, DEF__HOSTNAME_Y, $szHostName, $iColor );
imagestring( $rImage, DEF__MAP_TEXT_SIZE, DEF__MAP_X, DEF__MAP_Y, $szMapName, $iColor );
imagestring( $rImage, DEF__PLAYERS_TEXT_SIZE, DEF__PLAYERS_X, DEF__PLAYERS_Y, $Info[ 'Players' ]. '/' .$Info[ 'MaxPlayers' ], $iColor );
}
else
{
imagestring( $rImage, DEF__PLAYERS_TEXT_SIZE, DEF__PLAYERS_X, DEF__PLAYERS_Y, "SERVER OFF", $iColor );
}
$font_width = ImageFontWidth(5);
imagepng( $rImage );
imagedestroy( $rImage );
}
?>

Fatal error: Cannot redeclare class MinecraftQueryException

I have this error in my WordPress regarding this plugin, any ideas on how to fix it?
Thank you very much! ;D
<?php
class MinecraftQueryException extends Exception
{
// Exception thrown by MinecraftQuery class
}
class MinecraftQuery
{
/*
* Class written by xPaw
*
* Website: http://xpaw.me
* GitHub: https://github.com/xPaw/PHP-Minecraft-Query
*/
const STATISTIC = 0x00;
const HANDSHAKE = 0x09;
private $Socket;
private $Players;
private $Info;
public function Connect( $Ip, $Port = 25565, $Timeout = 3 )
{
if( !is_int( $Timeout ) || $Timeout < 0 )
{
throw new InvalidArgumentException( 'Timeout must be an integer.' );
}
$this->Socket = #FSockOpen( 'udp://' . $Ip, (int)$Port, $ErrNo, $ErrStr, $Timeout );
if( $ErrNo || $this->Socket === false )
{
throw new MinecraftQueryException( 'Could not create socket: ' . $ErrStr );
}
Stream_Set_Timeout( $this->Socket, $Timeout );
Stream_Set_Blocking( $this->Socket, true );
try
{
$Challenge = $this->GetChallenge( );
$this->GetStatus( $Challenge );
}
// We catch this because we want to close the socket, not very elegant
catch( MinecraftQueryException $e )
{
FClose( $this->Socket );
throw new MinecraftQueryException( $e->getMessage( ) );
}
FClose( $this->Socket );
}
public function GetInfo( )
{
return isset( $this->Info ) ? $this->Info : false;
}
public function GetPlayers( )
{
return isset( $this->Players ) ? $this->Players : false;
}
private function GetChallenge( )
{
$Data = $this->WriteData( self :: HANDSHAKE );
if( $Data === false )
{
throw new MinecraftQueryException( 'Failed to receive challenge.' );
}
return Pack( 'N', $Data );
}
private function GetStatus( $Challenge )
{
$Data = $this->WriteData( self :: STATISTIC, $Challenge . Pack( 'c*', 0x00, 0x00, 0x00, 0x00 ) );
if( !$Data )
{
throw new MinecraftQueryException( 'Failed to receive status.' );
}
$Last = '';
$Info = Array( );
$Data = SubStr( $Data, 11 ); // splitnum + 2 int
$Data = Explode( "\x00\x00\x01player_\x00\x00", $Data );
if( Count( $Data ) !== 2 )
{
throw new MinecraftQueryException( 'Failed to parse server\'s response.' );
}
$Players = SubStr( $Data[ 1 ], 0, -2 );
$Data = Explode( "\x00", $Data[ 0 ] );
// Array with known keys in order to validate the result
// It can happen that server sends custom strings containing bad things (who can know!)
$Keys = Array(
'hostname' => 'HostName',
'gametype' => 'GameType',
'version' => 'Version',
'plugins' => 'Plugins',
'map' => 'Map',
'numplayers' => 'Players',
'maxplayers' => 'MaxPlayers',
'hostport' => 'HostPort',
'hostip' => 'HostIp',
'game_id' => 'GameName'
);
foreach( $Data as $Key => $Value )
{
if( ~$Key & 1 )
{
if( !Array_Key_Exists( $Value, $Keys ) )
{
$Last = false;
continue;
}
$Last = $Keys[ $Value ];
$Info[ $Last ] = '';
}
else if( $Last != false )
{
$Info[ $Last ] = $Value;
}
}
// Ints
$Info[ 'Players' ] = IntVal( $Info[ 'Players' ] );
$Info[ 'MaxPlayers' ] = IntVal( $Info[ 'MaxPlayers' ] );
$Info[ 'HostPort' ] = IntVal( $Info[ 'HostPort' ] );
// Parse "plugins", if any
if( $Info[ 'Plugins' ] )
{
$Data = Explode( ": ", $Info[ 'Plugins' ], 2 );
$Info[ 'RawPlugins' ] = $Info[ 'Plugins' ];
$Info[ 'Software' ] = $Data[ 0 ];
if( Count( $Data ) == 2 )
{
$Info[ 'Plugins' ] = Explode( "; ", $Data[ 1 ] );
}
}
else
{
$Info[ 'Software' ] = 'Vanilla';
}
$this->Info = $Info;
if( $Players )
{
$this->Players = Explode( "\x00", $Players );
}
}
private function WriteData( $Command, $Append = "" )
{
$Command = Pack( 'c*', 0xFE, 0xFD, $Command, 0x01, 0x02, 0x03, 0x04 ) . $Append;
$Length = StrLen( $Command );
if( $Length !== FWrite( $this->Socket, $Command, $Length ) )
{
throw new MinecraftQueryException( "Failed to write on socket." );
}
$Data = FRead( $this->Socket, 4096 );
if( $Data === false )
{
throw new MinecraftQueryException( "Failed to read from socket." );
}
if( StrLen( $Data ) < 5 || $Data[ 0 ] != $Command[ 2 ] )
{
return false;
}
return SubStr( $Data, 5 );
}
}
The error message is this:
Cannot redeclare class MinecraftQueryException
plugins/server-status-for-minecraft-pc-pe/libs/MinecraftQuery.php on
line 5

unable to call static helpers in php

I am using a class that I downloaded; being not too familiar with php classes and helpers, I decided to post it to see if anyone more experience can give some help with the error I am having.
I am calling the function in the script "torrenttest" using this
<?php
require_once 'Torrentmaker.php';
$torrent = new Torrent( 'file', 'http://fr33dom.h33t.com:3310/announce' );
$torrent->announce(array('udp://tracker.openbittorrent.com:80/announce',
if ( ! $error = $torrent->error() ) // error method return the last error message
$torrent->save('test2.torrent'); // save to disk
else
echo '<br>DEBUG: ',$error;
the problem is that when 'file' is on the same server it works fine; however when it is calling an distant server it gives an time-out error or just creates a torrent file with no size (fails to run)
this is the script of Torrentmaker.php
class Torrent {
public function __construct ( $data = null, $meta = array(), $piece_length = 256 ) {
if ( is_null( $data ) )
return false;
if ( $piece_length < 32 || $piece_length > 4096 )
return self::set_error( new Exception( 'Invalid piece lenth, must be between 32 and 4096' ) );
if ( is_string( $meta ) )
$meta = array( 'announce' => $meta );
if ( $this->build( $data, $piece_length * 1024 ) )
$this->touch();
else
$meta = array_merge( $meta, $this->decode( $data ) );
foreach( $meta as $key => $value )
$this->{$key} = $value;
public function content ( $precision = null ) {
$files = array();
if ( isset( $this->info['files'] ) && is_array( $this->info['files'] ) )
foreach ( $this->info['files'] as $file )
$files[self::path( $file['path'], $this->info['name'] )] = $precision ?
self::format( $file['length'], $precision ) :
$file['length'];
elseif ( isset( $this->info['name'] ) )
$files[$this->info['name']] = $precision ?
self::format( $this->info['length'], $precision ) :
$this->info['length'];
return $files;
}
public function save ( $filename = null ) {
return file_put_contents( is_null( $filename ) ? $this->info['name'] . '.torrent' : $filename, $this->encode( $this ) );
}
static public function file_get_contents ( $file, $timeout = self::timeout, $offset = null, $length = null ) {
if ( is_file( $file ) || ini_get( 'allow_url_fopen' ) ) {
$context = ! is_file( $file ) && $timeout ?
stream_context_create( array( 'http' => array( 'timeout' => $timeout ) ) ) :
null;
return ! is_null( $offset ) ? $length ?
#file_get_contents( $file, false, $context, $offset, $length ) :
#file_get_contents( $file, false, $context, $offset ) :
#file_get_contents( $file, false, $context );
} elseif ( ! function_exists( 'curl_init' ) )
return self::set_error( new Exception( 'Install CURL or enable "allow_url_fopen"' ) );
$handle = curl_init( $file );
if ( $timeout )
curl_setopt( $handle, CURLOPT_TIMEOUT, $timeout );
if ( $offset || $length )
curl_setopt( $handle, CURLOPT_RANGE, $offset . '-' . ( $length ? $offset + $length -1 : null ) );
curl_setopt( $handle, CURLOPT_RETURNTRANSFER, 1 );
$content = curl_exec( $handle );
$size = curl_getinfo( $handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD );
curl_close( $handle );
return ( $offset && $size == -1 ) || ( $length && $length != $size ) ? $length ?
substr( $content, $offset, $length) :
substr( $content, $offset) :
$content;
public function errors() {
return empty( self::$errors ) ?
false :
self::$errors;
}
}

Slimmest OpenID Implementation?

Is there an implementation of OpenID that is under 5K or at least under 10K?
Please format the code with http://beta.phpformatter.com/ with the following settings to get the true size:
Indentation:
Indentation style: {K&R (One true brace style)}
Indent with: {Tabs}
Starting indentation: [1]
Indentation: [1]
Common:
[x] Remove all comments
[x] Remove empty lines
[x] Align assignments statements nicely
[ ] Put a comment with the condition after if, while, for, foreach, declare and catch statements
Improvement:
[x] Remove lines with just a semicolon (;)
[x] Make normal comments (//) from perl comments (#)
[x] Make long opening tag (
Brackets:
[x] Space inside brackets- ( )
[x] Space inside empty brackets- ( )
[x] Space inside block brackets- [ ]
[x] Space inside empty block brackets- [ ]
Edit:
Alix Axel's answer seems great, not perfect but is getting there. BTW: this is 6.4K So it is no longer the smallest, but i'm going through it to clean it up lots more.
<?php
class openID {
function __construct( $url = null, $realm = null, $return = null, $redirect = true, $verify = false ) {
$data = array( );
if ( ( $verify !== true ) && ( self::Value( $_REQUEST, 'openid_mode' ) !== false ) ) {
if ( strcmp( 'id_res', self::Value( $_REQUEST, 'openid_mode' ) ) === 0 ) {
$data[ 'openid.sig' ] = $_REQUEST[ 'openid_sig' ];
$data[ 'openid.mode' ] = 'check_authentication';
$data[ 'openid.signed' ] = $_REQUEST[ 'openid_signed' ];
$data[ 'openid.assoc_handle' ] = $_REQUEST[ 'openid_assoc_handle' ];
if ( array_key_exists( 'openid_op_endpoint', $_REQUEST ) === true ) {
$data[ 'openid.ns' ] = 'http://specs.openid.net/auth/2.0';
}
foreach ( explode( ',', self::Value( $_REQUEST, 'openid_signed' ) ) as $value ) {
$data[ 'openid.' . $value ] = $_REQUEST[ 'openid_' . str_replace( '.', '_', $value ) ];
}
if ( preg_match( '~is_valid\s*:\s*true~i', self::CURL( self::__construct( $_REQUEST[ 'openid_identity' ], false, false, false, true ), $data, 'POST' ) ) > 0 ) {
return self::Value( $_REQUEST, 'openid_claimed_id', self::Value( $_REQUEST, 'openid_identity' ) );
}
}
} else if ( ( $result = self::CURL( $url ) ) !== false ) {
$xml = self::XML( $result );
$server = strval( self::XML( $xml, '//xrd/service/uri', 0 ) );
if ( empty( $server ) === true ) {
$server = strval( self::XML( $xml, '//head/link[#rel="openid.server" or #rel="openid2.provider"]/#href', 0 ) );
}
if ( self::URL( $server ) === true ) {
if ( $redirect === true ) {
$realm = ( isset( $realm ) === true ) ? $realm : sprintf( '%s://%s/', $_SERVER[ "HTTPS" ] ? "https" : "http", $_SERVER[ 'HTTP_HOST' ] );
$return = ( isset( $return ) === true ) ? $return : sprintf( '%s://%s', $_SERVER[ "HTTPS" ] ? "https" : "http", $_SERVER[ 'HTTP_HOST' ] . $_SERVER[ 'REQUEST_URI' ] );
$delegate = ( preg_match( '~http://specs[.]openid[.]net/auth/2[.]0/server~', $result ) > 0 ) ? 'http://specs.openid.net/auth/2.0/identifier_select' : $url;
if ( preg_match( '~rel="openid[.]delegate"|<[^>]*Delegate[^>]*>~i', $result ) > 0 ) {
$delegate = parent::Value( ph()->Text->Regex( $result, '<([^>]*)Delegate[^>]*>([^>]+)</\1Delegate>', 1 ), 0 );
if ( empty( $delegate ) === true ) {
$delegate = strval( self::XML( $xml, '//head/link[#rel="openid.delegate"]/#href', 0, $delegate ) );
}
}
if ( preg_match( '~rel="openid2[.]provider"|http://specs[.]openid[.]net/auth/2[.]0~i', $result ) > 0 ) {
$data[ 'openid.ns' ] = 'http://specs.openid.net/auth/2.0';
if ( preg_match( '~rel="openid2[.]local_id"|<(Local|Canonical)ID[^>]*>~i', $result ) > 0 ) {
$delegate = self::Value( self::Regex( $result, '<(Local|Canonical)ID[^>]*>([^>]+)</\1ID>', 1 ), 0 );
if ( empty( $delegate ) === true ) {
$delegate = strval( self::XML( $xml, '//head/link[#rel="openid2.local_id"]/#href', 0, $delegate ) );
}
}
}
$data[ 'openid.mode' ] = 'checkid_setup';
$data[ 'openid.return_to' ] = $return;
$data[ 'openid.claimed_id' ] = $data[ 'openid.identity' ] = $delegate;
$data[ 'openid.' . ( ( array_key_exists( 'openid.ns', $data ) === true ) ? 'realm' : 'trust_root' ) ] = $realm;
self::Redirect( sprintf( '%s%s%s', $server, ( strpos( $server, '?' ) !== false ) ? '&' : '?', http_build_query( $data, '', '&' ) ) );
}
return $server;
}
}
return false;
}
function CURL( $url, $data = null, $method = "GET", $options = array( ) ) {
$result = false;
if ( ( extension_loaded( "curl" ) === true ) && ( $this->URL( $url ) === true ) ) {
$curl = curl_init( $url );
if ( is_resource( $curl ) === true ) {
curl_setopt( $curl, CURLOPT_FAILONERROR, true );
curl_setopt( $curl, CURLOPT_AUTOREFERER, true );
curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, false );
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );
if ( preg_match( "~^GET$~i", $method ) > 0 ) {
curl_setopt( $curl, CURLOPT_HTTPGET, true );
} else if ( preg_match( "~^POST$~i", $method ) > 0 ) {
curl_setopt( $curl, CURLOPT_POST, true );
curl_setopt( $curl, CURLOPT_POSTFIELDS, $data );
}
$result = curl_exec( $curl );
if ( $result !== false ) {
curl_close( $curl );
}
}
}
return $result;
}
function Redirect( $url, $permanent = false ) {
if ( headers_sent() !== true ) {
header( "Location: " . $url, true, ( $permanent === true ) ? 301 : 302 );
}
exit( );
}
function Regex( $string, $pattern, $key = null, $modifiers = null, $flag = PREG_PATTERN_ORDER, $default = false ) {
$matches = array( );
if ( preg_match_all( "~" . $pattern . "~" . $modifiers, $string, $matches, $flag ) > 0 ) {
if ( isset( $key ) === true ) {
return ( $key === true ) ? $matches : Value( $matches, $key, $default );
}
return true;
}
return $default;
}
function URL( $value ) {
return (bool) filter_var( $value, FILTER_VALIDATE_URL );
}
function Value( $data, $key = null, $default = false ) {
if ( isset( $key ) === true ) {
foreach ( (array) $key as $value ) {
if ( is_object( $data ) === true ) {
$data = get_object_vars( $data );
}
if ( array_key_exists( $value, (array) $data ) !== true ) {
return $default;
}
$data = $data[ $value ];
}
}
return $data;
}
function XML( $xml, $xpath = null, $key = null, $default = false ) {
if ( extension_loaded( "SimpleXML" ) === true ) {
libxml_use_internal_errors( true );
if ( ( is_string( $xml ) === true ) && ( class_exists( "DOMDocument" ) === true ) ) {
$dom = new DOMDocument();
if ( $dom->loadHTML( $xml ) === true ) {
return $this->XML( simplexml_import_dom( $dom ), $xpath, $key, $default );
}
} else if ( is_object( $xml ) === true ) {
if ( isset( $xpath ) === true ) {
$xml = $xml->xpath( $xpath );
if ( isset( $key ) === true ) {
$xml = $this->Value( $xml, $key, $default );
}
}
return $xml;
}
}
return false;
}
}
new openID( "https://www.google.com/accounts/o8/id" );
?>
Slim down Lightopenid
First of I really don't get your filesize limitation. I find it kind of b*llshit if you ask me....
You could make a call graph(use some sort of dead code detector) of lightopenid to see which functions(only a few are used) you are using. A lot of these big functions aren't used standard for example I believe you can remove the big function protected function request_streams($url, $method='GET', $params=array()) on line 198. I also removed some other functions which aren't used when using it with example-google.php example. My final lightopenid class looks like this(I bet you can even eliminate more code when using call graph/dead code detector).
But now I got the filesize down to 9.8KB. If you compress it you can get it down even more. I got it down to your desired 10K mark, but now the code can not be read by humans anymore.
Code searches:
You could also have a look at these resources/searches to see if any are lighter(I highly doubt that):
https://github.com/search?langOverride=&language=php&q=openid&repo=&start_value=1&type=Repositories&x=17&y=33
http://code.google.com/hosting/search?q=openid+label:php&btn=Search+projects
Inspired by lightopenid and part of phunction (depends on 5 other methods):
public static function OpenID($id, $realm = null, $return = null, $verify = true)
{
$data = array();
if (($verify === true) && (array_key_exists('openid_mode', $_REQUEST) === true))
{
$result = parent::Value($_REQUEST, 'openid_claimed_id', parent::Value($_REQUEST, 'openid_identity'));
if (strcmp('id_res', parent::Value($_REQUEST, 'openid_mode')) === 0)
{
$data['openid.mode'] = 'check_authentication';
foreach (array('ns', 'sig', 'signed', 'assoc_handle') as $key)
{
$data['openid.' . $key] = parent::Value($_REQUEST, 'openid_' . $key);
if (strcmp($key, 'signed') === 0)
{
foreach (explode(',', parent::Value($_REQUEST, 'openid_signed')) as $value)
{
$data['openid.' . $value] = parent::Value($_REQUEST, 'openid_' . str_replace('.', '_', $value));
}
}
}
return (preg_match('~is_valid\s*:\s*true~', self::CURL(self::OpenID($result, false, false, false), array_filter($data, 'is_string'), 'POST')) > 0) ? $result : false;
}
}
else if (($result = self::XML(self::CURL($id))) !== false)
{
$server = null;
$protocol = array
(
array('specs.openid.net/auth/2.0/server', 'specs.openid.net/auth/2.0/signon', array('openid2.provider', 'openid2.local_id')),
array('openid.net/signon/1.1', 'openid.net/signon/1.0', array('openid.server', 'openid.delegate')),
);
foreach ($protocol as $key => $value)
{
while ($namespace = array_shift($value))
{
if (is_array($namespace) === true)
{
$server = strval(self::XML($result, sprintf('//head/link[contains(#rel, "%s")]/#href', $namespace[0]), 0));
$delegate = strval(self::XML($result, sprintf('//head/link[contains(#rel, "%s")]/#href', $namespace[1]), 0, $id));
}
else if (is_object($xml = self::XML($result, sprintf('//xrd/service[contains(type, "http://%s")]', $namespace), 0)) === true)
{
$server = parent::Value($xml, 'uri');
if ($key === 0)
{
$delegate = 'http://specs.openid.net/auth/2.0/identifier_select';
if (strcmp($namespace, 'specs.openid.net/auth/2.0/server') !== 0)
{
$delegate = parent::Value($xml, 'localid', parent::Value($xml, 'canonicalid', $id));
}
}
else if ($key === 1)
{
$delegate = parent::Value($xml, 'delegate', $id);
}
}
if (ph()->Is->URL($server) === true)
{
if (($realm !== false) && ($return !== false))
{
$data['openid.mode'] = 'checkid_setup';
$data['openid.identity'] = $delegate;
$data['openid.return_to'] = parent::URL($return, null, null);
if ($key === 0)
{
$data['openid.ns'] = 'http://specs.openid.net/auth/2.0';
$data['openid.realm'] = parent::URL($realm, false, false);
$data['openid.claimed_id'] = $delegate;
}
else if ($key === 1)
{
$data['openid.trust_root'] = parent::URL($realm, false, false);
}
parent::Redirect(parent::URL($server, null, $data));
}
return $server;
}
}
}
}
return false;
}
Usage:
OpenID('https://www.google.com/accounts/o8/id');
PS: I've updated the code I had previously posted because it was sub-optimal and prone to some bugs.
The slimmest openid implementation I know is LightOpenId
It has got 30kb with comments, so if you run it through that formatter it gets much smaller
EDIT: I found a smaller one here (just 6.6 kb after reformatting)

Categories