123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- <?php
- class DrupalOAuthConsumer extends OAuthConsumer {
- public $csid = 0;
- public $uid = 0;
- public $name = '';
- public $context = '';
- public $created = 0;
- public $changed = 0;
- public $callback_url = 'oob';
- public $configuration = array();
- public $provider_consumer = FALSE;
- public $in_database = FALSE;
- function __construct($key, $secret, $params = array()) {
- // Backwards compatibility with 6.x-3.0-beta3
- if (is_string($params)) {
- $callback_url = $params;
- if (func_num_args() > 4) {
- $params = func_get_arg(4);
- }
- else {
- $params = array();
- }
- $params['callback_url'] = $callback_url;
- }
- foreach ($params as $param_key => $value) {
- if (isset($this->$param_key)) {
- $this->$param_key = $value;
- }
- }
- if (!empty($this->created)) {
- $this->provider_consumer = TRUE;
- }
- parent::__construct($key, $secret, $this->callback_url);
- }
- /**
- * Writes the consumer to the database
- *
- * @return void
- */
- public function write() {
- $update = !empty($this->csid);
- $primary = $update ? array('csid') : array();
- if ($this->provider_consumer) {
- $this->changed = REQUEST_TIME;
- $values = array(
- 'consumer_key' => $this->key,
- 'created' => $this->created,
- 'changed' => $this->changed,
- 'uid' => $this->uid,
- 'name' => $this->name,
- 'context' => $this->context,
- 'callback_url' => $this->callback_url,
- );
- if ($update) {
- $values['csid'] = $this->csid;
- }
- else {
- $this->created = REQUEST_TIME;
- $values['created'] = $this->created;
- }
- $ready = drupal_write_record('oauth_common_provider_consumer', $values, $primary);
- if (!$ready) {
- throw new OAuthException("Couldn't save consumer");
- }
- }
- $values = array(
- 'key_hash' => sha1($this->key),
- 'consumer_key' => $this->key,
- 'secret' => $this->secret,
- 'configuration' => serialize(empty($this->configuration) ? array() : $this->configuration),
- );
- if ($update) {
- $values['csid'] = $this->csid;
- }
- drupal_write_record('oauth_common_consumer', $values, $primary);
- $this->csid = $values['csid'];
- $this->in_database = TRUE;
- if (!$update) {
- $values = array(
- 'csid' => $this->csid,
- 'consumer_key' => $this->key,
- );
- drupal_write_record('oauth_common_provider_consumer', $values, array('consumer_key'));
- }
- }
- /**
- * Deletes the consumer from the database
- *
- * @return void
- */
- public function delete() {
- self::deleteConsumer($this->csid);
- }
- /**
- * Deletes the consumer with the id from the database.
- *
- * @param string $csid
- * The consumer id.
- * @return void
- */
- public static function deleteConsumer($csid) {
- //TODO: Add compatibility layer?
- $condition = db_and()->condition('csid', $csid);
- db_delete('oauth_common_provider_token')
- ->condition('tid', db_select('oauth_common_token', 't')->condition($condition)->fields('t', array('tid')), 'IN')
- ->execute();
- foreach (array('oauth_common_token', 'oauth_common_provider_consumer', 'oauth_common_consumer') as $table) {
- db_delete($table)
- ->condition($condition)
- ->execute();
- }
- }
- /**
- * Deprecated - Gets the consumer with the specified key
- *
- * @param string $key
- * The key of the consumer to get
- * @param bool $provider_consumer
- * Optional. Whether the consumer we're about to load is a provider or
- * consumer consumer. Defaults to TRUE.
- * @return DrupalOAuthConsumer
- * The loaded consumer object or FALSE if load failed
- */
- public static function load($key, $provider_consumer = TRUE) {
- return DrupalOAuthConsumer::loadProviderByKey($key, $provider_consumer);
- }
- /**
- * Gets a provider consumer with the specified id
- *
- * @param int $id
- * The id of the consumer to get
- * @param boolean $load_provider_data
- * Whether to load provider related data or not
- * @return DrupalOAuthConsumer
- * The loaded consumer object or FALSE if load failed
- */
- public static function loadById($csid, $load_provider_data = TRUE) {
- $query = db_select('oauth_common_consumer', 'c');
- $query
- ->condition('c.csid', $csid)
- ->fields('c', array('csid', 'consumer_key', 'secret', 'configuration'));
- if ($load_provider_data) {
- $query->leftJoin('oauth_common_provider_consumer', 'pc', 'pc.csid = c.csid');
- $query->fields('pc', array('created', 'changed', 'uid', 'name', 'context', 'callback_url'));
- }
- return self::fromResult($query->execute());
- }
- /**
- * Gets a provider consumer with the specified key
- *
- * @param string $key
- * The key of the consumer to get
- * @param boolean $provider
- * Used internally for backwards compatibility with ::load()
- * @return DrupalOAuthConsumer
- * The loaded consumer object or FALSE if load failed
- */
- public static function loadProviderByKey($key, $provider = TRUE) {
- $query = db_select('oauth_common_consumer', 'c');
- $query
- ->condition('c.key_hash', sha1($key))
- ->fields('c', array('secret', 'configuration'));
- if ($provider) {
- $query->join('oauth_common_provider_consumer', 'pc', 'pc.csid = c.csid');
- $query->fields('pc');
- }
- else {
- // For backwards compatibility with deprecated DrupalOAuthConsumer::load() from 6.x-3.0-beta3
- $query->leftJoin('oauth_common_provider_consumer', 'pc', 'pc.csid = c.csid');
- $query
- ->fields('c', array('csid', 'consumer_key'))
- ->fields('pc', array('created', 'changed', 'uid', 'name', 'context', 'callback_url'))
- ->isNull('pc.csid');
- }
- return self::fromResult($query->execute());
- }
- /**
- * Constructs a consumer from a db-result resource
- *
- * @param resource $res
- * A database result resource
- * @return DrupalOAuthConsumer
- * The constructed consumer object or NULL if no rows could be read or construction failed
- */
- public static function fromResult($res) {
- //TODO: Ensure this works with old inputs?
- if ($data = $res->fetchAssoc()) {
- if (!empty($data['configuration'])) {
- $data['configuration'] = unserialize($data['configuration']);
- }
- $data['in_database'] = TRUE;
- return new DrupalOAuthConsumer($data['consumer_key'], $data['secret'], $data);
- }
- return NULL;
- }
- }
|