+ /**
+ *
+ * A plugin indicates successful login by setting 'authenticated' to non-zero value and returning a user record
+ * 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'] && count($addon_auth['user_record']))
+ $record = $addon_auth['user_record'];
+ else {
+
+ // process normal login request
+
+ $r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey`
+ FROM `user` WHERE (`email` = '%s' OR `nickname` = '%s')
+ AND `password` = '%s' AND NOT `blocked` AND NOT `account_expired` AND NOT `account_removed` AND `verified` LIMIT 1",
+ dbesc(trim($_POST['username'])),
+ dbesc(trim($_POST['username'])),
+ dbesc($encrypted)
+ );
+ if (count($r))
+ $record = $r[0];
+ }
+
+ if (!$record || !count($record)) {
+ logger('authenticate: failed login attempt: '.notags(trim($_POST['username'])).' from IP '.$_SERVER['REMOTE_ADDR']);
+ notice(t('Login failed.').EOL);
+ goaway(z_root());
+ }
+
+ // If the user specified to remember the authentication, then set a cookie
+ // that expires after one week (the default is when the browser is closed).
+ // The cookie will be renewed automatically.
+ // The week ensures that sessions will expire after some inactivity.
+ if ($_POST['remember'])
+ new_cookie(604800, $r[0]);
+ else
+ new_cookie(0); // 0 means delete on browser exit
+
+ // if we haven't failed up this point, log them in.
+
+ $_SESSION['last_login_date'] = datetime_convert('UTC','UTC');
+ authenticate_success($record, true, true);