123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- <?php
- class DrupalOAuthToken extends OAuthToken {
- public $tid = 0;
- public $expires = 0;
- public $type = OAUTH_COMMON_TOKEN_TYPE_REQUEST;
- public $uid = 0;
- public $created = 0;
- public $changed = 0;
- public $services = array();
- public $authorized = 0;
- public $in_database = FALSE;
- public function __construct($key, $secret, $consumer, $params = array()) {
- foreach ($params as $param_key => $value) {
- if (isset($this->$param_key)) {
- $this->$param_key = $value;
- }
- }
- // Backwards compatibility with 6.x-3.0-beta3
- if (empty($consumer) || is_array($consumer)) {
- if (is_array($consumer)) {
- $params = $consumer;
- }
- if (!empty($params['csid'])) {
- $consumer = DrupalOAuthConsumer::loadById($params['csid'], isset($params['services']));
- }
- }
- if (!is_object($consumer)) {
- throw new OAuthException("Needs an associated consumer");
- }
- else {
- $this->consumer = $consumer;
- }
- parent::__construct($key, $secret);
- }
- /**
- * Writes the token to the database
- *
- * @return void
- */
- public function write() {
- $update = !empty($this->tid);
- $primary = $update ? array('tid') : array();
- if ($this->consumer->provider_consumer) {
- $this->changed = REQUEST_TIME;
- $values = array(
- 'token_key' => $this->key,
- 'changed' => $this->changed,
- 'services' => json_encode($this->services),
- 'authorized' => $this->authorized,
- );
- if ($update) {
- $values['tid'] = $this->tid;
- }
- else {
- $this->created = REQUEST_TIME;
- $values['created'] = $this->created;
- }
- $ready = drupal_write_record('oauth_common_provider_token', $values, $primary);
- if (!$ready) {
- throw new OAuthException("Couldn't save token");
- }
- }
- $values = array(
- 'csid' => $this->consumer->csid,
- 'key_hash' => sha1($this->key),
- 'token_key' => $this->key,
- 'secret' => $this->secret,
- 'expires' => $this->expires,
- 'type' => $this->type,
- 'uid' => $this->uid,
- );
- if ($update) {
- $values['tid'] = $this->tid;
- }
- drupal_write_record('oauth_common_token', $values, $primary);
- $this->tid = $values['tid'];
- $this->in_database = TRUE;
- if (!$update) {
- $values = array(
- 'tid' => $this->tid,
- 'token_key' => $this->key,
- );
- drupal_write_record('oauth_common_provider_token', $values, array('token_key'));
- }
- }
- /**
- * Deletes the token from the database
- *
- * @return void
- */
- public function delete() {
- self::deleteToken($this->key, $this->consumer);
- }
- /**
- * Deletes the token with the key from the database
- *
- * @param string $key
- * The key of the token to delete.
- * @param object $consumer
- * The consumer for which to fetch a token
- * @return void
- */
- public static function deleteToken($key, $consumer) {
- //TODO: Ensure backwards compatibility
- $condition = db_and()->condition('key_hash', sha1($key))->condition('csid', $consumer->csid);
- db_delete('oauth_common_provider_token')
- ->condition('tid', db_select('oauth_common_token', 't')->condition($condition)->fields('t', array('tid')), 'IN')
- ->execute();
- db_delete('oauth_common_token')
- ->condition($condition)
- ->execute();
- }
- /**
- * Deprecated - Gets the token with the specified key
- *
- * @param string $key
- * The key of the token to get
- * @param bool $provider_token
- * Whether the token to load is a provider token.
- * @return DrupalOAuthToken
- * The loaded token object or FALSE if load failed
- */
- public static function load($key, $provider_token = TRUE) {
- return DrupalOAuthToken::loadByKey($key, !$provider_token, FALSE);
- }
- /**
- * Gets the token with the specified key
- *
- * @param string $key
- * The key of the token to get
- * @param boolean|object $consumer
- * The consumer for which to fetch a token or FALSE to fetch a provider token
- * @param int $type
- * Used internally for backwards compatibility with ::load()
- * @return DrupalOAuthToken
- * The loaded token object or FALSE if load failed
- */
- public static function loadByKey($key, $consumer = FALSE, $type = OAUTH_COMMON_TOKEN_TYPE_ACCESS) {
- $query = db_select('oauth_common_token', 't');
- $query
- ->condition('t.key_hash', sha1($key))
- ->fields('t');
- // Only add if defined - needed for backwards compatibility with deprecated DrupalOAuthToken::load() from 6.x-3.0-beta3
- if ($type !== FALSE) {
- $query->condition('t.type', $type);
- }
- if (!$consumer || is_object($consumer) && $consumer->provider_consumer) {
- $query->join('oauth_common_provider_token', 'pt', 'pt.tid = t.tid');
- $query->fields('pt', array('created', 'changed', 'services', 'authorized'));
- }
- // Only fetch non-provider tokens - needed for backwards compatibility with deprecated DrupalOAuthToken::load() from 6.x-3.0-beta3
- if ($consumer === TRUE) {
- $query->leftJoin('oauth_common_provider_token', 'pt', 'pt.tid = t.tid');
- $query->isNull('pt.tid');
- }
- else if ($consumer) {
- $query->condition('t.csid', $consumer->csid);
- }
- return self::fromResult($query->execute(), $consumer);
- }
- /**
- * Gets the token with the specified id
- *
- * @param int $id
- * The id of the token to get
- * @param boolean $load_provider_data
- * Whether to load provider related data or not
- * @return DrupalOAuthToken
- * The loaded token object or FALSE if load failed
- */
- public static function loadById($tid, $load_provider_data = TRUE) {
- $query = db_select('oauth_common_token', 't');
- $query
- ->condition('t.tid', $tid)
- ->fields('t');
- if ($load_provider_data) {
- $query->join('oauth_common_provider_token', 'pt', 'pt.tid = t.tid');
- $query->fields('pt', array('created', 'changed', 'services', 'authorized'));
- }
- return self::fromResult($query->execute());
- }
- /**
- * Constructs a token from a db-result resource
- *
- * @param resource $res
- * A database result resource
- * @return DrupalOAuthToken
- * The constructed token object or NULL if no rows could be read or construction failed
- */
- public static function fromResult($res, $consumer = FALSE) {
- //TODO: Ensure this works with old inputs?
- if ($data = $res->fetchAssoc()) {
- if (isset($data['services'])) {
- $data['services'] = json_decode($data['services']);
- }
- $data['in_database'] = TRUE;
- if (is_object($consumer) && $consumer->csid == $data['csid']) {
- $token_consumer = $consumer;
- }
- else {
- $token_consumer = DrupalOAuthConsumer::loadById($data['csid'], isset($data['services']));
- }
- return new DrupalOAuthToken($data['token_key'], $data['secret'], $token_consumer, $data);
- }
- return NULL;
- }
- }
|