mirror of
https://github.com/e107inc/e107.git
synced 2025-02-22 07:47:10 +01:00
270 lines
8.0 KiB
PHP
270 lines
8.0 KiB
PHP
<?php
|
|
|
|
/* !
|
|
* HybridAuth
|
|
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
|
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
|
*/
|
|
|
|
/**
|
|
* Yahoo OAuth Class.
|
|
*
|
|
* @package HybridAuth providers package
|
|
* @author Lukasz Koprowski <azram19@gmail.com>
|
|
* @author Oleg Kuzava <olegkuzava@gmail.com>
|
|
* @version 1.0
|
|
* @license BSD License
|
|
*/
|
|
|
|
/**
|
|
* Hybrid_Providers_Yahoo - Yahoo provider adapter based on OAuth2 protocol.
|
|
*/
|
|
class Hybrid_Providers_Yahoo extends Hybrid_Provider_Model_OAuth2 {
|
|
|
|
/**
|
|
* Define Yahoo scopes.
|
|
*
|
|
* @var array $scope
|
|
* If empty will be used YDN App scopes.
|
|
* @see https://developer.yahoo.com/oauth2/guide/yahoo_scopes.
|
|
*/
|
|
public $scope = [];
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
function initialize() {
|
|
parent::initialize();
|
|
|
|
// Provider api end-points.
|
|
$this->api->api_base_url = "https://social.yahooapis.com/v1/";
|
|
$this->api->authorize_url = "https://api.login.yahoo.com/oauth2/request_auth";
|
|
$this->api->token_url = "https://api.login.yahoo.com/oauth2/get_token";
|
|
|
|
// Set token headers.
|
|
$this->setAuthorizationHeaders("basic");
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
function loginBegin() {
|
|
if (is_array($this->scope)) {
|
|
$this->scope = implode(",", $this->scope);
|
|
}
|
|
parent::loginBegin();
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
function getUserProfile() {
|
|
$userId = $this->getCurrentUserId();
|
|
|
|
$response = $this->api->get("user/{$userId}/profile", array(
|
|
"format" => "json",
|
|
));
|
|
|
|
if (!isset($response->profile)) {
|
|
throw new Exception("User profile request failed! {$this->providerId} returned an invalid response: " . Hybrid_Logger::dumpData($response), 6);
|
|
}
|
|
|
|
$data = $response->profile;
|
|
|
|
$this->user->profile->identifier = isset($data->guid) ? $data->guid : "";
|
|
$this->user->profile->firstName = isset($data->givenName) ? $data->givenName : "";
|
|
$this->user->profile->lastName = isset($data->familyName) ? $data->familyName : "";
|
|
$this->user->profile->displayName = isset($data->nickname) ? trim($data->nickname) : "";
|
|
$this->user->profile->profileURL = isset($data->profileUrl) ? $data->profileUrl : "";
|
|
$this->user->profile->gender = isset($data->gender) ? $data->gender : "";
|
|
|
|
if ($this->user->profile->gender === "F") {
|
|
$this->user->profile->gender = "female";
|
|
}
|
|
elseif ($this->user->profile->gender === "M") {
|
|
$this->user->profile->gender = "male";
|
|
}
|
|
|
|
if (isset($data->emails)) {
|
|
$email = "";
|
|
foreach ($data->emails as $v) {
|
|
if (isset($v->primary) && $v->primary) {
|
|
$email = isset($v->handle) ? $v->handle : "";
|
|
break;
|
|
}
|
|
}
|
|
$this->user->profile->email = $email;
|
|
$this->user->profile->emailVerified = $email;
|
|
}
|
|
|
|
$this->user->profile->age = isset($data->displayAge) ? $data->displayAge : "";
|
|
$this->user->profile->photoURL = isset($data->image) ? $data->image->imageUrl : "";
|
|
|
|
$this->user->profile->address = isset($data->location) ? $data->location : "";
|
|
$this->user->profile->language = isset($data->lang) ? $data->lang : "";
|
|
|
|
return $this->user->profile;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
function getUserContacts() {
|
|
$userId = $this->getCurrentUserId();
|
|
|
|
$response = $this->api->get("user/{$userId}/contacts", array(
|
|
"format" => "json",
|
|
"count" => "max",
|
|
));
|
|
|
|
if ($this->api->http_code != 200) {
|
|
throw new Exception("User contacts request failed! {$this->providerId} returned an error: " . $this->errorMessageByStatus());
|
|
}
|
|
|
|
if (!isset($response->contacts) || !isset($response->contacts->contact) || (isset($response->errcode) && $response->errcode != 0)) {
|
|
return array();
|
|
}
|
|
|
|
$contacts = array();
|
|
foreach ($response->contacts->contact as $item) {
|
|
$uc = new Hybrid_User_Contact();
|
|
|
|
$uc->identifier = isset($item->id) ? $item->id : "";
|
|
$uc->email = $this->selectEmail($item->fields);
|
|
$uc->displayName = $this->selectName($item->fields);
|
|
$uc->photoURL = $this->selectPhoto($item->fields);
|
|
|
|
$contacts[] = $uc;
|
|
}
|
|
|
|
return $contacts;
|
|
}
|
|
|
|
/**
|
|
* Returns current user id.
|
|
*
|
|
* @return string
|
|
* Current user ID.
|
|
* @throws Exception
|
|
*/
|
|
function getCurrentUserId() {
|
|
// Set headers to get refresh token.
|
|
$this->setAuthorizationHeaders("basic");
|
|
|
|
// Refresh tokens if needed.
|
|
$this->refreshToken();
|
|
|
|
// Set headers to make api call.
|
|
$this->setAuthorizationHeaders("bearer");
|
|
|
|
$response = $this->api->get("me/guid", array(
|
|
"format" => "json",
|
|
));
|
|
|
|
if (!isset($response->guid->value)) {
|
|
throw new Exception("User id request failed! {$this->providerId} returned an invalid response: " . Hybrid_Logger::dumpData($response));
|
|
}
|
|
|
|
return $response->guid->value;
|
|
}
|
|
|
|
/**
|
|
* Utility function for returning values from XML-like objects.
|
|
*
|
|
* @param stdClass $vs
|
|
* Object.
|
|
* @param string $t
|
|
* Property name.
|
|
* @return mixed
|
|
*/
|
|
private function select($vs, $t) {
|
|
foreach ($vs as $v) {
|
|
if ($v->type == $t) {
|
|
return $v;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Parses user name.
|
|
*
|
|
* @param stdClass $v
|
|
* Object.
|
|
* @return string
|
|
* User name.
|
|
*/
|
|
private function selectName($v) {
|
|
$s = $this->select($v, "name");
|
|
if (!$s) {
|
|
$s = $this->select($v, "nickname");
|
|
return isset($s->value) ? $s->value : "";
|
|
}
|
|
return isset($s->value) ? "{$s->value->givenName} {$s->value->familyName}" : "";
|
|
}
|
|
|
|
/**
|
|
* Parses photo URL.
|
|
*
|
|
* @param stdClass $v
|
|
* Object.
|
|
* @return string
|
|
* Photo URL.
|
|
*/
|
|
private function selectPhoto($v) {
|
|
$s = $this->select($v, "image");
|
|
|
|
return isset($s->value) ? $s->value->imageUrl : "";
|
|
}
|
|
|
|
/**
|
|
* Parses email.
|
|
*
|
|
* @param stdClass $v
|
|
* Object
|
|
* @return string
|
|
* An email address.
|
|
*/
|
|
private function selectEmail($v) {
|
|
$s = $this->select($v, "email");
|
|
if (empty($s)) {
|
|
$s = $this->select($v, "yahooid");
|
|
if (isset($s->value) && strpos($s->value, "@") === FALSE) {
|
|
$s->value .= "@yahoo.com";
|
|
}
|
|
}
|
|
|
|
return isset($s->value) ? $s->value : "";
|
|
}
|
|
|
|
/**
|
|
* Set correct Authorization headers.
|
|
*
|
|
* @param string $token_type
|
|
* Specify token type.
|
|
*
|
|
* @return void
|
|
*/
|
|
private function setAuthorizationHeaders($token_type) {
|
|
switch ($token_type) {
|
|
case "basic":
|
|
// The /get_token requires authorization header.
|
|
$token = base64_encode("{$this->config["keys"]["id"]}:{$this->config["keys"]["secret"]}");
|
|
$this->api->curl_header = array(
|
|
"Authorization: Basic {$token}",
|
|
"Content-Type: application/x-www-form-urlencoded",
|
|
);
|
|
break;
|
|
|
|
case "bearer":
|
|
// Yahoo API requires the token to be passed as a Bearer within the authorization header.
|
|
$this->api->curl_header = array(
|
|
"Authorization: Bearer {$this->api->access_token}",
|
|
);
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|