From c217e9da345d6c6c0d42da3a0de39294a4454f6f Mon Sep 17 00:00:00 2001
From: Friendika <info@friendika.com>
Date: Fri, 24 Dec 2010 15:59:12 -0800
Subject: [PATCH] add authentication plugin hooks

---
 include/auth.php | 45 ++++++++++++++++++++++++++++++++++-----------
 1 file changed, 34 insertions(+), 11 deletions(-)

diff --git a/include/auth.php b/include/auth.php
index fe09ef1604..bc77e5dbc0 100644
--- a/include/auth.php
+++ b/include/auth.php
@@ -132,17 +132,38 @@ else {
 	}
 	if((x($_POST,'auth-params')) && $_POST['auth-params'] === 'login') {
 
-		// process login request
-
-		$r = q("SELECT * FROM `user` 
-			WHERE ( `email` = '%s' OR `nickname` = '%s' ) AND `password` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1",
-			dbesc(trim($_POST['openid_url'])),
-			dbesc(trim($_POST['openid_url'])),
-			dbesc($encrypted));
-		if(($r === false) || (! count($r))) {
-			notice( t('Login failed.') . EOL );
-			goaway($a->get_baseurl());
-  		}
+
+		$addon_auth = array(
+			'name' => trim($_POST['openid_url']), 
+			'password' => trim($_POST['password']),
+			'authenticated' => 0
+		);
+
+		/**
+		 *
+		 * A plugin indicates successful login by setting 'authenticated' to non-zero value
+		 * Plugins should never set 'authenticated' except to indicate success - as hooks may be chained
+		 * and later plugins should not interfere with an earlier one that succeeded.
+		 *
+		 */
+
+		call_hooks('authenticate', $addon_auth);
+
+		if(! $addon_auth['authenticated']) {
+			// process login request
+
+			$r = q("SELECT * FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' ) 
+				AND `password` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1",
+				dbesc(trim($_POST['openid_url'])),
+				dbesc(trim($_POST['openid_url'])),
+				dbesc($encrypted)
+			);
+			if(($r === false) || (! count($r))) {
+				notice( t('Login failed.') . EOL );
+				goaway($a->get_baseurl());
+  			}
+		}
+
 		$_SESSION['uid'] = $r[0]['uid'];
 		$_SESSION['theme'] = $r[0]['theme'];
 		$_SESSION['authenticated'] = 1;
@@ -167,6 +188,8 @@ else {
 			intval($_SESSION['uid'])
 		);
 
+		call_hooks('logged_in', $a->user);
+
 		header('X-Account-Management-Status: active; name="' . $a->user['username'] . '"; id="' . $a->user['nickname'] .'"');
 		if(($a->module !== 'home') && isset($_SESSION['return_url']))
 			goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
-- 
2.39.5