forked from qwerty/tupali
245 lines
6.9 KiB
PHP
245 lines
6.9 KiB
PHP
|
<?php
|
||
|
|
||
|
/**
|
||
|
* HybridAuth
|
||
|
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
||
|
* (c) 2009-2015, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Hybrid_Provider_Model provide a common interface for supported IDps on HybridAuth.
|
||
|
*
|
||
|
* Basically, each provider adapter has to define at least 4 methods:
|
||
|
* Hybrid_Providers_{provider_name}::initialize()
|
||
|
* Hybrid_Providers_{provider_name}::loginBegin()
|
||
|
* Hybrid_Providers_{provider_name}::loginFinish()
|
||
|
* Hybrid_Providers_{provider_name}::getUserProfile()
|
||
|
*
|
||
|
* HybridAuth also come with three others models
|
||
|
* Class Hybrid_Provider_Model_OpenID for providers that uses the OpenID 1 and 2 protocol.
|
||
|
* Class Hybrid_Provider_Model_OAuth1 for providers that uses the OAuth 1 protocol.
|
||
|
* Class Hybrid_Provider_Model_OAuth2 for providers that uses the OAuth 2 protocol.
|
||
|
*/
|
||
|
abstract class Hybrid_Provider_Model {
|
||
|
|
||
|
/**
|
||
|
* IDp ID (or unique name)
|
||
|
* @var mixed
|
||
|
*/
|
||
|
public $providerId = null;
|
||
|
|
||
|
/**
|
||
|
* Specific provider adapter config
|
||
|
* @var array
|
||
|
*/
|
||
|
public $config = null;
|
||
|
|
||
|
/**
|
||
|
* Provider extra parameters
|
||
|
* @var array
|
||
|
*/
|
||
|
public $params = null;
|
||
|
|
||
|
/**
|
||
|
* Endpoint URL for that provider
|
||
|
* @var string
|
||
|
*/
|
||
|
public $endpoint = null;
|
||
|
|
||
|
/**
|
||
|
* Hybrid_User obj, represents the current loggedin user
|
||
|
* @var Hybrid_User
|
||
|
*/
|
||
|
public $user = null;
|
||
|
|
||
|
/**
|
||
|
* The provider api client (optional)
|
||
|
* @var stdClass
|
||
|
*/
|
||
|
public $api = null;
|
||
|
|
||
|
/**
|
||
|
* Model should use "gzip,deflate" for CURLOPT_ENCODING
|
||
|
* @var stdClass
|
||
|
*/
|
||
|
public $compressed = false;
|
||
|
|
||
|
/**
|
||
|
* Common providers adapter constructor
|
||
|
*
|
||
|
* @param mixed $providerId Provider ID
|
||
|
* @param array $config Provider adapter config
|
||
|
* @param array $params Provider extra params
|
||
|
*/
|
||
|
function __construct($providerId, $config, $params = null) {
|
||
|
# init the IDp adapter parameters, get them from the cache if possible
|
||
|
if (!$params) {
|
||
|
$this->params = Hybrid_Auth::storage()->get("hauth_session.$providerId.id_provider_params");
|
||
|
} else {
|
||
|
$this->params = $params;
|
||
|
}
|
||
|
|
||
|
// idp id
|
||
|
$this->providerId = $providerId;
|
||
|
|
||
|
// set HybridAuth endpoint for this provider
|
||
|
$this->endpoint = Hybrid_Auth::storage()->get("hauth_session.$providerId.hauth_endpoint");
|
||
|
|
||
|
// idp config
|
||
|
$this->config = $config;
|
||
|
|
||
|
// new user instance
|
||
|
$this->user = new Hybrid_User();
|
||
|
$this->user->providerId = $providerId;
|
||
|
|
||
|
// initialize the current provider adapter
|
||
|
$this->initialize();
|
||
|
|
||
|
Hybrid_Logger::debug("Hybrid_Provider_Model::__construct( $providerId ) initialized. dump current adapter instance: ", serialize($this));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* IDp wrappers initializer
|
||
|
*
|
||
|
* The main job of wrappers initializer is to performs (depend on the IDp api client it self):
|
||
|
* - include some libs needed by this provider,
|
||
|
* - check IDp key and secret,
|
||
|
* - set some needed parameters (stored in $this->params) by this IDp api client
|
||
|
* - create and setup an instance of the IDp api client on $this->api
|
||
|
*
|
||
|
* @return void
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
abstract protected function initialize();
|
||
|
|
||
|
/**
|
||
|
* Begin login
|
||
|
*
|
||
|
* @return void
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
abstract protected function loginBegin();
|
||
|
|
||
|
/**
|
||
|
* Finish login
|
||
|
* @return void
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
abstract protected function loginFinish();
|
||
|
|
||
|
/**
|
||
|
* Generic logout, just erase current provider adapter stored data to let Hybrid_Auth all forget about it
|
||
|
* @return bool
|
||
|
*/
|
||
|
function logout() {
|
||
|
Hybrid_Logger::info("Enter [{$this->providerId}]::logout()");
|
||
|
$this->clearTokens();
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Grab the user profile from the IDp api client
|
||
|
* @return Hybrid_User_Profile
|
||
|
* @throw Exception
|
||
|
*/
|
||
|
function getUserProfile() {
|
||
|
Hybrid_Logger::error("HybridAuth do not provide users contacts list for {$this->providerId} yet.");
|
||
|
throw new Exception("Provider does not support this feature.", 8);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Load the current logged in user contacts list from the IDp api client
|
||
|
* @return Hybrid_User_Contact[]
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
function getUserContacts() {
|
||
|
Hybrid_Logger::error("HybridAuth do not provide users contacts list for {$this->providerId} yet.");
|
||
|
throw new Exception("Provider does not support this feature.", 8);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Return the user activity stream
|
||
|
* @return Hybrid_User_Activity[]
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
function getUserActivity($stream) {
|
||
|
Hybrid_Logger::error("HybridAuth do not provide user's activity stream for {$this->providerId} yet.");
|
||
|
throw new Exception("Provider does not support this feature.", 8);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set user status
|
||
|
* @return mixed Provider response
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
function setUserStatus($status) {
|
||
|
Hybrid_Logger::error("HybridAuth do not provide user's activity stream for {$this->providerId} yet.");
|
||
|
throw new Exception("Provider does not support this feature.", 8);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Return the user status
|
||
|
* @return mixed Provider response
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
function getUserStatus($statusid) {
|
||
|
Hybrid_Logger::error("HybridAuth do not provide user's status for {$this->providerId} yet.");
|
||
|
throw new Exception("Provider does not support this feature.", 8);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Return true if the user is connected to the current provider
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function isUserConnected() {
|
||
|
return (bool) Hybrid_Auth::storage()->get("hauth_session.{$this->providerId}.is_logged_in");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set user to connected
|
||
|
* @return void
|
||
|
*/
|
||
|
public function setUserConnected() {
|
||
|
Hybrid_Logger::info("Enter [{$this->providerId}]::setUserConnected()");
|
||
|
Hybrid_Auth::storage()->set("hauth_session.{$this->providerId}.is_logged_in", 1);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set user to unconnected
|
||
|
* @return void
|
||
|
*/
|
||
|
public function setUserUnconnected() {
|
||
|
Hybrid_Logger::info("Enter [{$this->providerId}]::setUserUnconnected()");
|
||
|
Hybrid_Auth::storage()->set("hauth_session.{$this->providerId}.is_logged_in", 0);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get or set a token
|
||
|
* @return string
|
||
|
*/
|
||
|
public function token($token, $value = null) {
|
||
|
if ($value === null) {
|
||
|
return Hybrid_Auth::storage()->get("hauth_session.{$this->providerId}.token.$token");
|
||
|
} else {
|
||
|
Hybrid_Auth::storage()->set("hauth_session.{$this->providerId}.token.$token", $value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Delete a stored token
|
||
|
* @return void
|
||
|
*/
|
||
|
public function deleteToken($token) {
|
||
|
Hybrid_Auth::storage()->delete("hauth_session.{$this->providerId}.token.$token");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Clear all existent tokens for this provider
|
||
|
* @return void
|
||
|
*/
|
||
|
public function clearTokens() {
|
||
|
Hybrid_Auth::storage()->deleteMatch("hauth_session.{$this->providerId}.");
|
||
|
}
|
||
|
|
||
|
}
|