This commit is contained in:
2026-07-02 15:54:39 -06:00
commit 9883323161
17470 changed files with 4470592 additions and 0 deletions
@@ -0,0 +1,174 @@
<?php
namespace Gravity_Forms\Gravity_SMTP\Alerts;
use Gravity_Forms\Gravity_SMTP\Alerts\Connectors\Alert_Connector;
use Gravity_Forms\Gravity_SMTP\Alerts\Connectors\Slack_Alert_Connector;
use Gravity_Forms\Gravity_SMTP\Alerts\Connectors\Twilio_Alert_Connector;
use Gravity_Forms\Gravity_SMTP\Alerts\Endpoints\Save_Alerts_Settings_Endpoint;
use Gravity_Forms\Gravity_SMTP\Connectors\Endpoints\Save_Plugin_Settings_Endpoint;
use Gravity_Forms\Gravity_SMTP\Data_Store\Data_Store_Router;
use Gravity_Forms\Gravity_SMTP\Models\Event_Model;
use Gravity_Forms\Gravity_SMTP\Utils\Booliesh;
class Alerts_Handler {
const ALERTS_DATA_TRANSIENT = 'gravitysmtp_alerts_data';
/**
* @var Event_Model
*/
protected $events;
/**
* @var Data_Store_Router
*/
protected $plugin_data;
/**
* @var Alert_Connector[]
*/
protected $connectors;
public function __construct( $events, $plugin_data, $connectors ) {
$this->events = $events;
$this->plugin_data = $plugin_data;
$this->connectors = $connectors;
}
protected function default_settings() {
return array(
Save_Alerts_Settings_Endpoint::PARAM_NOTIFY_WHEN_EMAIL_FAILS => false,
Save_Alerts_Settings_Endpoint::PARAM_SLACK_ALERTS_ENABLED => false,
Save_Alerts_Settings_Endpoint::PARAM_SLACK_ALERTS => array(),
Save_Alerts_Settings_Endpoint::PARAM_TWILIO_ALERTS_ENABLED => false,
Save_Alerts_Settings_Endpoint::PARAM_TWILIO_ALERTS => array(),
Save_Alerts_Settings_Endpoint::PARAM_ALERT_THRESHOLD_COUNT => 5,
Save_Alerts_Settings_Endpoint::PARAM_ALERT_THRESHOLD_INTERVAL => 5,
);
}
public function record_failed_email() {
$current_data = get_transient( self::ALERTS_DATA_TRANSIENT );
$alert_count_interval = $this->plugin_data->get_plugin_setting( Save_Alerts_Settings_Endpoint::PARAM_ALERT_THRESHOLD_INTERVAL, 5 );
if ( $current_data !== false ) {
$current_data['count'] += 1;
$created_at = new \DateTime( date( 'Y-m-d H:i:s', $current_data['created_at'] ) );
$now = new \DateTime();
$interval = $now->diff( $created_at );
$seconds_diff = (int) $interval->format( '%i' ) * 60 + ( (int) $interval->format( '%s' ) );
$new_exp = ( MINUTE_IN_SECONDS * ( $alert_count_interval + 2 ) ) - $seconds_diff;
set_transient( self::ALERTS_DATA_TRANSIENT, $current_data, $new_exp );
return;
}
$current_data = array(
'count' => 1,
'created_at' => time(),
);
set_transient( self::ALERTS_DATA_TRANSIENT, $current_data, MINUTE_IN_SECONDS * ( $alert_count_interval + 2 ) );
}
public function failed_emails_alert() {
$alerts_settings = $this->plugin_data->get_plugin_setting( Save_Alerts_Settings_Endpoint::PARAM_SETTINGS, $this->default_settings() );
$logging_enabled = $this->plugin_data->get_plugin_setting( Save_Plugin_Settings_Endpoint::PARAM_EVENT_LOG_ENABLED, false );
$send_on_fail_enabled = Booliesh::get( $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_NOTIFY_WHEN_EMAIL_FAILS ] );
// This alert trigger is not enabled.
if ( ! $send_on_fail_enabled ) {
return;
}
$count = isset( $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_ALERT_THRESHOLD_COUNT ] ) ? $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_ALERT_THRESHOLD_COUNT ] : 5;
$failures = get_transient( self::ALERTS_DATA_TRANSIENT );
if ( false === $failures ) {
return;
}
if ( $failures['count'] < $count ) {
return;
}
$slack_enabled = Booliesh::get( $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_SLACK_ALERTS_ENABLED ] );
if ( $slack_enabled ) {
$this->send_slack_alerts( $failures['count'], $logging_enabled, $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_SLACK_ALERTS ] );
}
$twilio_enabled = Booliesh::get( $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_TWILIO_ALERTS_ENABLED ] );
if ( $twilio_enabled ) {
$this->send_twilio_alerts( $failures['count'], $logging_enabled, $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_TWILIO_ALERTS ] );
}
delete_transient( self::ALERTS_DATA_TRANSIENT );
}
private function failed_email_message( $count, $logging_enabled ) {
$base_url = admin_url( 'admin.php' );
if ( $logging_enabled ) {
$url = add_query_arg( array(
'page' => 'gravitysmtp-activity-log',
), $base_url );
} else {
$url = add_query_arg( array(
'page' => 'gravitysmtp-dashboard',
), $base_url );
}
return esc_html__( sprintf( 'Your site %s has experienced %d email send failures. For more details visit %s', get_bloginfo( 'name' ), $count, $url ) );
}
private function send_slack_alerts( $count, $logging_enabled, $alerts ) {
if ( empty( $alerts ) ) {
return;
}
/**
* @var Slack_Alert_Connector $slack_connector
*/
$slack_connector = $this->connectors['slack'];
$message = $this->failed_email_message( $count, $logging_enabled );
foreach ( $alerts as $alert ) {
$args = array(
'webhook_url' => $alert['slack_webhook_url'],
'message' => $message
);
$slack_connector->send( $args );
}
}
private function send_twilio_alerts( $count, $logging_enabled, $alerts ) {
if ( empty( $alerts ) ) {
return;
}
/**
* @var Twilio_Alert_Connector $twilio_connector
*/
$twilio_connector = $this->connectors['twilio'];
$message = $this->failed_email_message( $count, $logging_enabled );
foreach ( $alerts as $alert ) {
$args = array(
'account_id' => $alert['twilio_account_id'],
'auth_token' => $alert['twilio_auth_token'],
'to' => $alert['twilio_to_phone_number'],
'from' => $alert['twilio_from_phone_number'],
'message' => $message,
);
$twilio_connector->send( $args );
}
}
}
@@ -0,0 +1,99 @@
<?php
namespace Gravity_Forms\Gravity_SMTP\Alerts;
use Gravity_Forms\Gravity_SMTP\Alerts\Config\Alerts_Config;
use Gravity_Forms\Gravity_SMTP\Alerts\Config\Alerts_Endpoints_Config;
use Gravity_Forms\Gravity_SMTP\Alerts\Connectors\Slack_Alert_Connector;
use Gravity_Forms\Gravity_SMTP\Alerts\Connectors\Twilio_Alert_Connector;
use Gravity_Forms\Gravity_SMTP\Alerts\Endpoints\Save_Alerts_Settings_Endpoint;
use Gravity_Forms\Gravity_SMTP\Alerts\Endpoints\Send_Test_Alert_Endpoint;
use Gravity_Forms\Gravity_SMTP\Connectors\Connector_Service_Provider;
use Gravity_Forms\Gravity_SMTP\Logging\Logging_Service_Provider;
use Gravity_Forms\Gravity_Tools\Providers\Config_Service_Provider;
use Gravity_Forms\Gravity_Tools\Service_Container;
class Alerts_Service_Provider extends Config_Service_Provider {
const FAILED_EMAILS_ALERT_ACTION_NAME = 'failed_emails_alert_action';
const ALERTS_CONFIG = 'alerts_config';
const ALERTS_ENDPOINTS_CONFIG = 'alerts_endpoints_config';
const TWILIO_ALERT_CONNECTOR = 'twilio_alert_connector';
const SLACK_ALERT_CONNECTOR = 'slack_alert_connector';
const SAVE_ALERTS_SETTINGS_ENDPOINT = 'save_alerts_settings_endpoint';
const ALERTS_HANDLER = 'alerts_handler';
const SEND_TEST_ALERT_ENDPOINT = 'send_test_alert_endpoint';
protected $configs = array(
self::ALERTS_CONFIG => Alerts_Config::class,
self::ALERTS_ENDPOINTS_CONFIG => Alerts_Endpoints_Config::class
);
public function register( Service_Container $container ) {
parent::register( $container );
$container->add( self::TWILIO_ALERT_CONNECTOR, function () use ( $container ) {
$debug_logger = $container->get( Logging_Service_Provider::DEBUG_LOGGER );
return new Twilio_Alert_Connector( $debug_logger );
} );
$container->add( self::SLACK_ALERT_CONNECTOR, function () use ( $container ) {
$debug_logger = $container->get( Logging_Service_Provider::DEBUG_LOGGER );
return new Slack_Alert_Connector( $debug_logger );
} );
$container->add( self::SAVE_ALERTS_SETTINGS_ENDPOINT, function () use ( $container ) {
$plugin_data_store = $container->get( Connector_Service_Provider::DATA_STORE_PLUGIN_OPTS );
return new Save_Alerts_Settings_Endpoint( $plugin_data_store );
} );
$container->add( self::SEND_TEST_ALERT_ENDPOINT, function () use ( $container ) {
$connectors = array(
'slack' => $container->get( self::SLACK_ALERT_CONNECTOR ),
'twilio' => $container->get( self::TWILIO_ALERT_CONNECTOR ),
);
return new Send_Test_Alert_Endpoint( $connectors );
} );
$container->add( self::ALERTS_HANDLER, function () use ( $container ) {
$connectors = array(
'slack' => $container->get( self::SLACK_ALERT_CONNECTOR ),
'twilio' => $container->get( self::TWILIO_ALERT_CONNECTOR ),
);
$data_store = $container->get( Connector_Service_Provider::DATA_STORE_ROUTER );
$event_model = $container->get( Connector_Service_Provider::EVENT_MODEL );
return new Alerts_Handler( $event_model, $data_store, $connectors );
} );
}
public function init( \Gravity_Forms\Gravity_Tools\Service_Container $container ) {
add_action( 'wp_ajax_' . Save_Alerts_Settings_Endpoint::ACTION_NAME, function () use ( $container ) {
$container->get( self::SAVE_ALERTS_SETTINGS_ENDPOINT )->handle();
} );
add_action( 'wp_ajax_' . Send_Test_Alert_Endpoint::ACTION_NAME, function () use ( $container ) {
$container->get( self::SEND_TEST_ALERT_ENDPOINT )->handle();
} );
if ( ! wp_next_scheduled( self::FAILED_EMAILS_ALERT_ACTION_NAME ) ) {
wp_schedule_event( time(), 'every-minute', self::FAILED_EMAILS_ALERT_ACTION_NAME );
}
add_action( 'gravitysmtp_on_send_failure', function ( $email_id ) use ( $container ) {
$container->get( self::ALERTS_HANDLER )->record_failed_email();
} );
add_action( self::FAILED_EMAILS_ALERT_ACTION_NAME, function () use ( $container ) {
$container->get( self::ALERTS_HANDLER )->failed_emails_alert();
} );
}
}
@@ -0,0 +1,264 @@
<?php
namespace Gravity_Forms\Gravity_SMTP\Alerts\Config;
use Gravity_Forms\Gravity_SMTP\Alerts\Endpoints\Save_Alerts_Settings_Endpoint;
use Gravity_Forms\Gravity_SMTP\Apps\Endpoints\Get_Dashboard_Data_Endpoint;
use Gravity_Forms\Gravity_SMTP\Connectors\Connector_Service_Provider;
use Gravity_Forms\Gravity_SMTP\Connectors\Endpoints\Save_Plugin_Settings_Endpoint;
use Gravity_Forms\Gravity_SMTP\Gravity_SMTP;
use Gravity_Forms\Gravity_SMTP\Utils\Booliesh;
use Gravity_Forms\Gravity_Tools\Config;
class Alerts_Config extends Config {
const SETTING_SEND_ON_FAIL = 'send_on_fail';
const SETTING_ENABLE_SLACK_ALERTS = 'enable_slack_alerts';
const SETTING_ENABLE_TWILIO_ALERTS = 'enable_twilio_alerts';
const SETTING_SLACK_ALERTS = 'slack_alerts';
const SETTING_SLACK_WEBHOOK_URL = 'slack_webhook_url';
const SETTING_TWILIO_ALERTS = 'twilio_alerts';
const SETTING_TWILIO_ACCOUNT_ID = 'twilio_account_id';
const SETTING_TWILIO_ACCOUNT_NAME = 'twilio_account_name';
const SETTING_TWILIO_AUTH_TOKEN = 'twilio_auth_token';
const SETTING_TWILIO_FROM_PHONE_NUMBER = 'twilio_from_phone_number';
const SETTING_TWILIO_TO_PHONE_NUMBER = 'twilio_to_phone_number';
protected $script_to_localize = 'gravitysmtp_scripts_admin';
protected $name = 'gravitysmtp_admin_config';
protected $overwrite = false;
public function should_enqueue() {
if ( ! is_admin() ) {
return false;
}
$page = filter_input( INPUT_GET, 'page' );
if ( ! is_string( $page ) ) {
return false;
}
$page = htmlspecialchars( $page );
if ( $page !== 'gravitysmtp-settings' ) {
return false;
}
return true;
}
public function data() {
return array(
'components' => array(
'settings' => array(
'i18n' => $this->i18n_values(),
'data' => $this->data_values(),
),
)
);
}
protected function i18n_values() {
return array(
'alerts' => array(
'top_heading' => esc_html__( 'Alerts', 'gravitysmtp' ),
'top_content' => __( "Use these settings to configure alerts for failed email sending attempts. Set up notifications through Webhooks or SMS (via Twilio) to ensure you're informed when an email fails to send. Multiple integrations can be added and managed.", 'gravitysmtp' ),
'alerts_box_heading' => esc_html__( 'Alerts Settings', 'gravitysmtp' ),
'notify_heading' => esc_html__( 'When to Notify', 'gravitysmtp' ),
'email_request_fails_label' => esc_html__( 'Email send request fails', 'gravitysmtp' ),
'email_request_fails_help_text' => esc_html__( 'Enable this option send an alert when an email send attempt fails for any reason.', 'gravitysmtp' ),
'alert_threshold_count_label' => esc_html__( 'Failure Amount', 'gravitysmtp' ),
'alert_threshold_count_help_text' => esc_html__( 'The number of failures to trigger an alert.', 'gravitysmtp' ),
'alert_threshold_interval_label' => esc_html__( 'Alert Rate', 'gravitysmtp' ),
'alert_threshold_interval_help_text' => esc_html__( 'Interval for sending alerts about failures (in minutes).', 'gravitysmtp' ),
'slack_heading' => esc_html__( 'Webhooks', 'gravitysmtp' ),
'slack_alerts_label' => esc_html__( 'Webhook Alerts', 'gravitysmtp' ),
'slack_alerts_help_text' => esc_html__( "Get notified via webhook or SMS (Twilio) when emails fail to send. Webhooks can be used with services like Slack, Zapier, and more.", 'gravitysmtp' ),
'slack_webhook_add_button_label' => esc_html__( 'Add Webhook', 'gravitysmtp' ),
'slack_webhook_delete_button_label' => esc_html__( 'Delete', 'gravitysmtp' ),
'start_sending_test_alert' => esc_html__( 'Sending a test alert from the alerts settings page.', 'gravitysmtp' ),
'snackbar_test_alert_success' => esc_html__( 'Alert successfully configured!', 'gravitysmtp' ),
'snackbar_test_alert_error' => esc_html__( 'Could not send alert. Check Debug Log for details.', 'gravitysmtp' ),
'twilio_heading' => esc_html__( 'Twilio', 'gravitysmtp' ),
'twilio_alerts_block_heading' => esc_html__( 'Twilio Account: %s', 'gravitysmtp' ),
'twilio_alerts_label' => esc_html__( 'SMS via Twilio Alerts', 'gravitysmtp' ),
'twilio_alerts_help_text' => __( "Enter the Twilio account you'd like to use to send alerts when email sending fails.", 'gravitysmtp' ),
'twilio_account_add_button_label' => esc_html__( 'Add Another Account', 'gravitysmtp' ),
'twilio_account_delete_button_label' => esc_html__( 'Delete', 'gravitysmtp' ),
'save_settings_button_label' => esc_html__( 'Save Settings', 'gravitysmtp' ),
'drag_button_label' => esc_html__( 'Click to toggle drag and drop.', 'gravitysmtp' ),
'begin_drag_notice' => __( 'Entering drag and drop for item %1$s.', 'gravitysmtp' ),
'end_drag_notice' => __( 'Exiting drag and drop for item %1$s.', 'gravitysmtp' ),
'end_drop_notice' => __( 'Item %1$s moved to position %2$s.', 'gravitysmtp' ),
'move_item_notice' => __( 'Moving item %1$s to position %2$s.', 'gravitysmtp' ),
)
);
}
private function empty_twilio_item() {
return array(
'repeater_item_block_content_title' => esc_html__( 'Twilio Account:', 'gravitysmtp' ),
'repeater_item_collapsed' => false,
'repeater_item_id' => 'repeater-twilio-alerts-0',
'twilio_account_name' => '',
'twilio_account_id' => '',
'twilio_auth_token' => '',
'twilio_from_phone_number' => '',
'twilio_to_phone_number' => '',
);
}
private function empty_slack_item() {
return array(
'repeater_item_id' => 'repeater-slack-alerts-0',
'slack_webhook_url' => '',
);
}
private function default_setting_values() {
return array(
Save_Alerts_Settings_Endpoint::PARAM_NOTIFY_WHEN_EMAIL_FAILS => false,
Save_Alerts_Settings_Endpoint::PARAM_SLACK_ALERTS_ENABLED => false,
Save_Alerts_Settings_Endpoint::PARAM_SLACK_ALERTS => array(),
Save_Alerts_Settings_Endpoint::PARAM_TWILIO_ALERTS_ENABLED => false,
Save_Alerts_Settings_Endpoint::PARAM_TWILIO_ALERTS => array(),
Save_Alerts_Settings_Endpoint::PARAM_ALERT_THRESHOLD_COUNT => 5,
Save_Alerts_Settings_Endpoint::PARAM_ALERT_THRESHOLD_INTERVAL => 5,
);
}
protected function data_values() {
$container = Gravity_SMTP::container();
$plugin_data_store = $container->get( Connector_Service_Provider::DATA_STORE_ROUTER );
// todo: not sure these defaults work correctly
$alerts_settings = $plugin_data_store->get_plugin_setting( Save_Alerts_Settings_Endpoint::PARAM_SETTINGS, $this->default_setting_values() );
$notify_when_email_sending_fails_enabled = Booliesh::get( $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_NOTIFY_WHEN_EMAIL_FAILS ] );
$slack_alerts_enabled = Booliesh::get( $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_SLACK_ALERTS_ENABLED ] );
$twilio_alerts_enabled = Booliesh::get( $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_TWILIO_ALERTS_ENABLED ] );
$alert_threshold_count = isset( $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_ALERT_THRESHOLD_COUNT ] ) ? $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_ALERT_THRESHOLD_COUNT ] : 5;
$alert_threshold_interval = isset( $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_ALERT_THRESHOLD_INTERVAL ] ) ? $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_ALERT_THRESHOLD_INTERVAL ] : 5;
$slack_alerts = ! empty( $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_SLACK_ALERTS ] ) ? $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_SLACK_ALERTS ] : array( $this->empty_slack_item() );
$twilio_alerts = ! empty( $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_TWILIO_ALERTS ] ) ? $alerts_settings[ Save_Alerts_Settings_Endpoint::PARAM_TWILIO_ALERTS ] : array( $this->empty_twilio_item() );
// Fix boolean strings
foreach ( $twilio_alerts as $key => $values ) {
$values['repeater_item_collapsed'] = Booliesh::get( $values['repeater_item_collapsed'] );
$twilio_alerts[ $key ] = $values;
}
return array(
'alerts_settings' => array(
'notify_when_email_sending_fails_enabled' => $notify_when_email_sending_fails_enabled,
'slack_alerts_enabled' => $slack_alerts_enabled,
'twilio_alerts_enabled' => $twilio_alerts_enabled,
'alert_threshold_count' => $alert_threshold_count,
'alert_threshold_interval' => $alert_threshold_interval,
self::SETTING_SLACK_ALERTS => array(
'fields' => array(
array(
'component' => 'Input',
'props' => array(
'labelAttributes' => array(
'label' => esc_html__( 'Webhook URL', 'gravitysmtp' ),
'isVisible' => false,
),
'name' => self::SETTING_SLACK_WEBHOOK_URL,
),
),
array(
'component' => 'Button',
'props' => array(
'label' => esc_html__( 'Test Webhook', 'gravitysmtp' ),
'icon' => 'play',
'iconPosition' => 'leading',
'iconPrefix' => 'gravity-admin-icon',
'size' => 'size-height-m',
'type' => 'white',
),
)
),
'items' => $slack_alerts,
'path' => 'gravitysmtp_admin_config.components.settings.data.alerts_settings.' . self::SETTING_SLACK_ALERTS . '.items',
),
self::SETTING_TWILIO_ALERTS => array(
'fields' => array(
array(
'component' => 'Input',
'props' => array(
'labelAttributes' => array(
'label' => esc_html__( 'Account Name', 'gravitysmtp' ),
'size' => 'text-sm',
'weight' => 'medium',
),
'name' => self::SETTING_TWILIO_ACCOUNT_NAME,
),
),
array(
'component' => 'Input',
'props' => array(
'labelAttributes' => array(
'label' => esc_html__( 'Twilio Account SID', 'gravitysmtp' ),
'size' => 'text-sm',
'weight' => 'medium',
),
'name' => self::SETTING_TWILIO_ACCOUNT_ID,
),
),
array(
'component' => 'Input',
'props' => array(
'labelAttributes' => array(
'label' => esc_html__( 'Twilio Auth Token', 'gravitysmtp' ),
'size' => 'text-sm',
'weight' => 'medium',
),
'name' => self::SETTING_TWILIO_AUTH_TOKEN,
),
),
array(
'component' => 'Input',
'props' => array(
'labelAttributes' => array(
'label' => esc_html__( 'From Phone Number', 'gravitysmtp' ),
'size' => 'text-sm',
'weight' => 'medium',
),
'name' => self::SETTING_TWILIO_FROM_PHONE_NUMBER,
),
),
array(
'component' => 'Input',
'props' => array(
'labelAttributes' => array(
'label' => esc_html__( 'To Phone Number', 'gravitysmtp' ),
'size' => 'text-sm',
'weight' => 'medium',
),
'name' => self::SETTING_TWILIO_TO_PHONE_NUMBER,
),
),
array(
'component' => 'Button',
'props' => array(
'customClasses' => [ 'gravitysmtp-alerts-settings__twilio-test-connection' ],
'label' => esc_html__( 'Test Connection', 'gravitysmtp' ),
'icon' => 'play',
'iconPosition' => 'leading',
'iconPrefix' => 'gravity-admin-icon',
'size' => 'size-height-m',
'type' => 'white',
),
),
),
'items' => $twilio_alerts,
'path' => 'gravitysmtp_admin_config.components.settings.data.alerts_settings.' . self::SETTING_TWILIO_ALERTS . '.items',
),
),
);
}
}
@@ -0,0 +1,47 @@
<?php
namespace Gravity_Forms\Gravity_SMTP\Alerts\Config;
use Gravity_Forms\Gravity_SMTP\Alerts\Endpoints\Save_Alerts_Settings_Endpoint;
use Gravity_Forms\Gravity_SMTP\Alerts\Endpoints\Send_Test_Alert_Endpoint;
use Gravity_Forms\Gravity_Tools\Config;
class Alerts_Endpoints_Config extends Config {
protected $script_to_localize = 'gravitysmtp_scripts_admin';
protected $name = 'gravitysmtp_admin_config';
public function should_enqueue() {
return is_admin();
}
public function data() {
return array(
'common' => array(
'endpoints' => array(
Save_Alerts_Settings_Endpoint::ACTION_NAME => array(
'action' => array(
'value' => Save_Alerts_Settings_Endpoint::ACTION_NAME,
'default' => 'mock_endpoint',
),
'nonce' => array(
'value' => wp_create_nonce( Save_Alerts_Settings_Endpoint::ACTION_NAME ),
'default' => 'nonce',
),
),
Send_Test_Alert_Endpoint::ACTION_NAME => array(
'action' => array(
'value' => Send_Test_Alert_Endpoint::ACTION_NAME,
'default' => 'mock_endpoint',
),
'nonce' => array(
'value' => wp_create_nonce( Send_Test_Alert_Endpoint::ACTION_NAME ),
'default' => 'nonce',
),
),
),
),
);
}
}
@@ -0,0 +1,62 @@
<?php
namespace Gravity_Forms\Gravity_SMTP\Alerts\Connectors;
use Gravity_Forms\Gravity_SMTP\Logging\Debug\Debug_Logger;
class Slack_Alert_Connector implements Alert_Connector {
/**
* @var Debug_Logger
*/
private $debug_logger;
public function __construct( Debug_Logger $debug_logger ) {
$this->debug_logger = $debug_logger;
}
public function send( $send_args ) {
$webhook_url = $send_args['webhook_url'];
$message = $send_args['message'];
$request_body = array(
'text' => $message,
);
$request_body = apply_filters( 'gravitysmtp_slack_alert_request_body', $request_body, $send_args );
$this->debug_logger->log_debug( __METHOD__ . '(): About to make request to a webhook url with the following request args: ' . json_encode( $request_body ) );
$request_params = array(
'body' => json_encode( $request_body ),
'headers' => array(
'Content-Type' => 'application/json',
),
);
$request = $this->make_request( $webhook_url, $request_params );
if ( is_wp_error( $request ) ) {
$this->debug_logger->log_error( __METHOD__ . '(): Request to Webhook URL failed. Details: ' . $request->get_error_message() );
return false;
}
$this->debug_logger->log_debug( __METHOD__ . '(): Request to Webhook URL succeeded.' );
return true;
}
public function make_request( $url, $request_args ) {
$request = wp_safe_remote_post( $url, $request_args );
$code = wp_remote_retrieve_response_code( $request );
if ( (int) $code !== 200 ) {
$this->debug_logger->log_error( wp_remote_retrieve_body( $request ) );
return new \WP_Error( 'Could not send message via Slack.' );
}
return true;
}
}
@@ -0,0 +1,80 @@
<?php
namespace Gravity_Forms\Gravity_SMTP\Alerts\Connectors;
use Gravity_Forms\Gravity_SMTP\Logging\Debug\Debug_Logger;
class Twilio_Alert_Connector implements Alert_Connector {
const BASE_URL = 'https://api.twilio.com/2010-04-01/Accounts';
/**
* @var Debug_Logger
*/
private $debug_logger;
public function __construct( Debug_Logger $debug_logger ) {
$this->debug_logger = $debug_logger;
}
public function send( $send_args ) {
$account_id = $send_args['account_id'];
$auth_token = $send_args['auth_token'];
$to = $send_args['to'];
$from = $send_args['from'];
$message = $send_args['message'];
$request_body = array(
'ApplicationSid' => $account_id,
'Body' => $message,
'To' => $to,
'From' => $from,
);
$request_body = apply_filters( 'gravitysmtp_twilio_alert_request_body', $request_body, $send_args );
$request_headers = array(
'Authorization' => $this->get_auth_header( $account_id, $auth_token ),
);
$this->debug_logger->log_debug( __METHOD__ . '(): About to make request to Twilio with the following request args: ' . json_encode( $request_body ) );
$request_params = array(
'body' => $request_body,
'headers' => $request_headers,
);
$request = $this->make_request( $this->get_request_url( $account_id ), $request_params );
if ( is_wp_error( $request ) ) {
$this->debug_logger->log_error( __METHOD__ . '(): Request to Twilio failed. Details: ' . $request->get_error_message() );
return false;
}
$this->debug_logger->log_debug( __METHOD__ . '(): Request to Twilio succeeded.' );
return true;
}
public function make_request( $url, $request_args ) {
$request = wp_remote_post( $url, $request_args );
$code = wp_remote_retrieve_response_code( $request );
if ( (int) $code !== 201 ) {
$this->debug_logger->log_error( wp_remote_retrieve_body( $request ) );
return new \WP_Error( 'Could not send message via Twilio.' );
}
return true;
}
private function get_request_url( $account_id ) {
return sprintf( '%s/%s/Messages.json', self::BASE_URL, $account_id );
}
private function get_auth_header( $account_id, $auth_token ) {
return 'Basic ' . base64_encode( sprintf( '%s:%s', $account_id, $auth_token ) );
}
}
@@ -0,0 +1,11 @@
<?php
namespace Gravity_Forms\Gravity_SMTP\Alerts\Connectors;
interface Alert_Connector {
public function send( $send_args );
public function make_request( $url, $request_args );
}
@@ -0,0 +1,57 @@
<?php
namespace Gravity_Forms\Gravity_SMTP\Alerts\Endpoints;
use Gravity_Forms\Gravity_SMTP\Data_Store\Plugin_Opts_Data_Store;
use Gravity_Forms\Gravity_SMTP\Users\Roles;
use Gravity_Forms\Gravity_Tools\Endpoints\Endpoint;
class Save_Alerts_Settings_Endpoint extends Endpoint {
const PARAM_SETTINGS = 'alerts_settings';
const PARAM_ALERT_THRESHOLD_COUNT = 'alert_threshold_count';
const PARAM_ALERT_THRESHOLD_INTERVAL = 'alert_threshold_interval';
const PARAM_NOTIFY_WHEN_EMAIL_FAILS = 'notify_when_email_sending_fails_enabled';
const PARAM_SLACK_ALERTS_ENABLED = 'slack_alerts_enabled';
const PARAM_SLACK_ALERTS = 'slack_alerts';
const PARAM_TWILIO_ALERTS_ENABLED = 'twilio_alerts_enabled';
const PARAM_TWILIO_ALERTS = 'twilio_alerts';
const ACTION_NAME = 'save_alerts_settings';
protected $minimum_cap = Roles::EDIT_ALERTS;
/**
* @var Plugin_Opts_Data_Store
*/
protected $plugin_data_store;
protected $required_params = array(
self::PARAM_SETTINGS,
);
public function __construct( $plugin_data_store ) {
$this->plugin_data_store = $plugin_data_store;
}
protected function get_nonce_name() {
return self::ACTION_NAME;
}
public function handle() {
if ( ! $this->validate() ) {
wp_send_json_error( __( 'Missing required parameters.', 'gravitysmtp' ), 400 );
}
$settings = filter_input( INPUT_POST, self::PARAM_SETTINGS, FILTER_DEFAULT, FILTER_REQUIRE_ARRAY );
$this->plugin_data_store->save( self::PARAM_SETTINGS, $settings );
wp_send_json_success( $settings );
}
}
@@ -0,0 +1,94 @@
<?php
namespace Gravity_Forms\Gravity_SMTP\Alerts\Endpoints;
use Gravity_Forms\Gravity_SMTP\Alerts\Connectors\Alert_Connector;
use Gravity_Forms\Gravity_SMTP\Users\Roles;
use Gravity_Forms\Gravity_Tools\Endpoints\Endpoint;
class Send_Test_Alert_Endpoint extends Endpoint {
const PARAM_DATA = 'data';
const PARAM_DATA_TYPE = 'type';
const PARAM_DATA_SETTINGS = 'settings';
const ACTION_NAME = 'send_test_alert';
protected $minimum_cap = Roles::VIEW_TOOLS_SENDATEST;
/**
* @var Alert_Connector[]
*/
protected $connectors;
protected $required_params = array(
self::PARAM_DATA,
);
public function __construct( $connectors ) {
$this->connectors = $connectors;
}
protected function get_nonce_name() {
return self::ACTION_NAME;
}
public function handle() {
if ( ! $this->validate() ) {
wp_send_json_error( __( 'Missing required parameters.', 'gravitysmtp' ), 400 );
}
$data = filter_input( INPUT_POST, self::PARAM_DATA, FILTER_DEFAULT, FILTER_REQUIRE_ARRAY );
if ( empty( $data[ self::PARAM_DATA_TYPE ] ) ) {
wp_send_json_error( __( 'Data array parameter must contain a type key.', 'gravitysmtp' ), 400 );
}
$type = $data[ self::PARAM_DATA_TYPE ];
if ( empty( $this->connectors[ $type ] ) ) {
wp_send_json_error( __( 'Invalid connector type of ' . $type . ' provided.', 'gravitysmtp' ), 400 );
}
/**
* @var Alert_Connector $connector
*/
$connector = $this->connectors[ $type ];
$settings = $data[ self::PARAM_DATA_SETTINGS ];
switch ( $type ) {
case 'slack':
default:
if ( empty( $settings['slack_webhook_url'] ) ) {
wp_send_json_error( __( 'Slack connector requires a webhook_url.', 'gravitysmtp' ), 400 );
}
$args = array(
'webhook_url' => $settings['slack_webhook_url'],
'message' => __( 'Gravity SMTP Test: Webhook is working!', 'gravitysmtp' ),
);
break;
case 'twilio':
if ( empty( $settings['twilio_account_id'] ) || empty( $settings['twilio_auth_token'] ) || empty( $settings['twilio_to_phone_number'] ) || empty( $settings['twilio_from_phone_number'] ) ) {
wp_send_json_error( __( 'Twilio connector requires a twilio_account_id, twilio_auth_token, twilio_to_phone_number, and twilio_from_phone_number.', 'gravitysmtp' ), 400 );
}
$args = array(
'account_id' => $settings['twilio_account_id'],
'auth_token' => $settings['twilio_auth_token'],
'to' => $settings['twilio_to_phone_number'],
'from' => $settings['twilio_from_phone_number'],
'message' => __( 'Gravity SMTP Test: Twilio is set up!', 'gravitysmtp' ),
);
break;
}
$sent = $connector->send( $args );
if ( ! $sent ) {
wp_send_json_error( __( 'Could not send alert. Check Debug Log for details.', 'gravitysmtp' ), 500 );
}
wp_send_json_success( __( 'Alert successfully configured!', 'gravitysmtp' ) );
}
}