Skip to content
Snippets Groups Projects
Commit 2da01369 authored by mattwire's avatar mattwire
Browse files

Refactor checks class. Move some checks to mjwshared. Requires min mjwshared 1.1

parent 5e62cc68
No related branches found
No related tags found
1 merge request!176Release 6.7
...@@ -25,77 +25,105 @@ class CRM_Stripe_Check { ...@@ -25,77 +25,105 @@ class CRM_Stripe_Check {
/** /**
* @var string * @var string
*/ */
const MIN_VERSION_MJWSHARED = '1.0'; const MIN_VERSION_MJWSHARED = '1.1';
const MIN_VERSION_SWEETALERT = '1.5';
const MIN_VERSION_FIREWALL = '1.2.1'; const MIN_VERSION_FIREWALL = '1.2.1';
public static function checkRequirements(&$messages) { /**
self::checkExtensionMjwshared($messages); * @var array
self::checkExtensionFirewall($messages); */
self::checkExtensionSweetalert($messages); private $messages;
self::checkIfSeparateMembershipPaymentEnabled($messages);
self::checkUpgradeMessages($messages);
}
/** /**
* @param array $messages * CRM_Stripe_Check constructor.
* *
* @param $messages
*/
public function __construct($messages) {
$this->messages = $messages;
}
/**
* @return array
* @throws \CiviCRM_API3_Exception * @throws \CiviCRM_API3_Exception
*/ */
private static function checkExtensionMjwshared(&$messages) { public function checkRequirements() {
// mjwshared: required. Requires min version $this->checkExtensionMjwshared();
$extensionName = 'mjwshared'; $this->checkExtensionFirewall();
$extensions = civicrm_api3('Extension', 'get', [ $this->checkUpgradeMessages();
'full_name' => $extensionName, 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( $message = new CRM_Utils_Check_Message(
__FUNCTION__ . E::SHORT_NAME . '_requirements', __FUNCTION__ . $extensionName . E::SHORT_NAME . '_requirements_dev',
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.', E::ts('You are using a development version of %1 extension.',
[ [
1 => ucfirst(E::SHORT_NAME), 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)]), E::ts('%1: Missing Requirements', [1 => ucfirst(E::SHORT_NAME)]),
\Psr\Log\LogLevel::ERROR, \Psr\Log\LogLevel::ERROR,
'fa-money' 'fa-exclamation-triangle'
); );
$message->addAction( $message->addAction(
E::ts('Install now'), E::ts('Upgrade now'),
NULL, NULL,
'href', 'href',
['path' => 'civicrm/admin/extensions', 'query' => ['action' => 'update', 'id' => $extensionName, 'key' => $extensionName]] ['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, self::MIN_VERSION_MJWSHARED, $extensions['values'][$extensions['id']]['version']);
} }
} }
/** /**
* @param array $messages
*
* @throws \CiviCRM_API3_Exception * @throws \CiviCRM_API3_Exception
*/ */
private static function checkExtensionFirewall(&$messages) { private function checkExtensionMjwshared() {
$extensionName = 'firewall'; // mjwshared: required. Requires min version
$extensionName = 'mjwshared';
$extensions = civicrm_api3('Extension', 'get', [ $extensions = civicrm_api3('Extension', 'get', [
'full_name' => $extensionName, 'full_name' => $extensionName,
]); ]);
if (empty($extensions['count']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) { if (empty($extensions['count']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) {
$message = new CRM_Utils_Check_Message( $message = new CRM_Utils_Check_Message(
__FUNCTION__ . 'stripe_recommended', __FUNCTION__ . E::SHORT_NAME . '_requirements',
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. 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.',
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'), 1 => ucfirst(E::SHORT_NAME),
\Psr\Log\LogLevel::NOTICE, 2 => 'https://civicrm.org/extensions/mjwshared',
'fa-lightbulb-o' ]
),
E::ts('%1: Missing Requirements', [1 => ucfirst(E::SHORT_NAME)]),
\Psr\Log\LogLevel::ERROR,
'fa-money'
); );
$message->addAction( $message->addAction(
E::ts('Install now'), E::ts('Install now'),
...@@ -103,21 +131,20 @@ class CRM_Stripe_Check { ...@@ -103,21 +131,20 @@ class CRM_Stripe_Check {
'href', 'href',
['path' => 'civicrm/admin/extensions', 'query' => ['action' => 'update', 'id' => $extensionName, 'key' => $extensionName]] ['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') { 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 * @throws \CiviCRM_API3_Exception
*/ */
private static function checkExtensionSweetalert(&$messages) { private function checkExtensionFirewall() {
// sweetalert: recommended. If installed requires min version $extensionName = 'firewall';
$extensionName = 'sweetalert';
$extensions = civicrm_api3('Extension', 'get', [ $extensions = civicrm_api3('Extension', 'get', [
'full_name' => $extensionName, 'full_name' => $extensionName,
]); ]);
...@@ -125,11 +152,9 @@ class CRM_Stripe_Check { ...@@ -125,11 +152,9 @@ class CRM_Stripe_Check {
if (empty($extensions['count']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) { if (empty($extensions['count']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) {
$message = new CRM_Utils_Check_Message( $message = new CRM_Utils_Check_Message(
__FUNCTION__ . 'stripe_recommended', __FUNCTION__ . 'stripe_recommended',
E::ts('It is recommended that you install the <strong><a href="https://civicrm.org/extensions/sweetalert">sweetalert</a></strong> extension. 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.
This allows the stripe extension to show useful messages to the user when processing payment. 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.'),
If this is not installed it will fallback to the browser "alert" message but you will E::ts('Recommended Extension: firewall'),
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'),
\Psr\Log\LogLevel::NOTICE, \Psr\Log\LogLevel::NOTICE,
'fa-lightbulb-o' 'fa-lightbulb-o'
); );
...@@ -139,96 +164,10 @@ class CRM_Stripe_Check { ...@@ -139,96 +164,10 @@ class CRM_Stripe_Check {
'href', 'href',
['path' => 'civicrm/admin/extensions', 'query' => ['action' => 'update', 'id' => $extensionName, 'key' => $extensionName]] ['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') { 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']); $this->requireExtensionMinVersion($extensionName, CRM_Stripe_Check::MIN_VERSION_FIREWALL, $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;
}
}
}
}
} }
} }
...@@ -237,7 +176,7 @@ class CRM_Stripe_Check { ...@@ -237,7 +176,7 @@ class CRM_Stripe_Check {
* *
* @param array $messages * @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). // @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')) { if ((bool) \Civi::settings()->get('stripe_upgrade66message')) {
$message = new CRM_Utils_Check_Message( $message = new CRM_Utils_Check_Message(
...@@ -263,7 +202,7 @@ class CRM_Stripe_Check { ...@@ -263,7 +202,7 @@ class CRM_Stripe_Check {
'api3', 'api3',
['Setting', 'create', ['stripe_upgrade66message' => 0]] ['Setting', 'create', ['stripe_upgrade66message' => 0]]
); );
$messages[] = $message; $this->messages[] = $message;
} }
} }
......
...@@ -231,7 +231,8 @@ function stripe_civicrm_buildForm($formName, &$form) { ...@@ -231,7 +231,8 @@ function stripe_civicrm_buildForm($formName, &$form) {
* @throws \CiviCRM_API3_Exception * @throws \CiviCRM_API3_Exception
*/ */
function stripe_civicrm_check(&$messages) { 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 we didn't install mjwshared yet check requirements but don't crash when checking webhooks
if (trait_exists('CRM_Mjwshared_WebhookTrait')) { if (trait_exists('CRM_Mjwshared_WebhookTrait')) {
CRM_Stripe_Webhook::check($messages); CRM_Stripe_Webhook::check($messages);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment