From b991d8ff77b2837cc17f83c3f682c57c4a1043f6 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Mon, 4 Dec 2017 14:09:23 -0500 Subject: [PATCH 1/5] Separate and move classes OAuth to src --- include/oauth.php | 184 ------------------------------ src/Protocol/FKOAuth1.php | 77 +++++++++++++ src/Protocol/FKOAuthDataStore.php | 150 ++++++++++++++++++++++++ 3 files changed, 227 insertions(+), 184 deletions(-) delete mode 100644 include/oauth.php create mode 100644 src/Protocol/FKOAuth1.php create mode 100644 src/Protocol/FKOAuthDataStore.php diff --git a/include/oauth.php b/include/oauth.php deleted file mode 100644 index 8834b93555..0000000000 --- a/include/oauth.php +++ /dev/null @@ -1,184 +0,0 @@ - - * - */ - -use Friendica\App; -use Friendica\Core\Config; -use Friendica\Core\PConfig; -use Friendica\Core\System; -use Friendica\Database\DBM; - -define('REQUEST_TOKEN_DURATION', 300); -define('ACCESS_TOKEN_DURATION', 31536000); - -require_once("library/OAuth1.php"); -require_once("library/oauth2-php/lib/OAuth2.inc"); - -class FKOAuthDataStore extends OAuthDataStore { - function gen_token(){ - return md5(base64_encode(pack('N6', mt_rand(), mt_rand(), mt_rand(), mt_rand(), mt_rand(), uniqid()))); - } - - function lookup_consumer($consumer_key) { - logger(__function__.":".$consumer_key); - //echo "
"; var_dump($consumer_key); killme();
-
-		$r = q("SELECT client_id, pw, redirect_uri FROM clients WHERE client_id='%s'",
-			dbesc($consumer_key)
-		);
-		if (DBM::is_result($r))
-			return new OAuthConsumer($r[0]['client_id'],$r[0]['pw'],$r[0]['redirect_uri']);
-		return null;
-  }
-
-  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)
-		);
-		if (DBM::is_result($r)){
-			$ot=new OAuthToken($r[0]['id'],$r[0]['secret']);
-			$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) {
-		//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)
-		);
-		if (DBM::is_result($r))
-			return new OAuthToken($r[0]['id'],$r[0]['secret']);
-		return null;
-  }
-
-  function new_request_token($consumer, $callback = null) {
-		logger(__function__.":".$consumer.", ". $callback);
-		$key = $this->gen_token();
-		$sec = $this->gen_token();
-
-		if ($consumer->key){
-			$k = $consumer->key;
-		} else {
-			$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));
-		if (!$r) return null;
-		return new OAuthToken($key,$sec);
-  }
-
-  function new_access_token($token, $consumer, $verifier = null) {
-    logger(__function__.":".$token.", ". $consumer.", ". $verifier);
-
-    // return a new access token attached to this consumer
-    // for the user associated with this token if the request token
-    // is authorized
-    // should also invalidate the request token
-
-    $ret=Null;
-
-    // get user for this verifier
-    $uverifier = Config::get("oauth", $verifier);
-    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));
-		if ($r)
-			$ret = new OAuthToken($key,$sec);
-	}
-
-
-	dba::delete('tokens', array('id' => $token->key));
-
-
-	if (!is_null($ret) && $uverifier!==false){
-		Config::delete("oauth", $verifier);
-	/*	$apps = PConfig::get($uverifier, "oauth", "apps");
-		if ($apps===false) $apps=array();
-		$apps[] = $consumer->key;
-		PConfig::set($uverifier, "oauth", "apps", $apps);*/
-	}
-
-    return $ret;
-
-  }
-}
-
-class FKOAuth1 extends OAuthServer {
-	function __construct() {
-		parent::__construct(new FKOAuthDataStore());
-		$this->add_signature_method(new OAuthSignatureMethod_PLAINTEXT());
-		$this->add_signature_method(new OAuthSignatureMethod_HMAC_SHA1());
-	}
-
-	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];
-		} else {
-		   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'];
-		$_SESSION['mobile-theme'] = PConfig::get($record['uid'], 'system', 'mobile_theme');
-		$_SESSION['authenticated'] = 1;
-		$_SESSION['page_flags'] = $record['page-flags'];
-		$_SESSION['my_url'] = System::baseUrl() . '/profile/' . $record['nickname'];
-		$_SESSION['addr'] = $_SERVER['REMOTE_ADDR'];
-		$_SESSION["allow_api"] = true;
-
-		//notice( t("Welcome back ") . $record['username'] . EOL);
-		$a->user = $record;
-
-		if (strlen($a->user['timezone'])) {
-			date_default_timezone_set($a->user['timezone']);
-			$a->timezone = $a->user['timezone'];
-		}
-
-		$r = q("SELECT * FROM `contact` WHERE `uid` = %s AND `self` = 1 LIMIT 1",
-			intval($_SESSION['uid']));
-		if (DBM::is_result($r)) {
-			$a->contact = $r[0];
-			$a->cid = $r[0]['id'];
-			$_SESSION['cid'] = $a->cid;
-		}
-		q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d",
-			dbesc(datetime_convert()),
-			intval($_SESSION['uid'])
-		);
-
-		call_hooks('logged_in', $a->user);
-	}
-
-}
diff --git a/src/Protocol/FKOAuth1.php b/src/Protocol/FKOAuth1.php
new file mode 100644
index 0000000000..5d0e9e52bf
--- /dev/null
+++ b/src/Protocol/FKOAuth1.php
@@ -0,0 +1,77 @@
+add_signature_method(new OAuthSignatureMethod_PLAINTEXT());
+		$this->add_signature_method(new OAuthSignatureMethod_HMAC_SHA1());
+	}
+
+	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];
+		} else {
+		   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'];
+		$_SESSION['mobile-theme'] = PConfig::get($record['uid'], 'system', 'mobile_theme');
+		$_SESSION['authenticated'] = 1;
+		$_SESSION['page_flags'] = $record['page-flags'];
+		$_SESSION['my_url'] = System::baseUrl() . '/profile/' . $record['nickname'];
+		$_SESSION['addr'] = $_SERVER['REMOTE_ADDR'];
+		$_SESSION["allow_api"] = true;
+
+		//notice( t("Welcome back ") . $record['username'] . EOL);
+		$a->user = $record;
+
+		if (strlen($a->user['timezone'])) {
+			date_default_timezone_set($a->user['timezone']);
+			$a->timezone = $a->user['timezone'];
+		}
+
+		$r = q("SELECT * FROM `contact` WHERE `uid` = %s AND `self` = 1 LIMIT 1",
+			intval($_SESSION['uid']));
+		if (DBM::is_result($r)) {
+			$a->contact = $r[0];
+			$a->cid = $r[0]['id'];
+			$_SESSION['cid'] = $a->cid;
+		}
+		q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d",
+			dbesc(datetime_convert()),
+			intval($_SESSION['uid'])
+		);
+
+		call_hooks('logged_in', $a->user);
+	}
+}
diff --git a/src/Protocol/FKOAuthDataStore.php b/src/Protocol/FKOAuthDataStore.php
new file mode 100644
index 0000000000..08c32df213
--- /dev/null
+++ b/src/Protocol/FKOAuthDataStore.php
@@ -0,0 +1,150 @@
+
+ *
+ */
+namespace Friendica\Protocol;
+
+use Friendica\App;
+use Friendica\Core\Config;
+use Friendica\Core\System;
+use Friendica\Database\DBM;
+use dba;
+
+define('REQUEST_TOKEN_DURATION', 300);
+define('ACCESS_TOKEN_DURATION', 31536000);
+
+require_once "library/OAuth1.php";
+require_once "library/oauth2-php/lib/OAuth2.inc";
+
+/**
+ * @brief OAuthDataStore class
+ */
+class FKOAuthDataStore extends OAuthDataStore
+{
+	function gen_token()
+	{
+		return md5(base64_encode(pack('N6', mt_rand(), mt_rand(), mt_rand(), mt_rand(), mt_rand(), uniqid())));
+	}
+
+	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)
+		);
+
+		if (DBM::is_result($r)) {
+			return new OAuthConsumer($r[0]['client_id'], $r[0]['pw'], $r[0]['redirect_uri']);
+		}
+
+		return null;
+	}
+
+	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)
+		);
+		if (DBM::is_result($r)) {
+			$ot=new OAuthToken($r[0]['id'], $r[0]['secret']);
+			$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)
+	{
+		//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)
+		);
+		
+		if (DBM::is_result($r)) {
+			return new OAuthToken($r[0]['id'], $r[0]['secret']);
+		}
+
+		return null;
+	}
+
+	function new_request_token($consumer, $callback = null)
+	{
+		logger(__function__.":".$consumer.", ". $callback);
+		$key = $this->gen_token();
+		$sec = $this->gen_token();
+
+		if ($consumer->key) {
+			$k = $consumer->key;
+		} else {
+			$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)
+		);
+
+		if (!$r) {
+			return null;
+		}
+
+		return new OAuthToken($key, $sec);
+	}
+
+	function new_access_token($token, $consumer, $verifier = null)
+	{
+		logger(__function__.":".$token.", ". $consumer.", ". $verifier);
+
+		// return a new access token attached to this consumer
+		// for the user associated with this token if the request token
+		// is authorized
+		// should also invalidate the request token
+
+		$ret = null;
+
+		// get user for this verifier
+		$uverifier = Config::get("oauth", $verifier);
+		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)
+			);
+
+			if ($r) {
+				$ret = new OAuthToken($key, $sec);
+			}
+		}
+
+
+		dba::delete('tokens', array('id' => $token->key));
+
+
+		if (!is_null($ret) && $uverifier !== false) {
+			Config::delete("oauth", $verifier);
+		}
+
+		return $ret;
+	}
+}

