-// Returns an array of group id's this contact is a member of.
-// This array will only contain group id's related to the uid of this
-// DFRN contact. They are *not* neccessarily unique across the entire site.
-
-
-if(! function_exists('init_groups_visitor')) {
-function init_groups_visitor($contact_id) {
- $groups = array();
- $r = q("SELECT `gid` FROM `group_member`
- WHERE `contact-id` = %d ",
- intval($contact_id)
- );
- if(count($r)) {
- foreach($r as $rr)
- $groups[] = $rr['gid'];
+ if (x($_POST,'auth-params') && $_POST['auth-params'] === 'login') {
+
+ $record = null;
+
+ $addon_auth = array(
+ 'username' => trim($_POST['username']),
+ 'password' => trim($_POST['password']),
+ 'authenticated' => 0,
+ 'user_record' => null
+ );
+
+ /**
+ *
+ * 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);