Chris@0: configFactory = $config_factory; Chris@0: $this->userData = $user_data; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Checks access to the given user's contact page. Chris@0: * Chris@0: * @param \Drupal\user\UserInterface $user Chris@0: * The user being contacted. Chris@0: * @param \Drupal\Core\Session\AccountInterface $account Chris@0: * The currently logged in account. Chris@0: * Chris@0: * @return \Drupal\Core\Access\AccessResultInterface Chris@0: * The access result. Chris@0: */ Chris@0: public function access(UserInterface $user, AccountInterface $account) { Chris@0: $contact_account = $user; Chris@0: Chris@0: // Anonymous users cannot have contact forms. Chris@0: if ($contact_account->isAnonymous()) { Chris@0: return AccessResult::forbidden(); Chris@0: } Chris@0: Chris@0: // Users may not contact themselves by default, hence this requires user Chris@0: // granularity for caching. Chris@0: $access = AccessResult::neutral()->cachePerUser(); Chris@0: if ($account->id() == $contact_account->id()) { Chris@0: return $access; Chris@0: } Chris@0: Chris@0: // User administrators should always have access to personal contact forms. Chris@0: $permission_access = AccessResult::allowedIfHasPermission($account, 'administer users'); Chris@0: if ($permission_access->isAllowed()) { Chris@0: return $access->orIf($permission_access); Chris@0: } Chris@0: Chris@0: // If requested user has been blocked, do not allow users to contact them. Chris@0: $access->addCacheableDependency($contact_account); Chris@0: if ($contact_account->isBlocked()) { Chris@0: return $access; Chris@0: } Chris@0: Chris@0: // Forbid access if the requested user has disabled their contact form. Chris@0: $account_data = $this->userData->get('contact', $contact_account->id(), 'enabled'); Chris@0: if (isset($account_data) && !$account_data) { Chris@0: return $access; Chris@0: } Chris@0: Chris@0: // If the requested user did not save a preference yet, deny access if the Chris@0: // configured default is disabled. Chris@0: $contact_settings = $this->configFactory->get('contact.settings'); Chris@0: $access->cacheUntilConfigurationChanges($contact_settings); Chris@0: if (!isset($account_data) && !$contact_settings->get('user_default_enabled')) { Chris@0: return $access; Chris@0: } Chris@0: Chris@0: return $access->orIf(AccessResult::allowedIfHasPermission($account, 'access user contact forms')); Chris@0: } Chris@0: Chris@0: }