From 9c7b6d9d5f3660fa37d9978bf2e89cdfbe2c8847 Mon Sep 17 00:00:00 2001
From: Adam Magness 
Date: Mon, 4 Dec 2017 14:52:04 -0500
Subject: [PATCH 2/5] Functions and Standards

Standards and convert to dba functions where possible.
---
 include/api.php                   |  13 ++--
 src/Protocol/FKOAuth1.php         |  33 +++++-----
 src/Protocol/FKOAuthDataStore.php | 106 +++++++++++++++++++-----------
 3 files changed, 91 insertions(+), 61 deletions(-)

diff --git a/include/api.php b/include/api.php
index ea804b18ba..e55af1ae99 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 5d0e9e52bf..710097ae00 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 08c32df213..dc4b774b9b 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) {

From 2bbfc0640f411f99e37d82763ce57af5c0c18bd9 Mon Sep 17 00:00:00 2001
From: Adam Magness 
Date: Mon, 4 Dec 2017 15:59:21 -0500
Subject: [PATCH 3/5] Move to Network

Move to network namespace. Get rid of q() and try to get used to [ ] instead of array()
---
 src/{Protocol => Network}/FKOAuth1.php         | 9 +++------
 src/{Protocol => Network}/FKOAuthDataStore.php | 2 +-
 2 files changed, 4 insertions(+), 7 deletions(-)
 rename src/{Protocol => Network}/FKOAuth1.php (90%)
 rename src/{Protocol => Network}/FKOAuthDataStore.php (99%)

diff --git a/src/Protocol/FKOAuth1.php b/src/Network/FKOAuth1.php
similarity index 90%
rename from src/Protocol/FKOAuth1.php
rename to src/Network/FKOAuth1.php
index 710097ae00..a323f5cd56 100644
--- a/src/Protocol/FKOAuth1.php
+++ b/src/Network/FKOAuth1.php
@@ -2,13 +2,13 @@
 /**
  * @file src/Protocol/OAuth1.php
  */
-namespace Friendica\Protocol;
+namespace Friendica\Network;
 
 use Friendica\App;
 use Friendica\Core\PConfig;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
-use Friendica\Protocol\FKOAuthDataStore;
+use Friendica\Network\FKOAuthDataStore;
 use dba;
 
 require_once "library/OAuth1.php";
@@ -70,10 +70,7 @@ class FKOAuth1 extends OAuthServer
 			$_SESSION['cid'] = $a->cid;
 		}
 
