diff --git a/CRM/Stripe/Check.php b/CRM/Stripe/Check.php index 34476a9e11a9791f7d3e1b849aa0492aae5871f2..41990ff8e705264e4b26f0ef4959955732b9477e 100644 --- a/CRM/Stripe/Check.php +++ b/CRM/Stripe/Check.php @@ -25,77 +25,105 @@ class CRM_Stripe_Check { /** * @var string */ - const MIN_VERSION_MJWSHARED = '1.0'; - const MIN_VERSION_SWEETALERT = '1.5'; + const MIN_VERSION_MJWSHARED = '1.1'; const MIN_VERSION_FIREWALL = '1.2.1'; - public static function checkRequirements(&$messages) { - self::checkExtensionMjwshared($messages); - self::checkExtensionFirewall($messages); - self::checkExtensionSweetalert($messages); - self::checkIfSeparateMembershipPaymentEnabled($messages); - self::checkUpgradeMessages($messages); - } + /** + * @var array + */ + private $messages; /** - * @param array $messages + * CRM_Stripe_Check constructor. * + * @param $messages + */ + public function __construct($messages) { + $this->messages = $messages; + } + + /** + * @return array * @throws \CiviCRM_API3_Exception */ - private static function checkExtensionMjwshared(&$messages) { - // mjwshared: required. Requires min version - $extensionName = 'mjwshared'; - $extensions = civicrm_api3('Extension', 'get', [ - 'full_name' => $extensionName, - ]); + public function checkRequirements() { + $this->checkExtensionMjwshared(); + $this->checkExtensionFirewall(); + $this->checkUpgradeMessages(); + return $this->messages; + } - if (empty($extensions['count']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) { + /** + * @param string $extensionName + * @param string $minVersion + * @param string $actualVersion + */ + private function requireExtensionMinVersion($extensionName, $minVersion, $actualVersion) { + $actualVersionModified = $actualVersion; + if (substr($actualVersion, -4) === '-dev') { $message = new CRM_Utils_Check_Message( - __FUNCTION__ . E::SHORT_NAME . '_requirements', - E::ts('The <em>%1</em> extension requires the <em>Payment Shared</em> extension which is not installed. See <a href="%2" target="_blank">details</a> for more information.', + __FUNCTION__ . $extensionName . E::SHORT_NAME . '_requirements_dev', + E::ts('You are using a development version of %1 extension.', [ 1 => ucfirst(E::SHORT_NAME), - 2 => 'https://civicrm.org/extensions/mjwshared', - ] - ), + 2 => $extensionName, + 3 => $minVersion, + 4 => $actualVersion + ]), + E::ts('%1: Development version', [1 => ucfirst(E::SHORT_NAME)]), + \Psr\Log\LogLevel::WARNING, + 'fa-code' + ); + $this->messages[] = $message; + $actualVersionModified = substr($actualVersion, 0, -4); + } + + if (version_compare($actualVersionModified, $minVersion) === -1) { + $message = new CRM_Utils_Check_Message( + __FUNCTION__ . $extensionName . E::SHORT_NAME . '_requirements', + E::ts('The %1 extension requires the %2 extension version %3 or greater but your system has version %4.', + [ + 1 => ucfirst(E::SHORT_NAME), + 2 => $extensionName, + 3 => $minVersion, + 4 => $actualVersion + ]), E::ts('%1: Missing Requirements', [1 => ucfirst(E::SHORT_NAME)]), \Psr\Log\LogLevel::ERROR, - 'fa-money' + 'fa-exclamation-triangle' ); $message->addAction( - E::ts('Install now'), + E::ts('Upgrade now'), NULL, 'href', ['path' => 'civicrm/admin/extensions', 'query' => ['action' => 'update', 'id' => $extensionName, 'key' => $extensionName]] ); - $messages[] = $message; - return; - } - if (isset($extensions['id']) && $extensions['values'][$extensions['id']]['status'] === 'installed') { - self::requireExtensionMinVersion($messages, $extensionName, self::MIN_VERSION_MJWSHARED, $extensions['values'][$extensions['id']]['version']); + $this->messages[] = $message; } } /** - * @param array $messages - * * @throws \CiviCRM_API3_Exception */ - private static function checkExtensionFirewall(&$messages) { - $extensionName = 'firewall'; - + private function checkExtensionMjwshared() { + // mjwshared: required. Requires min version + $extensionName = 'mjwshared'; $extensions = civicrm_api3('Extension', 'get', [ 'full_name' => $extensionName, ]); if (empty($extensions['count']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) { $message = new CRM_Utils_Check_Message( - __FUNCTION__ . 'stripe_recommended', - E::ts('If you are using Stripe to accept payments on public forms (eg. contribution/event registration forms) it is recommended that you install the <strong><a href="https://lab.civicrm.org/extensions/firewall">firewall</a></strong> extension. - Some sites have become targets for spammers who use the payment endpoint to try and test credit cards by submitting invalid payments to your Stripe account.'), - E::ts('Recommended Extension: firewall'), - \Psr\Log\LogLevel::NOTICE, - 'fa-lightbulb-o' + __FUNCTION__ . E::SHORT_NAME . '_requirements', + E::ts('The <em>%1</em> extension requires the <em>Payment Shared</em> extension which is not installed. See <a href="%2" target="_blank">details</a> for more information.', + [ + 1 => ucfirst(E::SHORT_NAME), + 2 => 'https://civicrm.org/extensions/mjwshared', + ] + ), + E::ts('%1: Missing Requirements', [1 => ucfirst(E::SHORT_NAME)]), + \Psr\Log\LogLevel::ERROR, + 'fa-money' ); $message->addAction( E::ts('Install now'), @@ -103,21 +131,20 @@ class CRM_Stripe_Check { 'href', ['path' => 'civicrm/admin/extensions', 'query' => ['action' => 'update', 'id' => $extensionName, 'key' => $extensionName]] ); - $messages[] = $message; + $this->messages[] = $message; + return; } if (isset($extensions['id']) && $extensions['values'][$extensions['id']]['status'] === 'installed') { - self::requireExtensionMinVersion($messages, $extensionName, CRM_Stripe_Check::MIN_VERSION_FIREWALL, $extensions['values'][$extensions['id']]['version']); + $this->requireExtensionMinVersion($extensionName, self::MIN_VERSION_MJWSHARED, $extensions['values'][$extensions['id']]['version']); } } /** - * @param array $messages - * * @throws \CiviCRM_API3_Exception */ - private static function checkExtensionSweetalert(&$messages) { - // sweetalert: recommended. If installed requires min version - $extensionName = 'sweetalert'; + private function checkExtensionFirewall() { + $extensionName = 'firewall'; + $extensions = civicrm_api3('Extension', 'get', [ 'full_name' => $extensionName, ]); @@ -125,11 +152,9 @@ class CRM_Stripe_Check { if (empty($extensions['count']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) { $message = new CRM_Utils_Check_Message( __FUNCTION__ . 'stripe_recommended', - E::ts('It is recommended that you install the <strong><a href="https://civicrm.org/extensions/sweetalert">sweetalert</a></strong> extension. - This allows the stripe extension to show useful messages to the user when processing payment. - If this is not installed it will fallback to the browser "alert" message but you will - not see some messages (such as <em>we are pre-authorizing your card</em> and <em>please wait</em>) and the feedback to the user will not be as helpful.'), - E::ts('Recommended Extension: sweetalert'), + E::ts('If you are using Stripe to accept payments on public forms (eg. contribution/event registration forms) it is recommended that you install the <strong><a href="https://lab.civicrm.org/extensions/firewall">firewall</a></strong> extension. + Some sites have become targets for spammers who use the payment endpoint to try and test credit cards by submitting invalid payments to your Stripe account.'), + E::ts('Recommended Extension: firewall'), \Psr\Log\LogLevel::NOTICE, 'fa-lightbulb-o' ); @@ -139,96 +164,10 @@ class CRM_Stripe_Check { 'href', ['path' => 'civicrm/admin/extensions', 'query' => ['action' => 'update', 'id' => $extensionName, 'key' => $extensionName]] ); - $messages[] = $message; - return; + $this->messages[] = $message; } if (isset($extensions['id']) && $extensions['values'][$extensions['id']]['status'] === 'installed') { - self::requireExtensionMinVersion($messages, $extensionName, CRM_Stripe_Check::MIN_VERSION_SWEETALERT, $extensions['values'][$extensions['id']]['version']); - } - } - - /** - * @param array $messages - * @param string $extensionName - * @param string $minVersion - * @param string $actualVersion - */ - private static function requireExtensionMinVersion(&$messages, $extensionName, $minVersion, $actualVersion) { - if (version_compare($actualVersion, $minVersion) === -1) { - $message = new CRM_Utils_Check_Message( - __FUNCTION__ . $extensionName . E::SHORT_NAME . '_requirements', - E::ts('The %1 extension requires the %2 extension version %3 or greater but your system has version %4.', - [ - 1 => ucfirst(E::SHORT_NAME), - 2 => $extensionName, - 3 => $minVersion, - 4 => $actualVersion - ]), - E::ts('%1: Missing Requirements', [1 => ucfirst(E::SHORT_NAME)]), - \Psr\Log\LogLevel::ERROR, - 'fa-money' - ); - $message->addAction( - E::ts('Upgrade now'), - NULL, - 'href', - ['path' => 'civicrm/admin/extensions', 'query' => ['action' => 'update', 'id' => $extensionName, 'key' => $extensionName]] - ); - $messages[] = $message; - } - } - - /** - * @throws \CiviCRM_API3_Exception - */ - private static function checkIfSeparateMembershipPaymentEnabled(&$messages) { - $membershipBlocks = civicrm_api3('MembershipBlock', 'get', [ - 'is_separate_payment' => 1, - 'is_active' => 1, - ]); - if ($membershipBlocks['count'] === 0) { - return; - } - else { - $contributionPagesToCheck = []; - foreach ($membershipBlocks['values'] as $blockID => $blockDetails) { - if ($blockDetails['entity_table'] !== 'civicrm_contribution_page') { - continue; - } - $contributionPagesToCheck[] = $blockDetails['entity_id']; - } - $stripePaymentProcessorIDs = civicrm_api3('PaymentProcessor', 'get', [ - 'return' => ['id'], - 'payment_processor_type_id' => 'Stripe', - ]); - $stripePaymentProcessorIDs = CRM_Utils_Array::collect('id', $stripePaymentProcessorIDs['values']); - if (!empty($contributionPagesToCheck)) { - $contributionPages = civicrm_api3('ContributionPage', 'get', [ - 'return' => ['payment_processor'], - 'id' => ['IN' => $contributionPagesToCheck], - 'is_active' => 1, - ]); - foreach ($contributionPages['values'] as $contributionPage) { - $enabledPaymentProcessors = explode(CRM_Core_DAO::VALUE_SEPARATOR, $contributionPage['payment_processor']); - foreach ($enabledPaymentProcessors as $enabledID) { - if (in_array($enabledID, $stripePaymentProcessorIDs)) { - $message = new CRM_Utils_Check_Message( - __FUNCTION__ . 'stripe_requirements', - E::ts('Stripe does not support "Separate Membership Payment" on contribution pages but you have one or more contribution pages with - that setting enabled and Stripe as the payment processor (found on contribution page ID: %1).', - [ - 1 => $contributionPage['id'], - ]), - E::ts('Stripe: Invalid configuration'), - \Psr\Log\LogLevel::ERROR, - 'fa-money' - ); - $messages[] = $message; - return; - } - } - } - } + $this->requireExtensionMinVersion($extensionName, CRM_Stripe_Check::MIN_VERSION_FIREWALL, $extensions['values'][$extensions['id']]['version']); } } @@ -237,7 +176,7 @@ class CRM_Stripe_Check { * * @param array $messages */ - private static function checkUpgradeMessages(&$messages) { + private function checkUpgradeMessages() { // @todo: When we release 6.7 we need to think about if this should be displayed or not (consider install/upgrade). if ((bool) \Civi::settings()->get('stripe_upgrade66message')) { $message = new CRM_Utils_Check_Message( @@ -263,7 +202,7 @@ class CRM_Stripe_Check { 'api3', ['Setting', 'create', ['stripe_upgrade66message' => 0]] ); - $messages[] = $message; + $this->messages[] = $message; } } diff --git a/stripe.php b/stripe.php index 842db0d1ecb3bc26a3bfe1cde1d214a0dce98800..c7581cd25639dad497faccc6099f2417ba582f97 100644 --- a/stripe.php +++ b/stripe.php @@ -231,7 +231,8 @@ function stripe_civicrm_buildForm($formName, &$form) { * @throws \CiviCRM_API3_Exception */ function stripe_civicrm_check(&$messages) { - CRM_Stripe_Check::checkRequirements($messages); + $checks = new CRM_Stripe_Check($messages); + $messages = $checks->checkRequirements(); // If we didn't install mjwshared yet check requirements but don't crash when checking webhooks if (trait_exists('CRM_Mjwshared_WebhookTrait')) { CRM_Stripe_Webhook::check($messages);