public function testDeletesOpauthIdentityOnDelete() { $member = new Member(array('Email' => '*****@*****.**')); $member->write(); $identity = new OpauthIdentity(); $identity->write(); $member->OpauthIdentities()->add($identity); $member->delete(); $this->assertEquals(0, $member->OpauthIdentities()->Count()); }
/** * factory * Returns or creates a fresh OpauthIdentity. * @param array $oaResponse The response object from Opauth. * @return OpauthIdentity instance based on $oaResponse. */ public static function factory(array $oaResponse) { if (empty($oaResponse['auth'])) { throw new InvalidArgumentException('The auth key is required to continue.'); } if (empty($oaResponse['auth']['provider'])) { throw new InvalidArgumentException('Unable to determine provider.'); } $auth = $oaResponse['auth']; $do = OpauthIdentity::get()->filter(array('Provider' => $auth['provider'], 'UID' => $auth['uid']))->first(); if (!$do || !$do->exists()) { $do = new OpauthIdentity(); $do->Provider = $auth['provider']; $do->UID = $auth['uid']; } $do->setAuthSource($auth); return $do; }
public function testForgotPasswordVeto() { Config::inst()->update('OpauthMemberLoginFormExtension', 'allow_password_reset', false); $memberWithoutPassword = new Member(array('Email' => '*****@*****.**')); $memberWithoutPassword->write(); $memberWithPassword = new Member(array('Email' => '*****@*****.**', 'Password' => 'test')); $memberWithPassword->write(); $memberWithIdentity = new Member(array('Email' => '*****@*****.**')); $memberWithIdentity->write(); $identity = new OpauthIdentity(array('MemberID' => $memberWithIdentity->ID, 'Provider' => 'Google')); $identity->write(); $form = new Form(new Controller(), 'Form', new FieldList(), new FieldList()); $ext = new OpauthMemberLoginFormExtension(); $ext->setOwner($form); $this->assertNull($ext->forgotPassword($memberWithoutPassword)); $this->assertNull(Session::get("FormInfo.Form_Form.formError.message")); $this->assertNull($ext->forgotPassword($memberWithPassword)); $this->assertNull(Session::get("FormInfo.Form_Form.formError.message")); $this->assertFalse($ext->forgotPassword($memberWithIdentity)); $this->assertContains('Google', Session::get("FormInfo.Form_Form.formError.message")); }
public function testFindOrCreateMemberOverwriteExistingFields() { $member = new Member(array('Email' => '*****@*****.**', 'FirstName' => 'Existing', 'Surname' => 'Existing')); $member->write(); $identity = OpauthIdentity::factory(array('auth' => array('provider' => 'Facebook', 'uid' => 999, 'info' => array('email' => '*****@*****.**', 'first_name' => 'New', 'last_name' => 'New')))); $member = $identity->findOrCreateMember(array('overwriteExistingFields' => false)); $this->assertEquals('Existing', $member->FirstName, 'Does not overwrite unless requested'); $identity = OpauthIdentity::factory(array('auth' => array('provider' => 'Facebook', 'uid' => 999, 'info' => array('email' => '*****@*****.**', 'first_name' => 'New', 'last_name' => 'New')))); $member = $identity->findOrCreateMember(array('overwriteExistingFields' => array('FirstName'))); $this->assertEquals('New', $member->FirstName, 'Overwrites existing fields if requested'); $this->assertEquals('Existing', $member->Surname, 'Does not overwrite fields if not present in whitelist'); }
/** * Deny password resets * * @param Member $member * @return boolean */ public function forgotPassword($member) { if (Config::inst()->get('OpauthMemberLoginFormExtension', 'allow_password_reset')) { return null; } $identity = OpauthIdentity::get()->find('MemberID', $member->ID); if (!$member->Password && $identity) { $this->owner->sessionMessage(_t('OpauthMemberLoginFormExtension.NoResetPassword', 'Can\'t reset password for accounts registered through {provider}', array('provider' => $identity->Provider)), 'bad'); return false; } else { return null; } }
/** * Equivalent to "callback.php" in the Opauth package. * If there is a problem with the response, we throw an HTTP error. * When done validating, we return back to the Authenticator continue auth. * @throws SS_HTTPResponse_Exception if any validation errors */ public function finished(SS_HTTPRequest $request) { $opauth = OpauthAuthenticator::opauth(false); $response = $this->getOpauthResponse(); if (!$response) { $response = array(); } // Clear the response as it is only to be read once (if Session) Session::clear('opauth'); // Handle all Opauth validation in this handy function try { $this->validateOpauthResponse($opauth, $response); } catch (OpauthValidationException $e) { return $this->handleOpauthException($e); } $identity = OpauthIdentity::factory($response); $member = $identity->findOrCreateMember(); // If the member exists, associate it with the identity and log in if ($member->isInDB() && $member->validate()->valid()) { if (!$identity->exists()) { $identity->write(); $flag = self::AUTH_FLAG_LINK; } else { $flag = self::AUTH_FLAG_LOGIN; } Session::set('OpauthIdentityID', $identity->ID); } else { $flag = self::AUTH_FLAG_REGISTER; // Write the identity $identity->write(); // Keep a note of the identity ID Session::set('OpauthIdentityID', $identity->ID); // Even if written, check validation - we might not have full fields $validationResult = $member->validate(); if (!$validationResult->valid()) { // Set up the register form before it's output $regForm = $this->RegisterForm(); $regForm->loadDataFrom($member); $regForm->setSessionData($member); $regForm->validate(); return $this->redirect($this->Link('profilecompletion')); } else { $member->extend('onBeforeOpauthRegister'); $member->write(); $identity->MemberID = $member->ID; $identity->write(); } } return $this->loginAndRedirect($member, $identity, $flag); }