-		dba::q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d",
-			dbesc(datetime_convert()),
-			intval($_SESSION['uid'])
-		);
+		dba::update('user', ['login_date' => datetime_convert()], ['uid' => $_SESSION['uid']]);
 
 		call_hooks('logged_in', $a->user);
 	}
diff --git a/src/Protocol/FKOAuthDataStore.php b/src/Network/FKOAuthDataStore.php
similarity index 99%
rename from src/Protocol/FKOAuthDataStore.php
rename to src/Network/FKOAuthDataStore.php
index dc4b774b9b..007908b99b 100644
--- a/src/Protocol/FKOAuthDataStore.php
+++ b/src/Network/FKOAuthDataStore.php
@@ -5,7 +5,7 @@
  * Based on oauth2-php 
  *
  */
-namespace Friendica\Protocol;
+namespace Friendica\Network;
 
 use Friendica\App;
 use Friendica\Core\Config;

From 547e24b443a44bffa5f2a0fa742f59f60335a89a Mon Sep 17 00:00:00 2001
From: Adam Magness 
Date: Mon, 4 Dec 2017 16:33:10 -0500
Subject: [PATCH 4/5] Review

updates based on review.
---
 src/Network/FKOAuth1.php         | 6 ++----
 src/Network/FKOAuthDataStore.php | 5 ++---
 2 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/src/Network/FKOAuth1.php b/src/Network/FKOAuth1.php
