#37: Use public database interface; fixes graupel on ownCloud 9
[grauphel.git] / lib / tokenstorage.php
index c40ab33..a184d8e 100644 (file)
@@ -14,7 +14,7 @@
 namespace OCA\Grauphel\Lib;
 
 /**
- * Token store
+ * OAuth token store
  *
  * @category  Tools
  * @package   Grauphel
@@ -27,25 +27,56 @@ namespace OCA\Grauphel\Lib;
 class TokenStorage
 {
     /**
+     * @var \OCP\IDBConnection
+     */
+    protected $db;
+
+    public function __construct($urlGen)
+    {
+        $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,
+                (string) date('c'),
             )
         );
     }
@@ -58,17 +89,13 @@ class TokenStorage
      *
      * @return OAuth_Token Stored token
      *
-     * @throws OAuth_Exception When token does not exist
+     * @throws OAuthException When token does not exist
      */
     public function loadAndDelete($type, $tokenKey)
     {
         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;
@@ -84,28 +111,74 @@ class TokenStorage
      *
      * @return OAuth_Token Stored token
      *
-     * @throws OAuth_Exception When token does not exist or 
+     * @throws OAuthException When token does not exist or it is invalid
      */
     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(
+                (string) date('c'),
+                $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;
     }
 }