You are here

seckit.test in Security Kit 6

Same filename and directory in other branches
  1. 7 seckit.test

Tests for Security Kit module.

File

seckit.test
View source
<?php

/**
 * @file
 * Tests for Security Kit module.
 */

/**
 * Functional tests for Security Kit.
 */
class SecKitTestCase extends DrupalWebTestCase {

  /**
   * Admin user for tests
   * @var object
   */
  private $admin;

  /**
   * Implements getInfo().
   * @see DrupalWebTestCase::getInfo()
   */
  public static function getInfo() {
    return array(
      'name' => t('Security Kit functionality'),
      'description' => t('Tests functionality and settings page of Security Kit module.'),
      'group' => t('Security Kit'),
    );
  }

  /**
   * Implements setUp().
   * @see DrupalWebTestCase::setUp()
   */
  public function setUp() {
    parent::setUp('seckit');
    $this->admin = $this
      ->drupalCreateUser(array(
      'administer seckit',
    ));
    $this
      ->drupalLogin($this->admin);
  }

  /**
   * Tests disabled Content Security Policy.
   */
  public function testDisabledCSP() {
    $form['seckit_xss[csp][checkbox]'] = FALSE;
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->assertFalse($this
      ->drupalGetHeader('Content-Security-Policy'), t('Content Security Policy is disabled (Official).'));
    $this
      ->assertFalse($this
      ->drupalGetHeader('X-Content-Security-Policy'), t('Content Security Policy is disabled (Mozilla and IE10).'));
    $this
      ->assertFalse($this
      ->drupalGetHeader('X-WebKit-CSP'), t('Content Security Policy is disabled (Chrome and Safari).'));
  }

  /**
   * Tests Content Security Policy with all enabled directives.
   */
  public function testCSPHasAllDirectives() {
    $form = array(
      'seckit_xss[csp][checkbox]' => TRUE,
      'seckit_xss[csp][default-src]' => '*',
      'seckit_xss[csp][script-src]' => '*',
      'seckit_xss[csp][object-src]' => '*',
      'seckit_xss[csp][style-src]' => '*',
      'seckit_xss[csp][img-src]' => '*',
      'seckit_xss[csp][media-src]' => '*',
      'seckit_xss[csp][frame-src]' => '*',
      'seckit_xss[csp][font-src]' => '*',
      'seckit_xss[csp][connect-src]' => '*',
      'seckit_xss[csp][report-uri]' => 'admin/settings/seckit/csp-report',
    );
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $expected = 'default-src *; script-src *; object-src *; style-src *; img-src *; media-src *; frame-src *; font-src *; connect-src *; report-uri admin/settings/seckit/csp-report';
    $this
      ->assertEqual($expected, $this
      ->drupalGetHeader('Content-Security-Policy'), t('Content-Security-Policy has all the directves (Official).'));
    $this
      ->assertEqual($expected, $this
      ->drupalGetHeader('X-Content-Security-Policy'), t('X-Content-Security-Policy has all the directves (Mozilla and IE10).'));
    $this
      ->assertEqual($expected, $this
      ->drupalGetHeader('X-WebKit-CSP'), t('X-WebKit-CSP has all the directves (Chrome and Safari).'));
  }

  /**
   * Tests Content Security Policy with policy-uri directive.
   * In this case, only policy-uri directive should be present.
   */
  public function testCSPPolicyUriDirectiveOnly() {
    $form = array(
      'seckit_xss[csp][checkbox]' => TRUE,
      'seckit_xss[csp][default-src]' => '*',
      'seckit_xss[csp][script-src]' => '*',
      'seckit_xss[csp][object-src]' => '*',
      'seckit_xss[csp][img-src]' => '*',
      'seckit_xss[csp][media-src]' => '*',
      'seckit_xss[csp][style-src]' => '*',
      'seckit_xss[csp][frame-src]' => '*',
      'seckit_xss[csp][font-src]' => '*',
      'seckit_xss[csp][connect-src]' => '*',
      'seckit_xss[csp][report-uri]' => 'admin/settings/seckit/csp-report',
      'seckit_xss[csp][policy-uri]' => 'csp.xml',
    );
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $expected = 'policy-uri ' . base_path() . 'csp.xml';
    $this
      ->assertEqual($expected, $this
      ->drupalGetHeader('Content-Security-Policy'), t('Content-Security-Policy has only policy-uri directive (Official).'));
    $this
      ->assertEqual($expected, $this
      ->drupalGetHeader('X-Content-Security-Policy'), t('X-Content-Security-Policy has only policy-uri directive (Mozilla and IE10).'));
    $this
      ->assertEqual($expected, $this
      ->drupalGetHeader('X-WebKit-CSP'), t('X-WebKit-CSP has only policy-uri directive (Chrome and Safari).'));
  }

