开发者

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)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