aboutsummaryrefslogtreecommitdiffstats
path: root/lib/oauth.php
blob: 09dbe4cc75505ff1406d4dca3bcb1d6d20e4c3b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php
/**
* ownCloud
*
* @author Tom Needham 
* @copyright 2012 Tom Needham tom@owncloud.com 
* 
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either 
* version 3 of the License, or any later version.
* 
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*  
* You should have received a copy of the GNU Affero General Public 
* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
* 
*/

class OC_OAuth {
	
	/**
	 * the oauth-php server object
	 */
	private static $server;
	
	/**
	 * the oauth-php oauthstore object
	 */
	private static $store;
	
	/**
	 * initialises the OAuth store and server
	 */
	private static function init(){
		// Include the libraries
		require_once(OC::$THIRDPARTYROOT.'3rdparty/oauth-php/library/OAuthServer.php');
		require_once(OC::$THIRDPARTYROOT.'3rdparty/oauth-php/library/OAuthStore.php');
		// Create the server object
		self::$server = new OAuthServer();
		// Initialise the OAuth store
		self::$store = OAuthStore::instance('owncloud');
	}
	
	/**
	 * gets a request token
	 * TODO save the scopes in the database with this token
	 */
	public static function getRequestToken(){
		self::init();
		self::$server->requestToken();
	}
	
	/**
	 * get the scopes requested by this token
	 * @param string $requesttoken
	 * @return array scopes
	 */
	public static function getScopes($requesttoken){
		// TODO
	}
	
	/**
	 * exchanges authorised request token for access token
	 */
	public static function getAccessToken(){
		self::init();
		self::$server->accessToken();
	}
	
	/**
	 * registers a new consumer
	 * @param array $details consumer details, keys requester_name and requester_email required
	 * @param string $user the owncloud user adding the consumer
	 * @return array the consumers details including secret and key
	 */
	public static function registerConsumer($details, $user){
		self::init();
		$consumer = self::$store->updateConsumer($details, $user, OC_Group::inGroup($user, 'admin'));
		return $consumer;	
	}
	
	/**
	 * gets a list of consumers
	 * @param string $user
	 */
	public static function getConsumers($user=null){
		$user = is_null($user) ? OC_User::getUser() : $user;
		return self::$store->listConsumers($user);
	}
	
	/**
	 * authorises a request token - redirects to callback
	 * @param string $user
	 * @param bool $authorised
	 */
	public static function authoriseToken($user=null){
		$user = is_null($user) ? OC_User::getUser() : $user;
		self::$server->authorizeVerify();
		self::$server->authorize($authorised, $user);
	}
	
	/**
	 * checks if request is authorised
	 * TODO distinguish between failures as one is a 400 error and other is 401
	 * @return string|int
	 */
	public static function isAuthorised(){
		if(OAuthRequestVerifier::requestIsSigned()){
			try{
				$req = new OAuthRequestVerifier();
				$user = $req->verify();
				$run = true;
				OC_Hook::emit( "OC_User", "pre_login", array( "run" => &$run, "uid" => $user ));
				if(!$run){
					return false;
				}
				OC_User::setUserId($user);
				OC_Hook::emit( "OC_User", "post_login", array( "uid" => $user ));
				return $user;
			} catch(OAuthException $e) {
				// 401 Unauthorised
				return false;
			}
		} else {
			// Bad request
			return false;
		}
	}
	
}