index a323f5cd56..768cae7d1b 100644
--- a/src/Network/FKOAuth1.php
+++ b/src/Network/FKOAuth1.php
@@ -37,11 +37,9 @@ class FKOAuth1 extends OAuthServer
 	{
 		logger("FKOAuth1::loginUser $uid");
 		$a = get_app();
-		$r = dba::select('user', array(), array('uid' => $uid, 'blocked' => 0, 'account_expired' => 0, 'account_removed' => 0, 'verified' => 1), array('limit' => 1));
+		$record = 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 {
+		if (!DBM::is_result($record)) {
 			logger('FKOAuth1::loginUser failure: ' . print_r($_SERVER, true), LOGGER_DEBUG);
 			header('HTTP/1.0 401 Unauthorized');
 			die('This api requires login');
diff --git a/src/Network/FKOAuthDataStore.php b/src/Network/FKOAuthDataStore.php
index 007908b99b..0fcd01fc5c 100644
--- a/src/Network/FKOAuthDataStore.php
+++ b/src/Network/FKOAuthDataStore.php
@@ -83,9 +83,8 @@ class FKOAuthDataStore extends OAuthDataStore
 	 */
 	public static function lookup_nonce($consumer, $token, $nonce, $timestamp)
 	{
-		$s = dba::select('tokens', array('id', 'secret'), array('client_id' => $consumer->key, 'id' => $nonce, 'expires' => $timestamp));
-		$r = dba::inArray($s);
-		
+		$r = dba::select('tokens', ['id', 'secret'], ['client_id' => $consumer->key, 'id' => $nonce, 'expires' => $timestamp], ['limit' => 1]);
+				
 		if (DBM::is_result($r)) {
 			return new OAuthToken($r[0]['id'], $r[0]['secret']);
 		}

From d3473f9999e107a936882f5dce89d45f0b6db2e9 Mon Sep 17 00:00:00 2001
From: Adam Magness 
Date: Mon, 4 Dec 2017 18:30:18 -0500
Subject: [PATCH 5/5] Update use

Forgot to update a use statement.
---
 include/api.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/api.php b/include/api.php
index e55af1ae99..740abf1e2e 100644
--- a/include/api.php
+++ b/include/api.php
@@ -13,6 +13,7 @@ use Friendica\Core\NotificationsManager;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Model\User;
+use Friendica\Network\FKOAuth1;
 use Friendica\Network\HTTPException;
 use Friendica\Network\HTTPException\BadRequestException;
 use Friendica\Network\HTTPException\ForbiddenException;
@@ -25,7 +26,6 @@ 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';