123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- <?php
- /**
- * Yahoo service definition for Keyring. Clean implementation of OAuth1
- */
- class Keyring_Service_Yahoo extends Keyring_Service_OAuth1 {
- const NAME = 'yahoo';
- const LABEL = 'Yahoo! Updates';
- function __construct() {
- parent::__construct();
- // Enable "basic" UI for entering key/secret
- if ( ! KEYRING__HEADLESS_MODE ) {
- add_action( 'keyring_yahoo_manage_ui', array( $this, 'basic_ui' ) );
- add_filter( 'keyring_yahoo_basic_ui_intro', array( $this, 'basic_ui_intro' ) );
- }
- $this->set_endpoint( 'request_token', 'https://api.login.yahoo.com/oauth/v2/get_request_token', 'GET' );
- $this->set_endpoint( 'authorize', 'https://api.login.yahoo.com/oauth/v2/request_auth', 'GET' );
- $this->set_endpoint( 'access_token', 'https://api.login.yahoo.com/oauth/v2/get_token', 'POST' );
- $creds = $this->get_credentials();
- $this->app_id = $creds['app_id'];
- $this->key = $creds['key'];
- $this->secret = $creds['secret'];
- $this->consumer = new OAuthConsumer( $this->key, $this->secret, $this->callback_url );
- $this->signature_method = new OAuthSignatureMethod_HMAC_SHA1;
- }
- function basic_ui_intro() {
- echo '<p>' . sprintf( __( 'To connect to Yahoo!, you need to <a href="%1$s">Create a new project</a>. Make sure you set the <strong>Access Scope</strong> to <strong>This app requires access to private user data</strong>. When you select that, you will be asked for an <strong>Application Domain</strong>, which should probably be set to <code>http://%2$s</code>. Which APIs you request access for will depend on how Keyring will be used on this site. Common ones will be <strong>Contacts</strong>, <strong>Social Directory</strong>, <strong>Status</strong>, and <strong>Updates</strong>.', 'keyring' ), 'https://developer.apps.yahoo.com/dashboard/createKey.html', $_SERVER['HTTP_HOST'] ) . '</p>';
- echo '<p>' . __( "Once you've created your project, copy and paste your <strong>Consumer key</strong> and <strong>Consumer secret</strong> (from under the <strong>Authentication Information: OAuth</strong> section of your app's details) into the boxes below. You don't need an App ID for Yahoo!.", 'keyring' ) . '</p>';
- }
- function parse_response( $response ) {
- return json_decode( $response );
- }
- function build_token_meta( $token ) {
- $expires = isset( $token['oauth_expires_in'] ) ? gmdate( 'Y-m-d H:i:s', time() + $token['oauth_expires_in'] ) : 0;
- $this->set_token(
- new Keyring_Access_Token(
- 'yahoo',
- new OAuthToken(
- $token['oauth_token'],
- $token['oauth_token_secret']
- )
- )
- );
- // Get user profile information
- $response = $this->request( "http://social.yahooapis.com/v1/user/{$token['xoauth_yahoo_guid']}/profile?format=json" );
- if ( Keyring_Util::is_error( $response ) ) {
- $meta = array();
- } else {
- $this->person = $response->profile;
- $meta = array(
- 'user_id' => $token['xoauth_yahoo_guid'],
- 'name' => $this->person->nickname,
- 'picture' => $this->person->image->imageUrl,
- );
- }
- return apply_filters( 'keyring_access_token_meta', $meta, 'yahoo', $token, $response, $this );
- }
- function get_display( Keyring_Access_Token$token ) {
- return $token->get_meta( 'name' );
- }
- function test_connection() {
- $this->maybe_refresh_token();
- $guid = $this->token->get_meta( 'external_id' );
- $res = $this->request( 'http://social.yahooapis.com/v1/user/' . $guid . '/profile?format=json' );
- if ( !Keyring_Util::is_error( $res ) )
- return true;
- return $res;
- }
- function maybe_refresh_token() {
- global $wpdb;
- if ( empty( $this->token->token ) || empty( $this->token->token->tokenExpires ) )
- return;
- if ( $this->token->token->tokenExpires && $this->token->token->tokenExpires < time() ) {
- $api_url = 'https://api.login.yahoo.com/oauth/v2/get_token';
- $api_url .= '?oauth_session_handle=' . $this->token->token->sessionHandle;
- $refresh = $this->request( $api_url, array(
- 'method' => 'GET',
- 'raw_response' => true,
- ) );
- if ( !Keyring_Util::is_error( $refresh ) ) {
- $token = $this->parse_access_token( $refresh );
- // Fake request token
- global $keyring_request_token;
- $keyring_request_token = new Keyring_Request_Token(
- $this->get_name(),
- array()
- );
- // Build (real) access token
- $access_token = new Keyring_Access_Token(
- $this->get_name(),
- new OAuthToken(
- $token['oauth_token'],
- $token['oauth_token_secret']
- ),
- $this->build_token_meta( $token ),
- $this->token->unique_id
- );
- // Store the updated access token
- $access_token = apply_filters( 'keyring_access_token', $access_token, $token );
- $id = $this->store->update( $access_token );
- // And switch to using it
- $this->set_token( $access_token );
- }
- }
- }
- }
- add_action( 'keyring_load_services', array( 'Keyring_Service_Yahoo', 'init' ) );
|