wip
[grauphel.git] / controller / oauthcontroller.php
1 <?php
2 /**
3  * Part of grauphel
4  *
5  * PHP version 5
6  *
7  * @category  Tools
8  * @package   Grauphel
9  * @author    Christian Weiske <cweiske@cweiske.de>
10  * @copyright 2014 Christian Weiske
11  * @license   http://www.gnu.org/licenses/agpl.html GNU AGPL v3
12  * @link      http://cweiske.de/grauphel.htm
13  */
14 namespace OCA\Grauphel\Controller;
15 use \OCP\AppFramework\Controller;
16
17 /**
18  * OAuth handling
19  *
20  * @category  Tools
21  * @package   Grauphel
22  * @author    Christian Weiske <cweiske@cweiske.de>
23  * @copyright 2014 Christian Weiske
24  * @license   http://www.gnu.org/licenses/agpl.html GNU AGPL v3
25  * @version   Release: @package_version@
26  * @link      http://cweiske.de/grauphel.htm
27  */
28 class OAuthController extends Controller
29 {
30     /**
31      * Handle out an access token after verifying the verification token
32      * OAuth step 3 of 3
33      */
34     public function accessTokenAction()
35     {
36         $oauth = new OAuth();
37         $oauth->setDeps($this->deps);
38
39         try {
40             $provider = new \OAuthProvider();
41             $oauth->registerHandler($provider)
42                 ->registerVerificationTokenHandler($provider);
43             $provider->checkOAuthRequest($this->deps->urlGen->oauthAccessToken());
44
45             $token = $this->deps->tokens->loadAndDelete('verify', $provider->token);
46
47             $newToken = new OAuth_Token('access');
48             $newToken->tokenKey = 'a' . bin2hex($provider->generateToken(8));
49             $newToken->secret   = 's' . bin2hex($provider->generateToken(8));
50             $newToken->user     = $token->user;
51             $this->deps->tokens->store($newToken);
52
53             $this->deps->renderer->sendFormData(
54                 array(
55                     'oauth_token'        => $newToken->tokenKey,
56                     'oauth_token_secret' => $newToken->secret,
57                 )
58             );
59             exit(0);
60         } catch (\OAuthException $e) {
61             $oauth->error($e);
62         }
63     }
64
65     /**
66      * Log the user in and let him authorize that the app may access notes
67      * OAuth step 2 of 3
68      */
69     public function authorizeAction()
70     {
71         $oauth = new OAuth();
72         $oauth->setDeps($this->deps);
73
74         if (!isset($_REQUEST['oauth_token'])) {
75             $this->deps->renderer->errorOut('oauth_token missing');
76         }
77         if (!$oauth->validateToken($_REQUEST['oauth_token'])) {
78             $this->deps->renderer->errorOut('Invalid token string');
79         }
80
81         $reqToken = $_REQUEST['oauth_token'];
82
83         try {
84             $token = $this->deps->tokens->load('temp', $reqToken);
85         } catch (OAuth_Exception $e) {
86             $this->deps->renderer->errorOut($e->getMessage());
87         }
88
89         $authState = $this->deps->frontend->doAuthorize(
90             $this->deps->urlGen->current()
91         );
92         if ($authState === null) {
93             //this should not happen; doAuthorize() must block
94             exit(1);
95         }
96
97         try {
98             $token = $this->deps->tokens->loadAndDelete('temp', $reqToken);
99         } catch (OAuth_Exception $e) {
100             $this->deps->renderer->errorOut($e->getMessage());
101         }
102
103         if ($authState === false) {
104             //user declined
105
106             //http://wiki.oauth.net/w/page/12238543/ProblemReporting
107             $callback = $this->deps->urlGen->addParams(
108                 $token->callback,
109                 array(
110                     'oauth_token'   => $token->tokenKey,
111                     'oauth_problem' => 'permission_denied',
112                 )
113             );
114             header('Location: ' . $callback, true, 302);
115             exit(0);
116         }
117
118         //the user is logged in and authorized
119         $provider = new \OAuthProvider();
120
121         $newToken = new OAuth_Token('verify');
122         $newToken->tokenKey = $token->tokenKey;
123         $newToken->secret   = $token->secret;
124         $newToken->verifier = 'v' . bin2hex($provider->generateToken(8));
125         $newToken->user     = $this->deps->frontend->getUser();
126
127         $this->deps->tokens->store($newToken);
128
129         //redirect
130         //FIXME: if no callback is given, show the token to the user
131         $callback = $this->deps->urlGen->addParams(
132             $token->callback,
133             array(
134                 'oauth_token'    => $newToken->tokenKey,
135                 'oauth_verifier' => $newToken->verifier
136             )
137         );
138
139         header('Location: ' . $callback, true, 302);
140         exit();
141     }
142
143     /**
144      * Create and return a request token.
145      * OAuth step 1 of 3
146      */
147     public function requestTokenAction()
148     {
149         $oauth = new OAuth();
150         $oauth->setDeps($this->deps);
151
152         try {
153             $provider = new \OAuthProvider();
154             $oauth->registerHandler($provider);
155             $provider->isRequestTokenEndpoint(true);
156             $provider->checkOAuthRequest($this->deps->urlGen->oauthRequestToken());
157
158             //store token + callback URI for later
159             $token = new OAuth_Token('temp');
160             $token->tokenKey = 'r' . bin2hex($provider->generateToken(8));
161             $token->secret   = 's' . bin2hex($provider->generateToken(8));
162             $token->callback = $provider->callback;
163
164             $this->deps->tokens->store($token);
165
166             $this->deps->renderer->sendFormData(
167                 array(
168                     'oauth_token'              => $token->tokenKey,
169                     'oauth_token_secret'       => $token->secret,
170                     'oauth_callback_confirmed' => 'TRUE'
171                 )
172             );
173         } catch (\OAuthException $e) {
174             $oauth->error($e);
175         }
176     }
177 }
178 ?>