Skip to content

Commit

Permalink
API Respect CSRF on login form
Browse files Browse the repository at this point in the history
  • Loading branch information
Damian Mooyman committed Apr 19, 2016
1 parent 4297f56 commit d6016d4
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 23 deletions.
18 changes: 18 additions & 0 deletions .editorconfig
@@ -0,0 +1,18 @@
# For more information about the properties used in this file,
# please see the EditorConfig documentation:
# http://editorconfig.org

[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[{*.yml,package.json}]
indent_size = 2

# The indent size used in the package.json file cannot be changed:
# https://github.com/npm/npm/pull/3180#issuecomment-16336516

34 changes: 11 additions & 23 deletions src/SilverStripe/BehatExtension/Context/LoginContext.php
Expand Up @@ -68,7 +68,7 @@ public function stepIAmLoggedIn()
/**
* Creates a member in a group with the correct permissions.
* Example: Given I am logged in with "ADMIN" permissions
*
*
* @Given /^I am logged in with "([^"]*)" permissions$/
*/
function iAmLoggedInWithPermissions($permCode)
Expand All @@ -78,7 +78,7 @@ function iAmLoggedInWithPermissions($permCode)
if (!$group) {
$group = \Injector::inst()->create('Group');
}

$group->Title = "$permCode group";
$group->write();

Expand Down Expand Up @@ -123,29 +123,14 @@ public function stepIAmNotLoggedIn()
* @When /^I log in with "(?<username>[^"]*)" and "(?<password>[^"]*)"$/
*/
public function stepILogInWith($email, $password)
{
{
$c = $this->getMainContext();
$loginUrl = $c->joinUrlParts($c->getBaseUrl(), $c->getLoginUrl());
$this->getSession()->visit($loginUrl);
$page = $this->getSession()->getPage();
$forms = $page->findAll('xpath', '//form[contains(@action, "Security/LoginForm")]');
assertNotNull($forms, 'Login form not found');

// Try to find visible forms on current page
// Allow multiple login forms (e.g. social login) by filering for "Email" field
$visibleForm = null;
foreach($forms as $form) {
if($form->isVisible() && $form->find('css', '[name=Email]')) {
$visibleForm = $form;
}
}

// If no login form, go to /security/login page
if(!$visibleForm) {
$c = $this->getMainContext();
$loginUrl = $c->joinUrlParts($c->getBaseUrl(), $c->getLoginUrl());
$this->getSession()->visit($loginUrl);
$page = $this->getSession()->getPage();
$forms = $page->findAll('xpath', '//form[contains(@action, "Security/LoginForm")]');
}

// Try to find visible forms again on login page.
$visibleForm = null;
foreach($forms as $form) {
Expand All @@ -155,18 +140,21 @@ public function stepILogInWith($email, $password)
}

assertNotNull($visibleForm, 'Could not find login form');

$emailField = $visibleForm->find('css', '[name=Email]');
$passwordField = $visibleForm->find('css', '[name=Password]');
$submitButton = $visibleForm->find('css', '[type=submit]');
$securityID = $visibleForm->find('css', '[name=SecurityID]');

assertNotNull($emailField, 'Email field on login form not found');
assertNotNull($passwordField, 'Password field on login form not found');
assertNotNull($submitButton, 'Submit button on login form not found');
// @todo Once CSRF is mandatory, uncomment this
// assertNotNull($securityID, 'CSRF token not found');

$emailField->setValue($email);
$passwordField->setValue($password);
$submitButton->press();
$submitButton->press();
}

/**
Expand Down

0 comments on commit d6016d4

Please sign in to comment.