X-Git-Url: https://git.cweiske.de/grauphel.git/blobdiff_plain/07c432f5552f975cfe19846bbd499ed5a7d8d7d6..a730b8aac9a7d644014f501e24151fa8ff4af5b7:/lib/tokenstorage.php diff --git a/lib/tokenstorage.php b/lib/tokenstorage.php index 9a173f5..8b266f1 100644 --- a/lib/tokenstorage.php +++ b/lib/tokenstorage.php @@ -14,7 +14,7 @@ namespace OCA\Grauphel\Lib; /** - * Token store + * OAuth token store * * @category Tools * @package Grauphel @@ -26,26 +26,57 @@ namespace OCA\Grauphel\Lib; */ class TokenStorage { + /** + * @var \OCP\IDBConnection + */ + protected $db; + + public function __construct() + { + $this->db = \OC::$server->getDatabaseConnection(); + } + + /** + * Delete token + * + * @param string $type Token type: temp, access, verify + * @param string $tokenKey Random token string to load + * + * @return void + * + * @throws OAuthException When token does not exist + */ + public function delete($type, $tokenKey) + { + $this->db->executeQuery( + 'DELETE FROM `*PREFIX*grauphel_oauth_tokens`' + . ' WHERE `token_key` = ? AND `token_type` = ?', + array($tokenKey, $type) + ); + } + /** * Store the given token * - * @param OAuth_Token $token Token object to store + * @param Token $token Token object to store * * @return void */ - public function store(OAuth_Token $token) + public function store(Token $token) { - \OC_DB::executeAudited( + $this->db->executeQuery( 'INSERT INTO `*PREFIX*grauphel_oauth_tokens`' - . '(`token_user`, `token_type`, `token_key`, `token_secret`, `token_verifier`, `token_callback`)' - . ' VALUES(?, ?, ?, ?, ?, ?)', + . '(`token_user`, `token_type`, `token_key`, `token_secret`, `token_verifier`, `token_callback`, `token_client`, `token_lastuse`)' + . ' VALUES(?, ?, ?, ?, ?, ?, ?, ?)', array( $token->user, $token->type, $token->tokenKey, (string) $token->secret, (string) $token->verifier, - (string) $token->callback + (string) $token->callback, + (string) $token->client, + date('Y-m-d H:i:s'), ) ); } @@ -64,11 +95,7 @@ class TokenStorage { try { $token = $this->load($type, $tokenKey); - \OC_DB::executeAudited( - 'DELETE FROM `*PREFIX*grauphel_oauth_tokens`' - . ' WHERE `token_key` = ? AND `token_type` = ?', - array($tokenKey, $type) - ); + $this->delete($type, $tokenKey); return $token; } catch (OAuthException $e) { throw $e; @@ -88,24 +115,70 @@ class TokenStorage */ public function load($type, $tokenKey) { - $tokenRow = \OC_DB::executeAudited( + $tokenRow = $this->db->executeQuery( 'SELECT * FROM `*PREFIX*grauphel_oauth_tokens`' . ' WHERE `token_key` = ? AND `token_type` = ?', array($tokenKey, $type) - )->fetchRow(); + )->fetch(); if ($tokenRow === false) { - throw new OAuthException('Unknown token: ' . $type . ' / ' . $tokenKey); + throw new OAuthException( + 'Unknown token: ' . $type . ' / ' . $tokenKey, + OAUTH_TOKEN_REJECTED + ); } $token = $this->fromDb($tokenRow); if ($token->tokenKey != $tokenKey) { - throw new OAuthException('Invalid token'); + throw new OAuthException('Invalid token', OAUTH_TOKEN_REJECTED); } return $token; } + /** + * Load multiple tokens + * + * @param string $username User name + * @param string $type Token type: temp, access, verify + * + * @return array Array of Token objects + */ + public function loadForUser($username, $type) + { + $result = $this->db->executeQuery( + 'SELECT * FROM `*PREFIX*grauphel_oauth_tokens`' + . ' WHERE `token_user` = ? AND `token_type` = ?', + array($username, $type) + ); + + $tokens = array(); + while ($tokenRow = $result->fetch()) { + $tokens[] = $this->fromDb($tokenRow); + } + + return $tokens; + } + + /** + * Update the "last use" field of a token + * + * @param string $tokenKey Random token string to load + * + * @return void + */ + public function updateLastUse($tokenKey) + { + $this->db->executeQuery( + 'UPDATE `*PREFIX*grauphel_oauth_tokens`' + . ' SET `token_lastuse` = ? WHERE `token_key` = ?', + array( + date('Y-m-d H:i:s'), + $tokenKey, + ) + ); + } + protected function fromDb($tokenRow) { $token = new Token(); @@ -115,6 +188,8 @@ class TokenStorage $token->user = $tokenRow['token_user']; $token->verifier = $tokenRow['token_verifier']; $token->callback = $tokenRow['token_callback']; + $token->client = $tokenRow['token_client']; + $token->lastuse = \strtotime($tokenRow['token_lastuse']); return $token; } }