'Secure Pages', 'description' => 'Test Secure Pages redirects.', 'group' => 'Secure Pages', ); } function setUp() { parent::setUp('securepages', 'comment'); variable_set('https', TRUE); variable_set('securepages_enable', TRUE); } /** * Runs all the test functions. These are run from a single outer function to avoid * multiple re-installs by simpletest. */ function testSecurePages() { $this->_testSettingsForm(); $this->_testMatch(); $this->_testAnonymous(); $this->_testFormAlter(); $this->_testCachedResponse(); $this->_testPathAlias(); } /** * Test submitting the settings form */ function _testSettingsForm() { // Undo the setUp() function. variable_del('securepages_enable'); // Enable securepages. $this->web_user = $this->drupalCreateUser(array('administer site configuration', 'access administration pages')); $this->loginHTTPS($this->web_user); $edit = array('securepages_enable' => 1); $this->drupalPost('admin/structure/securepages', $edit, t('Save configuration'), array('https' => TRUE)); $this->assertRaw(t('The configuration options have been saved.')); $this->drupalLogout(); } /** * Tests the securepages_match() function. */ function _testMatch() { $this->assertTrue(securepages_match('user'), 'path user matches.'); $this->assertTrue(securepages_match('user/login'), 'path user/login matches.'); $this->assertTrue(securepages_match('admin/modules'), 'path admin/modules matches.'); $this->assertFalse(securepages_match('node'), 'path node does not match.'); $this->assertTrue(securepages_match('user/autocomplete/alice') == securepages_is_secure() ? 1 : 0, 'autocomplete path is ignored.'); } /** * Tests for anonymous browsing with securepages. */ function _testAnonymous() { // Visit the home page and /node with plain HTTP. $this->drupalGet('', array('https' => FALSE)); $this->assertResponse(200); $this->assertUrl(url('', array('https' => FALSE, 'absolute' => TRUE))); $this->drupalGet('node', array('https' => FALSE)); $this->assertResponse(200); $this->assertUrl(url('node', array('https' => FALSE, 'absolute' => TRUE))); // Visit the login page and confirm that browser is redirected to HTTPS. $this->drupalGet('user', array('https' => FALSE)); $this->assertResponse(200); $this->assertUrl(url('user', array('https' => TRUE, 'absolute' => TRUE))); // Visit the home page and /node with HTTPS and confirm that no redirection happens. $this->drupalGet('', array('https' => TRUE)); $this->assertResponse(200); $this->assertUrl(url('', array('https' => TRUE, 'absolute' => TRUE))); $this->drupalGet('node', array('https' => TRUE)); $this->assertResponse(200); $this->assertUrl(url('node', array('https' => TRUE, 'absolute' => TRUE))); // Enable "Switch back to http pages when there are no matches". variable_set('securepages_switch', TRUE); // Visit the home page and /node with HTTPS and confirm that switch-back happens. $this->drupalGet('', array('https' => TRUE)); $this->assertResponse(200); $this->assertUrl(url('', array('https' => FALSE, 'absolute' => TRUE))); $this->drupalGet('node', array('https' => TRUE)); $this->assertResponse(200); $this->assertUrl(url('node', array('https' => FALSE, 'absolute' => TRUE))); // Clean up variable_del('securepages_pages'); } /** * Tests the ability to alter form actions. * * Uses the comment form, since it has an #action set. */ function _testFormAlter() { variable_set('securepages_switch', TRUE); // Enable anonymous user comments. user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array( 'access comments' => TRUE, 'post comments' => TRUE, 'skip comment approval' => TRUE, )); $this->web_user = $this->drupalCreateUser(array('access comments', 'post comments', 'skip comment approval')); $node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1)); foreach (array('anonymous', 'authenticated') as $mode) { if ($mode == 'authenticated') { $this->drupalLogin($this->web_user); } // Test plain HTTP posting to HTTPS. variable_set('securepages_pages', "comment/reply/*\nuser*"); $this->drupalGet('node/' . $node->nid, array('https' => FALSE)); $this->assertFieldByXPath('//form[@class="comment-form" and starts-with(@action, "https:")]', NULL, "The $mode comment form action is https."); $this->drupalPost(NULL, array('comment_body[und][0][value]' => 'test comment'), t('Save')); $this->assertRaw(t('Your comment has been posted.')); // Test HTTPS posting to plain HTTP. variable_set('securepages_pages', "node/*\nuser*"); $this->drupalGet('node/' . $node->nid, array('https' => TRUE)); $this->assertUrl(url('node/' . $node->nid, array('https' => TRUE, 'absolute' => TRUE))); $this->assertFieldByXPath('//form[@class="comment-form" and starts-with(@action, "http:")]', NULL, "The $mode comment form action is http."); $this->drupalPost(NULL, array('comment_body[und][0][value]' => 'test'), t('Save')); $this->assertRaw(t('Your comment has been posted.')); } $this->drupalLogout(); // Test the user login block. $this->drupalGet(''); $edit = array( 'name' => $this->web_user->name, 'pass' => $this->web_user->pass_raw, ); $this->drupalPost(NULL, $edit, t('Log in')); $this->drupalGet('user/' . $this->web_user->uid . '/edit'); $this->assertResponse(200); // Clean up $this->drupalLogout(); variable_del('securepages_pages'); variable_del('securepages_switch'); } function _testCachedResponse() { // Enable the page cache and fetch the login page. variable_set('cache', TRUE); $url = url('user', array('absolute' => TRUE, 'https' => FALSE)); $this->drupalGet($url); // Short-circuit redirects within the simpletest browser. variable_set('simpletest_maximum_redirects', 0); $this->drupalGet($url); $this->assertResponse(302); $this->assertEqual($this->drupalGetHeader('Location'), url('user', array('https' => TRUE, 'absolute' => TRUE))); $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.'); // Clean up variable_del('cache'); variable_del('simpletest_maximum_redirects'); } /** * Test redirection on aliased paths. */ function _testPathAlias() { variable_set('securepages_pages', "node/*\nuser*"); // Create test user and login. $web_user = $this->drupalCreateUser(array('create page content', 'edit own page content', 'administer url aliases', 'create url aliases')); $this->drupalLogin($web_user); // Create test node. $node = $this->drupalCreateNode(); // Create alias. $edit = array(); $edit['source'] = 'node/' . $node->nid; $edit['alias'] = $this->randomName(8); $this->drupalPost('admin/config/search/path/add', $edit, t('Save')); // Short-circuit redirects within the simpletest browser. variable_set('simpletest_maximum_redirects', 0); $this->drupalGet($edit['alias'], array('absolute' => TRUE, 'https' => FALSE)); $this->assertResponse(302); $this->assertEqual($this->drupalGetHeader('Location'), url($edit['alias'], array('https' => TRUE, 'absolute' => TRUE))); // Clean up variable_del('simpletest_maximum_redirects'); $this->drupalLogout(); variable_del('securepages_pages'); } /** * Logs in a user using HTTPS. */ function loginHTTPS($user) { $edit = array( 'name' => $user->name, 'pass' => $user->pass_raw, ); $this->drupalPost('user', $edit, t('Log in'), array('https' => TRUE)); } }