  /**
   * Tests Content Security Policy with all directives empty.
   * In this case, we should revert back to default values.
   */
  public function testCSPAllDirectivesEmpty() {
    $form = array(
      'seckit_xss[csp][checkbox]' => TRUE,
      'seckit_xss[csp][default-src]' => '',
      'seckit_xss[csp][script-src]' => '',
      'seckit_xss[csp][object-src]' => '',
      'seckit_xss[csp][img-src]' => '',
      'seckit_xss[csp][media-src]' => '',
      'seckit_xss[csp][style-src]' => '',
      'seckit_xss[csp][frame-src]' => '',
      'seckit_xss[csp][font-src]' => '',
      'seckit_xss[csp][connect-src]' => '',
      'seckit_xss[csp][report-uri]' => '',
      'seckit_xss[csp][policy-uri]' => '',
    );
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $expected = "default-src 'self'; report-uri admin/settings/seckit/csp-report";
    $this
      ->assertEqual($expected, $this
      ->drupalGetHeader('Content-Security-Policy'), t('Content-Security-Policy has default directive (Official).'));
    $this
      ->assertEqual($expected, $this
      ->drupalGetHeader('X-Content-Security-Policy'), t('X-Content-Security-Policy has default directive (Mozilla and IE10).'));
    $this
      ->assertEqual($expected, $this
      ->drupalGetHeader('X-WebKit-CSP'), t('X-WebKit-CSP has default directive (Chrome and Safari).'));
  }

  /**
   * Tests Content Security Policy in report-only mode.
   */
  public function testReportOnlyCSP() {
    $form['seckit_xss[csp][checkbox]'] = TRUE;
    $form['seckit_xss[csp][report-only]'] = TRUE;
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->assertTrue($this
      ->drupalGetHeader('Content-Security-Policy-Report-Only'), t('Content Security Policy is in report-only mode (Official).'));
    $this
      ->assertTrue($this
      ->drupalGetHeader('X-Content-Security-Policy-Report-Only'), t('Content Security Policy is in report-only mode (Mozilla and IE10).'));
    $this
      ->assertTrue($this
      ->drupalGetHeader('X-WebKit-CSP-Report-Only'), t('Content Security Policy is in report-only mode (Chrome and Safari).'));
  }

  /**
   * Tests disabled X-XSS-Protection HTTP response header.
   */
  public function testXXSSProtectionIsDisabled() {
    $form['seckit_xss[x_xss][select]'] = SECKIT_X_XSS_DISABLE;
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->assertFalse($this
      ->drupalGetHeader('X-XSS-Protection'), t('X-XSS-Protection is disabled.'));
  }

  /**
   * Tests set to 0 X-XSS-Protection HTTP response header.
   */
  public function testXXSSProtectionIs0() {
    $form['seckit_xss[x_xss][select]'] = SECKIT_X_XSS_0;
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->assertEqual(0, $this
      ->drupalGetHeader('X-XSS-Protection'), t('X-XSS-Protection is set to 0.'));
  }

  /**
   * Tests set to 1; mode=block X-XSS-Protection HTTP response header.
   */
  public function testXXSSProtectionIs1() {
    $form['seckit_xss[x_xss][select]'] = SECKIT_X_XSS_1;
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->assertEqual('1; mode=block', $this
      ->drupalGetHeader('X-XSS-Protection'), t('X-XSS-Protection is set to 1; mode=block.'));
  }

  /**
   * Tests disabled X-Content-Type-Options HTTP response header.
   */
  public function testDisabledXContentTypeOptions() {
    $form['seckit_xss[x_content_type][checkbox]'] = FALSE;
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->assertFalse($this
      ->drupalGetHeader('X-Content-Type-Options'), t('X-Content-Type-Options is disabled.'));
  }

  /**
   * Tests enabled X-Content-Type-Options HTTP response header.
   */
  public function testEnabledXContentTypeOptions() {
    $form['seckit_xss[x_content_type][checkbox]'] = TRUE;
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->assertEqual('nosniff', $this
      ->drupalGetHeader('X-Content-Type-Options'), t('X-Content-Type-Options is enabled and set to nosniff.'));
  }

  /**
   * Tests HTTP Origin allows requests from the site.
   */
  public function testOriginAllowsSite() {
    global $base_url;
    $form['seckit_csrf[origin]'] = TRUE;
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'), array(), array(
      'Origin: ' . $base_url,
    ));
    $this
      ->assertResponse(200, t('Request is allowed.'));
  }

  /**
   * Tests HTTP Origin allows requests from the specified source.
   */
  public function testOriginAllowsSpecifiedSource() {
    $form = array(
      'seckit_csrf[origin]' => TRUE,
      'seckit_csrf[origin_whitelist]' => 'http://www.example.com',
    );
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'), array(), array(
      'Origin: http://www.example.com',
    ));
    $this
      ->assertResponse(200, t('Whitelisted request is allowed.'));
  }

  /**
   * Tests HTTP Origin denies request.
   */
  public function testOriginDeny() {
    $form['seckit_csrf[origin]'] = TRUE;
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'), array(), array(
      'Origin: http://www.example.com',
    ));
    $this
      ->assertEqual(array(), $_POST, t('POST is empty.'));
    $this
      ->assertResponse(403, t('Request is denied.'));
  }

  /**
   * Tests disabled X-Frame-Options HTTP response header.
   */
  public function testXFrameOptionsIsDisabled() {
    $form['seckit_clickjacking[x_frame]'] = SECKIT_X_FRAME_DISABLE;
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->assertFalse($this
      ->drupalGetHeader('X-Frame-Options'), t('X-Frame-Options is disabled.'));
  }

  /**
   * Tests set to SameOrigin X-Frame-Options HTTP response header.
   */
  public function testXFrameOptionsIsSameOrigin() {
    $form['seckit_clickjacking[x_frame]'] = SECKIT_X_FRAME_SAMEORIGIN;
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->assertEqual('SameOrigin', $this
      ->drupalGetHeader('X-Frame-Options'), t('X-Frame-Options is set to SameOrigin.'));
  }

  /**
   * Tests set to Deny X-Frame-Options HTTP response header.
   */
  public function testXFrameOptionsIsDeny() {
    $form['seckit_clickjacking[x_frame]'] = SECKIT_X_FRAME_DENY;
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->assertEqual('Deny', $this
      ->drupalGetHeader('X-Frame-Options'), t('X-Frame-Options is set to Deny.'));
  }

  /**
   * Tests set to Allow-From X-Frame-Options HTTP response header.
   */
  public function testXFrameOptionsIsAllowFrom() {
    $form['seckit_clickjacking[x_frame]'] = SECKIT_X_FRAME_ALLOW_FROM;
    $form['seckit_clickjacking[x_frame_allow_from]'] = 'http://www.google.com';
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->assertEqual('Allow-From: http://www.google.com', $this
      ->drupalGetHeader('X-Frame-Options'), t('X-Frame-Options is set to Allow-From.'));
  }

  /**
   * Tests JS + CSS + Noscript protection.
   */
  public function testJSCSSNoscript() {
    $form['seckit_clickjacking[js_css_noscript]'] = TRUE;
    $form['seckit_clickjacking[noscript_message]'] = 'Sorry, your JavaScript is disabled.';
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $code = _seckit_get_js_css_noscript_code();
    $this
      ->assertRaw($code, t('JavaScript + CSS + Noscript protection is loaded.'));
  }

  /**
   * Tests disabled HTTP Strict Transport Security.
   */
  public function testDisabledHSTS() {
    $form['seckit_ssl[hsts]'] = FALSE;
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->assertFalse($this
      ->drupalGetHeader('Strict-Transport-Security'), t('HTTP Strict Transport Security is disabled.'));
  }

  /**
   * Tests HTTP Strict Transport Security has all directives.
   */
  public function testHSTSAllDirectves() {
    $form = array(
      'seckit_ssl[hsts]' => TRUE,
      'seckit_ssl[hsts_max_age]' => 1000,
      'seckit_ssl[hsts_subdomains]' => 1,
    );
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $expected = 'max-age=1000; includeSubDomains';
    $this
      ->assertEqual($expected, $this
      ->drupalGetHeader('Strict-Transport-Security'), t('HTTP Strict Transport Security has all the directives.'));
  }

  /**
   * Tests disabled From-Origin.
   */
  public function testDisabledFromOrigin() {
    $form['seckit_various[from_origin]'] = FALSE;
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->assertFalse($this
      ->drupalGetHeader('From-Origin'), t('From-Origin is disabled.'));
  }

  /**
   * Tests enabled From-Origin.
   */
  public function testEnabledFromOrigin() {
    $form = array(
      'seckit_various[from_origin]' => TRUE,
      'seckit_various[from_origin_destination]' => 'same',
    );
    $this
      ->drupalPost('admin/settings/seckit', $form, t('Save configuration'));
    $this
      ->assertEqual('same', $this
      ->drupalGetHeader('From-Origin'), t('From-Origin is enabled and set to same.'));
  }

}

Classes

Namesort descending Description
SecKitTestCase Functional tests for Security Kit.