Самая тонкая реализация OpenID? - PullRequest
0 голосов
/ 15 января 2011

Существует ли реализация OpenID, которая меньше 5 КБ или хотя бы меньше 10 КБ?

Пожалуйста, отформатируйте код с http://beta.phpformatter.com/ со следующими настройками, чтобы получить истинный размер:

Отступ:

Стиль отступа: {K&R (One true brace style)}
Отступ с: {Tabs}
Начальный отступ: [1]
Отступ: [1]

Общее:

[x] Удаление всех комментариев
[x] Удаление пустых строк
[x] Прекрасное выравнивание операторов присваивания
[ ] Поместите комментарий с условием после if, while, for, foreach, объявлять и ловить операторы

Улучшение:

[x] Удалять строки только точкой с запятой (;)
[x] Делать нормальные комментарии (//) из perlкомментарии (#)
[x] сделать длинный открывающий тег (

скобки:

[x] пробел внутри скобок - ( )
[x] пробел внутри пустых скобок - ( )
[x] Пробел внутри пустых скобок - [ ]
[x] Пробел внутри пустых скобок - [ ]

Редактировать:

Аликс Аксель ответ кажется великолепным, не идеальным, но он добирается.КСТАТИ: это 6,4 КБ, так что он уже не самый маленький, но я прохожу его, чтобы очистить его намного больше.

<?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" );
?>

Ответы [ 3 ]

3 голосов
/ 15 января 2011

Уменьшите Lightopenid

Во-первых, я действительно не понимаю ваших ограничений по размеру файла.Я нахожу это немного глупым, если вы спросите меня ...

Вы можете сделать график вызовов (использовать какой-нибудь детектор мертвого кода) из светового пениса, чтобы увидеть, какие функции (используются только некоторые)ты используешь.Многие из этих больших функций не используются стандартными, например, я считаю, что вы можете удалить большую функцию protected function request_streams($url, $method='GET', $params=array()) на line 198. Я также удалил некоторые другие функции, которые не используются при использовании ее с примером example-google.php.Мой последний класс lightopenid выглядит следующим образом (держу пари, вы даже можете исключить больше кода при использовании графа вызовов / детектора мертвого кода).

Но теперь я уменьшил размер файла до 9,8 КБ.Если вы сжимаете его, вы можете получить его еще больше.Я получил его до желаемой отметки 10K, но теперь код больше не может быть прочитан людьми.

Поиск кода:

Вы также можете взглянуть на эти ресурсы / поиски, чтобы увидетьесли они легче (я очень сомневаюсь в этом):

2 голосов
/ 15 января 2011

Самая тонкая реализация openid, которую я знаю, это LightOpenId

У него 30 КБ с комментариями, поэтому, если вы запустите его через этот форматтер, он станет намного меньше

РЕДАКТИРОВАТЬ : я нашел меньшее здесь (всего 6,6 КБ после переформатирования)

1 голос
/ 15 января 2011

Вдохновлен светопенидом и частью функции (зависит от 5 других методов) :

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;
}

Использование:

OpenID('https://www.google.com/accounts/o8/id');

PS: я обновил код, который я ранее разместил, потому что он был неоптимальным и склонным к некоторым ошибкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...