diff --git a/include/api.php b/include/api.php index ea804b18b..e55af1ae9 100644 --- a/include/api.php +++ b/include/api.php @@ -25,12 +25,12 @@ use Friendica\Network\HTTPException\TooManyRequestsException; use Friendica\Object\Contact; use Friendica\Object\Photo; use Friendica\Protocol\Diaspora; +use Friendica\Protocol\FKOAuth1; use Friendica\Util\XML; require_once 'include/bbcode.php'; require_once 'include/datetime.php'; require_once 'include/conversation.php'; -require_once 'include/oauth.php'; require_once 'include/html2plain.php'; require_once 'mod/share.php'; require_once 'mod/item.php'; @@ -159,10 +159,9 @@ function api_login(App $a) { // login with oauth try { - $oauth = new FKOAuth1(); - list($consumer,$token) = $oauth->verify_request(OAuthRequest::from_request()); + list($consumer, $token) = FKOAuth1::verify_request(OAuthRequest::from_request()); if (!is_null($token)) { - $oauth->loginUser($token->uid); + FKOAuth1::loginUser($token->uid); call_hooks('logged_in', $a->user); return; } @@ -3365,8 +3364,7 @@ api_register_func('api/direct_messages', 'api_direct_messages_inbox', true); function api_oauth_request_token($type) { try { - $oauth = new FKOAuth1(); - $r = $oauth->fetch_request_token(OAuthRequest::from_request()); + $r = FKOAuth1::fetch_request_token(OAuthRequest::from_request()); } catch (Exception $e) { echo "error=" . OAuthUtil::urlencode_rfc3986($e->getMessage()); killme(); @@ -3378,8 +3376,7 @@ function api_oauth_request_token($type) function api_oauth_access_token($type) { try { - $oauth = new FKOAuth1(); - $r = $oauth->fetch_access_token(OAuthRequest::from_request()); + $r = FKOAuth1::fetch_access_token(OAuthRequest::from_request()); } catch (Exception $e) { echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage()); killme(); diff --git a/src/Protocol/FKOAuth1.php b/src/Protocol/FKOAuth1.php index 5d0e9e52b..710097ae0 100644 --- a/src/Protocol/FKOAuth1.php +++ b/src/Protocol/FKOAuth1.php @@ -29,19 +29,22 @@ class FKOAuth1 extends OAuthServer $this->add_signature_method(new OAuthSignatureMethod_HMAC_SHA1()); } - function loginUser($uid) + /** + * @param string $uid user id + * @return void + */ + public static function loginUser($uid) { logger("FKOAuth1::loginUser $uid"); $a = get_app(); - $r = q("SELECT * FROM `user` WHERE uid=%d AND `blocked` = 0 AND `account_expired` = 0 AND `account_removed` = 0 AND `verified` = 1 LIMIT 1", - intval($uid) - ); - if (DBM::is_result($r)){ - $record = $r[0]; + $r = dba::select('user', array(), array('uid' => $uid, 'blocked' => 0, 'account_expired' => 0, 'account_removed' => 0, 'verified' => 1), array('limit' => 1)); + + if (DBM::is_result($r)) { + $record = $r; } else { - logger('FKOAuth1::loginUser failure: ' . print_r($_SERVER,true), LOGGER_DEBUG); - header('HTTP/1.0 401 Unauthorized'); - die('This api requires login'); + logger('FKOAuth1::loginUser failure: ' . print_r($_SERVER, true), LOGGER_DEBUG); + header('HTTP/1.0 401 Unauthorized'); + die('This api requires login'); } $_SESSION['uid'] = $record['uid']; $_SESSION['theme'] = $record['theme']; @@ -52,7 +55,6 @@ class FKOAuth1 extends OAuthServer $_SESSION['addr'] = $_SERVER['REMOTE_ADDR']; $_SESSION["allow_api"] = true; - //notice( t("Welcome back ") . $record['username'] . EOL); $a->user = $record; if (strlen($a->user['timezone'])) { @@ -60,14 +62,15 @@ class FKOAuth1 extends OAuthServer $a->timezone = $a->user['timezone']; } - $r = q("SELECT * FROM `contact` WHERE `uid` = %s AND `self` = 1 LIMIT 1", - intval($_SESSION['uid'])); + $r = dba::select('contact', array(), array('uid' => $_SESSION['uid'], 'self' => 1), array('limit' => 1)); + if (DBM::is_result($r)) { - $a->contact = $r[0]; - $a->cid = $r[0]['id']; + $a->contact = $r; + $a->cid = $r['id']; $_SESSION['cid'] = $a->cid; } - q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d", + + dba::q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d", dbesc(datetime_convert()), intval($_SESSION['uid']) ); diff --git a/src/Protocol/FKOAuthDataStore.php b/src/Protocol/FKOAuthDataStore.php index 08c32df21..dc4b774b9 100644 --- a/src/Protocol/FKOAuthDataStore.php +++ b/src/Protocol/FKOAuthDataStore.php @@ -24,18 +24,24 @@ require_once "library/oauth2-php/lib/OAuth2.inc"; */ class FKOAuthDataStore extends OAuthDataStore { - function gen_token() + /** + * @return string + */ + private static function genToken() { return md5(base64_encode(pack('N6', mt_rand(), mt_rand(), mt_rand(), mt_rand(), mt_rand(), uniqid()))); } - function lookup_consumer($consumer_key) + /** + * @param string $consumer_key key + * @return mixed + */ + public static function lookup_consumer($consumer_key) { logger(__function__.":".$consumer_key); - $r = q("SELECT client_id, pw, redirect_uri FROM clients WHERE client_id='%s'", - dbesc($consumer_key) - ); + $s = dba::select('clients', array('client_id', 'pw', 'redirect_uri'), array('client_id' => $consumer_key)); + $r = dba::inArray($r); if (DBM::is_result($r)) { return new OAuthConsumer($r[0]['client_id'], $r[0]['pw'], $r[0]['redirect_uri']); @@ -44,32 +50,41 @@ class FKOAuthDataStore extends OAuthDataStore return null; } - function lookup_token($consumer, $token_type, $token) + /** + * @param string $consumer consumer + * @param string $token_type type + * @param string $token token + * @return mixed + */ + public static function lookup_token($consumer, $token_type, $token) { logger(__function__.":".$consumer.", ". $token_type.", ".$token); - $r = q("SELECT id, secret,scope, expires, uid FROM tokens WHERE client_id='%s' AND scope='%s' AND id='%s'", - dbesc($consumer->key), - dbesc($token_type), - dbesc($token) - ); + + $s = dba::select('tokens', array('id', 'secret', 'scope', 'expires', 'uid'), array('client_id' => $consumer->key, 'scope' => $token_type, 'id' => $token)); + $r = dba::inArray($s); + if (DBM::is_result($r)) { $ot=new OAuthToken($r[0]['id'], $r[0]['secret']); - $ot->scope=$r[0]['scope']; + $ot->scope = $r[0]['scope']; $ot->expires = $r[0]['expires']; $ot->uid = $r[0]['uid']; return $ot; } + return null; } - function lookup_nonce($consumer, $token, $nonce, $timestamp) + /** + * @param string $consumer consumer + * @param string $token token + * @param string $nonce nonce + * @param string $timestamp timestamp + * @return mixed + */ + public static function lookup_nonce($consumer, $token, $nonce, $timestamp) { - //echo __file__.":".__line__."
"; var_dump($consumer,$key); killme(); - $r = q("SELECT id, secret FROM tokens WHERE client_id='%s' AND id='%s' AND expires=%d", - dbesc($consumer->key), - dbesc($nonce), - intval($timestamp) - ); + $s = dba::select('tokens', array('id', 'secret'), array('client_id' => $consumer->key, 'id' => $nonce, 'expires' => $timestamp)); + $r = dba::inArray($s); if (DBM::is_result($r)) { return new OAuthToken($r[0]['id'], $r[0]['secret']); @@ -78,11 +93,16 @@ class FKOAuthDataStore extends OAuthDataStore return null; } - function new_request_token($consumer, $callback = null) + /** + * @param string $consumer consumer + * @param string $callback optional, default null + * @return mixed + */ + public static function new_request_token($consumer, $callback = null) { logger(__function__.":".$consumer.", ". $callback); - $key = $this->gen_token(); - $sec = $this->gen_token(); + $key = self::genToken(); + $sec = self::genToken(); if ($consumer->key) { $k = $consumer->key; @@ -90,12 +110,14 @@ class FKOAuthDataStore extends OAuthDataStore $k = $consumer; } - $r = q("INSERT INTO tokens (id, secret, client_id, scope, expires) VALUES ('%s','%s','%s','%s', UNIX_TIMESTAMP()+%d)", - dbesc($key), - dbesc($sec), - dbesc($k), - 'request', - intval(REQUEST_TOKEN_DURATION) + $r = dba::insert( + 'tokens', + array( + 'id' => $key, + 'secret' => $sec, + 'client_id' => $k, + 'scope' => 'request', + 'expires' => UNIX_TIMESTAMP() + REQUEST_TOKEN_DURATION) ); if (!$r) { @@ -105,7 +127,13 @@ class FKOAuthDataStore extends OAuthDataStore return new OAuthToken($key, $sec); } - function new_access_token($token, $consumer, $verifier = null) + /** + * @param string $token token + * @param string $consumer consumer + * @param string $verifier optional, defult null + * @return object + */ + public static function new_access_token($token, $consumer, $verifier = null) { logger(__function__.":".$token.", ". $consumer.", ". $verifier); @@ -121,15 +149,17 @@ class FKOAuthDataStore extends OAuthDataStore logger(__function__.":".$verifier.",".$uverifier); if (is_null($verifier) || ($uverifier!==false)) { - $key = $this->gen_token(); - $sec = $this->gen_token(); - $r = q("INSERT INTO tokens (id, secret, client_id, scope, expires, uid) VALUES ('%s','%s','%s','%s', UNIX_TIMESTAMP()+%d, %d)", - dbesc($key), - dbesc($sec), - dbesc($consumer->key), - 'access', - intval(ACCESS_TOKEN_DURATION), - intval($uverifier) + $key = self::genToken(); + $sec = self::genToken(); + $r = dba::insert( + 'tokens', + array( + 'id' => $key, + 'secret' => $sec, + 'client_id' => $consumer->key, + 'scope' => 'access', + 'expires' => UNIX_TIMESTAMP() + ACCESS_TOKEN_DURATION, + 'uid' => $uverifier) ); if ($r) {