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
Branches
Tags
1 merge request!176Release 6.7
......@@ -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;
}
}
......
......@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment