You are here

public function SetTimezoneController::updateTimezone in Timezone Detect 8

Update the users timezone.

1 string reference to 'SetTimezoneController::updateTimezone'
timezone_detect.routing.yml in ./timezone_detect.routing.yml
timezone_detect.routing.yml

File

src/Controller/SetTimezoneController.php, line 72

Class

SetTimezoneController

Namespace

Drupal\timezone_detect\Controller

Code

public function updateTimezone() {
  $response = new AjaxResponse();

  // If they are logged in, set some data.
  if ($this->account
    ->isAuthenticated()) {

    // Check for $_POST data.
    // Timezone should be an IANA/Olson timezone id provided via $_POST.
    $timezone = Html::escape($this->request->request
      ->get('timezone'));
    if (!isset($timezone)) {
      $this->logger
        ->error('Attempting to set timezone for user @uid, but no timezone found in $_POST data; aborting.', [
        '@uid' => $this->account
          ->id(),
      ]);
      unset($_SESSION['timezone_detect']['update_timezone']);
      return $response;
    }

    // Make sure we have a valid session token to prevent cross-site request
    // forgery.
    $token = $this->request->request
      ->get('token');
    if (!isset($token) || !$this->tokenGenerator
      ->validate($token)) {
      $this->logger
        ->error('Attempting to set timezone for user @uid, but session token in $_POST data is empty or invalid; aborting.', [
        '@uid' => $this->account
          ->ui(),
      ]);
      unset($_SESSION['timezone_detect']['update_timezone']);
      return $response;
    }

    // Keep track of the last submitted timezone in case it's not valid so
    // that we don't keep POSTing it on every request.
    $_SESSION['timezone_detect']['current_timezone'] = $timezone;

    // Check valid timezone id.
    $zone_list = timezone_identifiers_list();
    if (!in_array($timezone, $zone_list)) {
      $this->logger
        ->error('Attempting to set timezone for user @uid to @timezone, but that does not appear to be a valid timezone id; aborting.', [
        '@uid' => $this->account
          ->id(),
        '@timezone' => $timezone,
      ]);
      unset($_SESSION['timezone_detect']['update_timezone']);
      return $response;
    }

    // Save timezone to account.
    User::load($this->account
      ->id())
      ->set('timezone', $timezone)
      ->save();
    if ($this->configFactory
      ->get('timezone_detect.settings')
      ->get('watchdog')) {
      $this->logger
        ->notice('Set timezone for user @uid to @timezone.', [
        '@uid' => $this->account
          ->id(),
        '@timezone' => $timezone,
      ]);
    }
  }

  // Unset session flag regarldess of whether they are logged in or not to
  // avoid repeated attempts at this process that are likely to fail.
  unset($_SESSION['timezone_detect']['update_timezone']);
  return $response;
}