summaryrefslogtreecommitdiff
path: root/Postman/Postman-Configuration/PostmanConfigurationController.php
diff options
context:
space:
mode:
authoryehudah <yehudah@b8457f37-d9ea-0310-8a92-e5e31aec5664>2019-11-25 08:22:35 +0000
committeryehudah <yehudah@b8457f37-d9ea-0310-8a92-e5e31aec5664>2019-11-25 08:22:35 +0000
commitc61784411988d36d9bbd93cd3a97e773990af342 (patch)
tree924e6e9dea2ba7b1eedb14d0c4b03a38aefdf179 /Postman/Postman-Configuration/PostmanConfigurationController.php
parent907ce8c044159ca8da6ccce3ec5362ac61e7c142 (diff)
downloadPost-SMTP-c61784411988d36d9bbd93cd3a97e773990af342.zip
Adding a folder
Diffstat (limited to 'Postman/Postman-Configuration/PostmanConfigurationController.php')
-rw-r--r--Postman/Postman-Configuration/PostmanConfigurationController.php948
1 files changed, 948 insertions, 0 deletions
diff --git a/Postman/Postman-Configuration/PostmanConfigurationController.php b/Postman/Postman-Configuration/PostmanConfigurationController.php
new file mode 100644
index 0000000..59fbdb8
--- /dev/null
+++ b/Postman/Postman-Configuration/PostmanConfigurationController.php
@@ -0,0 +1,948 @@
+<?php
+if ( ! defined( 'ABSPATH' ) ) {
+ exit; // Exit if accessed directly
+}
+
+require_once( 'PostmanRegisterConfigurationSettings.php' );
+class PostmanConfigurationController {
+ const CONFIGURATION_SLUG = 'postman/configuration';
+ const CONFIGURATION_WIZARD_SLUG = 'postman/configuration_wizard';
+
+ // logging
+ private $logger;
+ private $options;
+ private $settingsRegistry;
+
+ // Holds the values to be used in the fields callbacks
+ private $rootPluginFilenameAndPath;
+
+ private $importableConfiguration;
+
+ /**
+ * Constructor
+ *
+ * @param mixed $rootPluginFilenameAndPath
+ */
+ public function __construct( $rootPluginFilenameAndPath ) {
+ assert( ! empty( $rootPluginFilenameAndPath ) );
+ assert( PostmanUtils::isAdmin() );
+ assert( is_admin() );
+
+ $this->logger = new PostmanLogger( get_class( $this ) );
+ $this->rootPluginFilenameAndPath = $rootPluginFilenameAndPath;
+ $this->options = PostmanOptions::getInstance();
+ $this->settingsRegistry = new PostmanSettingsRegistry();
+
+ PostmanUtils::registerAdminMenu( $this, 'addConfigurationSubmenu' );
+ PostmanUtils::registerAdminMenu( $this, 'addSetupWizardSubmenu' );
+
+ // hook on the init event
+ add_action( 'init', array(
+ $this,
+ 'on_init',
+ ) );
+
+ // initialize the scripts, stylesheets and form fields
+ add_action( 'admin_init', array(
+ $this,
+ 'on_admin_init',
+ ) );
+ }
+
+ /**
+ * Functions to execute on the init event
+ *
+ * "Typically used by plugins to initialize. The current user is already authenticated by this time."
+ * ref: http://codex.wordpress.org/Plugin_API/Action_Reference#Actions_Run_During_a_Typical_Request
+ */
+ public function on_init() {
+ // register Ajax handlers
+ new PostmanGetHostnameByEmailAjaxController();
+ new PostmanManageConfigurationAjaxHandler();
+ new PostmanImportConfigurationAjaxController( $this->options );
+ }
+
+ /**
+ * Fires on the admin_init method
+ */
+ public function on_admin_init() {
+ $this->registerStylesAndScripts();
+ $this->settingsRegistry->on_admin_init();
+ }
+
+ /**
+ * Register and add settings
+ */
+ private function registerStylesAndScripts() {
+ if ( $this->logger->isTrace() ) {
+ $this->logger->trace( 'registerStylesAndScripts()' );
+ }
+ // register the stylesheet and javascript external resources
+ $pluginData = apply_filters( 'postman_get_plugin_metadata', null );
+
+ wp_register_script( 'postman_manual_config_script', plugins_url( 'Postman/Postman-Configuration/postman_manual_config.js', $this->rootPluginFilenameAndPath ), array(
+ PostmanViewController::JQUERY_SCRIPT,
+ 'jquery-ui-core',
+ 'jquery-ui-tabs',
+ 'jquery_validation',
+ PostmanViewController::POSTMAN_SCRIPT,
+ ), $pluginData ['version'] );
+
+ wp_register_script( 'postman_wizard_script', plugins_url( 'Postman/Postman-Configuration/postman_wizard.js', $this->rootPluginFilenameAndPath ), array(
+ PostmanViewController::JQUERY_SCRIPT,
+ 'jquery_validation',
+ 'jquery_steps_script',
+ PostmanViewController::POSTMAN_SCRIPT,
+ 'sprintf',
+ ), $pluginData ['version'] );
+ }
+
+ /**
+ */
+ private function addLocalizeScriptsToPage() {
+ $warning = __( 'Warning', 'post-smtp' );
+ /* translators: where %s is the name of the SMTP server */
+ wp_localize_script( 'postman_wizard_script', 'postman_smtp_mitm', sprintf( '%s: %s', $warning, __( 'connected to %1$s instead of %2$s.', 'post-smtp' ) ) );
+ /* translators: where %d is a port number */
+ wp_localize_script( 'postman_wizard_script', 'postman_wizard_bad_redirect_url', __( 'You are about to configure OAuth 2.0 with an IP address instead of a domain name. This is not permitted. Either assign a real domain name to your site or add a fake one in your local host file.', 'post-smtp' ) );
+
+ // user input
+ wp_localize_script( PostmanViewController::POSTMAN_SCRIPT, 'postman_input_sender_email', '#input_' . PostmanOptions::MESSAGE_SENDER_EMAIL );
+ wp_localize_script( PostmanViewController::POSTMAN_SCRIPT, 'postman_input_sender_name', '#input_' . PostmanOptions::MESSAGE_SENDER_NAME );
+ wp_localize_script( PostmanViewController::POSTMAN_SCRIPT, 'postman_port_element_name', '#input_' . PostmanOptions::PORT );
+ wp_localize_script( PostmanViewController::POSTMAN_SCRIPT, 'postman_hostname_element_name', '#input_' . PostmanOptions::HOSTNAME );
+
+ // the enc input
+ wp_localize_script( PostmanViewController::POSTMAN_SCRIPT, 'postman_enc_for_password_el', '#input_enc_type_password' );
+ // these are the ids for the <option>s in the encryption <select>
+ // the password inputs
+ wp_localize_script( PostmanViewController::POSTMAN_SCRIPT, 'postman_input_basic_username', '#input_' . PostmanOptions::BASIC_AUTH_USERNAME );
+ wp_localize_script( PostmanViewController::POSTMAN_SCRIPT, 'postman_input_basic_password', '#input_' . PostmanOptions::BASIC_AUTH_PASSWORD );
+
+ // the auth input
+ wp_localize_script( PostmanViewController::POSTMAN_SCRIPT, 'postman_redirect_url_el', '#input_oauth_redirect_url' );
+ wp_localize_script( PostmanViewController::POSTMAN_SCRIPT, 'postman_input_auth_type', '#input_' . PostmanOptions::AUTHENTICATION_TYPE );
+
+ // the transport modules scripts
+ foreach ( PostmanTransportRegistry::getInstance()->getTransports() as $transport ) {
+ $transport->enqueueScript();
+ }
+
+ // we need data from port test
+ PostmanConnectivityTestController::addLocalizeScriptForPortTest();
+
+ }
+
+ /**
+ * Register the Configuration screen
+ */
+ public function addConfigurationSubmenu() {
+ $page = add_submenu_page( null, sprintf( __( '%s Setup', 'post-smtp' ), __( 'Postman SMTP', 'post-smtp' ) ), __( 'Postman SMTP', 'post-smtp' ), Postman::MANAGE_POSTMAN_CAPABILITY_NAME, PostmanConfigurationController::CONFIGURATION_SLUG, array(
+ $this,
+ 'outputManualConfigurationContent',
+ ) );
+ // When the plugin options page is loaded, also load the stylesheet
+ add_action( 'admin_print_styles-' . $page, array(
+ $this,
+ 'enqueueConfigurationResources',
+ ) );
+ }
+
+ /**
+ */
+ function enqueueConfigurationResources() {
+ $this->addLocalizeScriptsToPage();
+ wp_enqueue_style( PostmanViewController::POSTMAN_STYLE );
+ wp_enqueue_style( 'jquery_ui_style' );
+ wp_enqueue_script( 'postman_manual_config_script' );
+ }
+
+ /**
+ * Register the Setup Wizard screen
+ */
+ public function addSetupWizardSubmenu() {
+ $page = add_submenu_page( null, sprintf( __( '%s Setup', 'post-smtp' ), __( 'Postman SMTP', 'post-smtp' ) ), __( 'Postman SMTP', 'post-smtp' ), Postman::MANAGE_POSTMAN_CAPABILITY_NAME, PostmanConfigurationController::CONFIGURATION_WIZARD_SLUG, array(
+ $this,
+ 'outputWizardContent',
+ ) );
+ // When the plugin options page is loaded, also load the stylesheet
+ add_action( 'admin_print_styles-' . $page, array(
+ $this,
+ 'enqueueWizardResources',
+ ) );
+ }
+
+ /**
+ */
+ function enqueueWizardResources() {
+ $this->addLocalizeScriptsToPage();
+ $this->importableConfiguration = new PostmanImportableConfiguration();
+ $startPage = 1;
+ if ( $this->importableConfiguration->isImportAvailable() ) {
+ $startPage = 0;
+ }
+ wp_localize_script( PostmanViewController::POSTMAN_SCRIPT, 'postman_setup_wizard', array(
+ 'start_page' => $startPage,
+ ) );
+ wp_enqueue_style( 'jquery_steps_style' );
+ wp_enqueue_style( PostmanViewController::POSTMAN_STYLE );
+ wp_enqueue_script( 'postman_wizard_script' );
+ wp_localize_script( PostmanViewController::POSTMAN_SCRIPT, '$jq', 'jQuery.noConflict(true)' );
+ $shortLocale = substr( get_locale(), 0, 2 );
+ if ( $shortLocale != 'en' ) {
+ $url = plugins_url( sprintf( 'script/jquery-validate/localization/messages_%s.js', $shortLocale ), $this->rootPluginFilenameAndPath );
+ wp_enqueue_script( sprintf( 'jquery-validation-locale-%s', $shortLocale ), $url );
+ }
+ }
+
+ /**
+ */
+ public function outputManualConfigurationContent() {
+ print '<div class="wrap">';
+
+ PostmanViewController::outputChildPageHeader( __( 'Settings', 'post-smtp' ), 'advanced_config' );
+ print '<div id="config_tabs"><ul>';
+ print sprintf( '<li><a href="#account_config">%s</a></li>', __( 'Account', 'post-smtp' ) );
+ print sprintf( '<li><a href="#fallback">%s</a></li>', __( 'Fallback', 'post-smtp' ) );
+ print sprintf( '<li><a href="#message_config">%s</a></li>', __( 'Message', 'post-smtp' ) );
+ print sprintf( '<li><a href="#logging_config">%s</a></li>', __( 'Logging', 'post-smtp' ) );
+ print sprintf( '<li><a href="#advanced_options_config">%s</a></li>', __( 'Advanced', 'post-smtp' ) );
+ print sprintf( '<li><a href="#notifications">%s</a></li>', __( 'Notifications', 'post-smtp' ) );
+ print '</ul>';
+
+ print '<form method="post" action="options.php">';
+
+ wp_nonce_field('post-smtp', 'security');
+
+ // This prints out all hidden setting fields
+ settings_fields( PostmanAdminController::SETTINGS_GROUP_NAME );
+
+ // account_config
+ print '<section id="account_config">';
+ if ( sizeof( PostmanTransportRegistry::getInstance()->getTransports() ) > 1 ) {
+ do_settings_sections( 'transport_options' );
+ } else {
+ printf( '<input id="input_%2$s" type="hidden" name="%1$s[%2$s]" value="%3$s"/>', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::TRANSPORT_TYPE, PostmanSmtpModuleTransport::SLUG );
+ }
+ print '<div id="smtp_config" class="transport_setting">';
+ do_settings_sections( PostmanAdminController::SMTP_OPTIONS );
+ print '</div>';
+ print '<div id="password_settings" class="authentication_setting non-oauth2">';
+ do_settings_sections( PostmanAdminController::BASIC_AUTH_OPTIONS );
+ print '</div>';
+ print '<div id="oauth_settings" class="authentication_setting non-basic">';
+ do_settings_sections( PostmanAdminController::OAUTH_AUTH_OPTIONS );
+ print '</div>';
+ print '<div id="mandrill_settings" class="authentication_setting non-basic non-oauth2">';
+ do_settings_sections( PostmanMandrillTransport::MANDRILL_AUTH_OPTIONS );
+ print '</div>';
+ print '<div id="sendgrid_settings" class="authentication_setting non-basic non-oauth2">';
+ do_settings_sections( PostmanSendGridTransport::SENDGRID_AUTH_OPTIONS );
+ print '</div>';
+ print '<div id="mailgun_settings" class="authentication_setting non-basic non-oauth2">';
+ do_settings_sections( PostmanMailgunTransport::MAILGUN_AUTH_OPTIONS );
+ print '</div>';
+
+ do_action( 'post_smtp_settings_sections' );
+
+ print '</section>';
+ // end account config
+ ?>
+
+ <!-- Fallback Start -->
+ <section id="fallback">
+ <h2><?php esc_html_e( 'Failed emails fallback', 'post-smtp' ); ?></h2>
+ <p><?php esc_html_e( 'By enable this option, if your email is fail to send Post SMTP will try to use the SMTP service you define here.', 'post-smtp' ); ?></p>
+ <table class="form-table">
+ <tr valign="">
+ <th scope="row"><?php _e( 'Use Fallback?', 'post-smtp' ); ?></th>
+ <td>
+ <label>
+ <input name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_ENABLED; ?>]" type="radio"
+ value="no"<?php echo checked( $this->options->getFallbackIsEnabled(), 'no' ); ?>>
+ <?php _e( 'No', 'post-smtp' ); ?>
+ </label>
+ &nbsp;
+ <label>
+ <?php $checked = checked( $this->options->getFallbackIsEnabled(), 'yes', false ); ?>
+ <input name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_ENABLED; ?>]" type="radio"
+ value="yes"<?php echo checked( $this->options->getFallbackIsEnabled(), 'yes' ); ?>>
+ <?php _e( 'Yes', 'post-smtp' ); ?>
+ </label>
+ </td>
+ </tr>
+
+ <tr>
+ <th scope="row"><?php _e('Outgoing Mail Server', 'post-smtp' ); ?></th>
+ <?php $host = $this->options->getFallbackHostname(); ?>
+ <td>
+ <input type="text" id="fallback-smtp-host" name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_HOSTNAME; ?>]"
+ value="<?php echo $host; ?>" placeholder="Example: smtp.host.com">
+ </td>
+ </tr>
+
+ <tr>
+ <th scope="row"><?php _e('Mail Server Port', 'post-smtp' ); ?></th>
+ <?php $port = $this->options->getFallbackPort(); ?>
+ <td>
+ <input type="number" id="fallback-smtp-port" name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_PORT; ?>]"
+ value="<?php echo $port; ?>" placeholder="Example: 587">
+ </td>
+ </tr>
+
+ <tr>
+ <th scope="row"><?php _e('Security', 'post-smtp' ); ?></th>
+ <?php
+ $security_options = array(
+ 'none' => __( 'None', 'post-smtp' ),
+ 'ssl' => __( 'SSL', 'post-smtp' ),
+ 'tls' => __( 'TLS', 'post-smtp' ),
+ );
+ ?>
+ <td>
+ <select id="fallback-smtp-security" name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_SECURITY; ?>]">
+ <?php
+ foreach ( $security_options as $key => $label ) {
+ $selected = selected( $this->options->getFallbackSecurity(), $key,false );
+ ?>
+ <option value="<?php echo $key; ?>"<?php echo $selected; ?>><?php echo $label; ?></option>
+ <?php
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <th scope="row"><?php _e('From Email', 'post-smtp' ); ?></th>
+ <td>
+ <input type="email" id="fallback-smtp-from-email"
+ value="<?php echo $this->options->getFallbackFromEmail(); ?>"
+ name="postman_options[<?php echo PostmanOptions::FALLBACK_FROM_EMAIL; ?>]"
+ >
+ <br>
+ <small><?php _e( "Use allowed email, for example: If you are using Gmail, type your Gmail adress.", 'post-smtp' ); ?></small>
+ </td>
+ </tr>
+
+ <tr valign="">
+ <th scope="row"><?php _e( 'Use SMTP Authentication?', 'post-smtp' ); ?></th>
+ <td>
+ <label>
+ <input name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_USE_AUTH; ?>]"
+ type="radio" value="none"<?php checked( $this->options->getFallbackAuth(), 'none' ); ?>>
+ <?php _e( 'No', 'post-smtp' ); ?>
+ </label>
+ &nbsp;
+ <label>
+ <input name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_USE_AUTH; ?>]"
+ type="radio" value="login"<?php checked( $this->options->getFallbackAuth(), 'login' ); ?>>
+ <?php _e( 'Yes', 'post-smtp' ); ?>
+ </label>
+ </td>
+ </tr>
+
+ <tr>
+ <th scope="row"><?php _e('User name', 'post-smtp' ); ?></th>
+ <td>
+ <input type="text" id="fallback-smtp-username"
+ value="<?php echo $this->options->getFallbackUsername(); ?>"
+ name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_USERNAME; ?>]"
+ >
+ </td>
+ </tr>
+
+ <tr>
+ <th scope="row"><?php _e('Password', 'post-smtp' ); ?></th>
+ <td>
+ <input type="password" id="fallback-smtp-password"
+ value="<?php echo PostmanUtils::obfuscatePassword( $this->options->getFallbackPassword() ); ?>"
+ name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_PASSWORD; ?>]"
+ >
+ </td>
+ </tr>
+
+ </table>
+ </section>
+ <!-- Fallback End -->
+
+ <?php
+ print '<section id="message_config">';
+ do_settings_sections( PostmanAdminController::MESSAGE_SENDER_OPTIONS );
+ do_settings_sections( PostmanAdminController::MESSAGE_FROM_OPTIONS );
+ do_settings_sections( PostmanAdminController::EMAIL_VALIDATION_OPTIONS );
+ do_settings_sections( PostmanAdminController::MESSAGE_OPTIONS );
+ do_settings_sections( PostmanAdminController::MESSAGE_HEADERS_OPTIONS );
+ print '</section>';
+ print '<section id="logging_config">';
+ do_settings_sections( PostmanAdminController::LOGGING_OPTIONS );
+ print '</section>';
+ /*
+ * print '<section id="logging_config">';
+ * do_settings_sections ( PostmanAdminController::MULTISITE_OPTIONS );
+ * print '</section>';
+ */
+ print '<section id="advanced_options_config">';
+ do_settings_sections( PostmanAdminController::NETWORK_OPTIONS );
+ do_settings_sections( PostmanAdminController::ADVANCED_OPTIONS );
+ print '</section>';
+
+ print '<section id="notifications">';
+ do_settings_sections( PostmanAdminController::NOTIFICATIONS_OPTIONS );
+
+ $currentKey = $this->options->getNotificationService();
+ $pushover = $currentKey == 'pushover' ? 'block' : 'none';
+ $slack = $currentKey == 'slack' ? 'block' : 'none';
+
+ echo '<div id="pushover_cred" style="display: ' . $pushover . ';">';
+ do_settings_sections( PostmanAdminController::NOTIFICATIONS_PUSHOVER_CRED );
+ echo '</div>';
+
+ echo '<div id="slack_cred" style="display: ' . $slack . ';">';
+ do_settings_sections( PostmanAdminController::NOTIFICATIONS_SLACK_CRED );
+ echo '</div>';
+
+ do_action( 'post_smtp_notification_settings' );
+
+ print '</section>';
+
+ submit_button();
+ print '</form>';
+ print '</div>';
+ print '</div>';
+ }
+
+ /**
+ */
+ public function outputWizardContent() {
+ // Set default values for input fields
+ $this->options->setMessageSenderEmailIfEmpty( wp_get_current_user()->user_email );
+ $this->options->setMessageSenderNameIfEmpty( wp_get_current_user()->display_name );
+
+ // construct Wizard
+ print '<div class="wrap">';
+
+ PostmanViewController::outputChildPageHeader( __( 'Setup Wizard', 'post-smtp' ) );
+
+ print '<form id="postman_wizard" method="post" action="options.php">';
+
+ // account tab
+ // message tab
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::PREVENT_MESSAGE_SENDER_EMAIL_OVERRIDE, $this->options->isPluginSenderEmailEnforced() );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::PREVENT_MESSAGE_SENDER_NAME_OVERRIDE, $this->options->isPluginSenderNameEnforced() );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::REPLY_TO, $this->options->getReplyTo() );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::FORCED_TO_RECIPIENTS, $this->options->getForcedToRecipients() );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::FORCED_CC_RECIPIENTS, $this->options->getForcedCcRecipients() );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::FORCED_BCC_RECIPIENTS, $this->options->getForcedBccRecipients() );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::ADDITIONAL_HEADERS, $this->options->getAdditionalHeaders() );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::DISABLE_EMAIL_VALIDAITON, $this->options->isEmailValidationDisabled() );
+
+ // logging tab
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::MAIL_LOG_ENABLED_OPTION, $this->options->getMailLoggingEnabled() );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::MAIL_LOG_MAX_ENTRIES, $this->options->getMailLoggingMaxEntries() );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::TRANSCRIPT_SIZE, $this->options->getTranscriptSize() );
+
+ // advanced tab
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::CONNECTION_TIMEOUT, $this->options->getConnectionTimeout() );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::READ_TIMEOUT, $this->options->getReadTimeout() );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::LOG_LEVEL, $this->options->getLogLevel() );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::RUN_MODE, $this->options->getRunMode() );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::STEALTH_MODE, $this->options->isStealthModeEnabled() );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::TEMPORARY_DIRECTORY, $this->options->getTempDirectory() );
+
+ wp_nonce_field('post-smtp', 'security' );
+
+ // display the setting text
+ settings_fields( PostmanAdminController::SETTINGS_GROUP_NAME );
+
+ // Wizard Step 0
+ printf( '<h5>%s</h5>', _x( 'Import Configuration', 'Wizard Step Title', 'post-smtp' ) );
+ print '<fieldset>';
+ printf( '<legend>%s</legend>', _x( 'Import configuration from another plugin?', 'Wizard Step Title', 'post-smtp' ) );
+ printf( '<p>%s</p>', __( 'If you had a working configuration with another Plugin, the Setup Wizard can begin with those settings.', 'post-smtp' ) );
+ print '<table class="input_auth_type">';
+ printf( '<tr><td><input type="radio" id="import_none" name="input_plugin" value="%s" checked="checked"></input></td><td><label> %s</label></td></tr>', 'none', __( 'None', 'post-smtp' ) );
+
+ if ( $this->importableConfiguration->isImportAvailable() ) {
+ foreach ( $this->importableConfiguration->getAvailableOptions() as $options ) {
+ printf( '<tr><td><input type="radio" name="input_plugin" value="%s"/></td><td><label> %s</label></td></tr>', $options->getPluginSlug(), $options->getPluginName() );
+ }
+ }
+ print '</table>';
+ print '</fieldset>';
+
+ // Wizard Step 1
+ printf( '<h5>%s</h5>', _x( 'Sender Details', 'Wizard Step Title', 'post-smtp' ) );
+ print '<fieldset>';
+ printf( '<legend>%s</legend>', _x( 'Who is the mail coming from?', 'Wizard Step Title', 'post-smtp' ) );
+ printf( '<p>%s</p>', __( 'Enter the email address and name you\'d like to send mail as.', 'post-smtp' ) );
+ printf( '<p>%s</p>', __( 'Please note that to prevent abuse, many email services will <em>not</em> let you send from an email address other than the one you authenticate with.', 'post-smtp' ) );
+ printf( '<label for="postman_options[sender_email]">%s</label>', __( 'Email Address', 'post-smtp' ) );
+ print $this->settingsRegistry->from_email_callback();
+ print '<br/>';
+ printf( '<label for="postman_options[sender_name]">%s</label>', __( 'Name', 'post-smtp' ) );
+ print $this->settingsRegistry->sender_name_callback();
+ print '</fieldset>';
+
+ // Wizard Step 2
+ printf( '<h5>%s</h5>', __( 'Outgoing Mail Server Hostname', 'post-smtp' ) );
+ print '<fieldset>';
+ foreach ( PostmanTransportRegistry::getInstance()->getTransports() as $transport ) {
+ $transport->printWizardMailServerHostnameStep();
+ }
+ print '</fieldset>';
+
+ // Wizard Step 3
+ printf( '<h5>%s</h5>', __( 'Connectivity Test', 'post-smtp' ) );
+ print '<fieldset>';
+ printf( '<legend>%s</legend>', __( 'How will the connection to the mail server be established?', 'post-smtp' ) );
+ printf( '<p>%s</p>', __( 'Your connection settings depend on what your email service provider offers, and what your WordPress host allows.', 'post-smtp' ) );
+ printf( '<p id="connectivity_test_status">%s: <span id="port_test_status">%s</span></p>', __( 'Connectivity Test', 'post-smtp' ), _x( 'Ready', 'TCP Port Test Status', 'post-smtp' ) );
+ printf( '<p class="ajax-loader" style="display:none"><img src="%s"/></p>', plugins_url( 'post-smtp/style/ajax-loader.gif' ) );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]">', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::TRANSPORT_TYPE );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]">', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::PORT );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]">', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::SECURITY_TYPE );
+ printf( '<input type="hidden" id="input_%2$s" name="%1$s[%2$s]">', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::AUTHENTICATION_TYPE );
+ print '<p id="wizard_recommendation"></p>';
+ /* Translators: Where %1$s is the socket identifier and %2$s is the authentication type */
+ printf( '<p class="user_override" style="display:none"><label><span>%s:</span></label> <table id="user_socket_override" class="user_override"></table></p>', _x( 'Socket', 'A socket is the network term for host and port together', 'post-smtp' ) );
+ printf( '<p class="user_override" style="display:none"><label><span>%s:</span></label> <table id="user_auth_override" class="user_override"></table></p>', __( 'Authentication', 'post-smtp' ) );
+ print ('<p><span id="smtp_mitm" style="display:none; background-color:yellow"></span></p>') ;
+ $warning = __( 'Warning', 'post-smtp' );
+ $clearCredentialsWarning = __( 'This configuration option will send your authorization credentials in the clear.', 'post-smtp' );
+ printf( '<p id="smtp_not_secure" style="display:none"><span style="background-color:yellow">%s: %s</span></p>', $warning, $clearCredentialsWarning );
+ print '</fieldset>';
+
+ // Wizard Step 4
+ printf( '<h5>%s</h5>', __( 'Authentication', 'post-smtp' ) );
+ print '<fieldset>';
+ printf( '<legend>%s</legend>', __( 'How will you prove your identity to the mail server?', 'post-smtp' ) );
+ foreach ( PostmanTransportRegistry::getInstance()->getTransports() as $transport ) {
+ $transport->printWizardAuthenticationStep();
+ }
+ print '</fieldset>';
+
+ // Wizard Step 5 - Notificiations
+ printf( '<h5>%s</h5>', __( 'Notifications', 'post-smtp' ) );
+ print '<fieldset>';
+ printf( '<legend>%s</legend>', __( 'Select a notify service to notify you when an email is failed to delivered.', 'post-smtp' ) );
+
+ ?>
+ <select id="input_notification_service" class="input_notification_service" name="postman_options[notification_service]">
+ <option value="default">Email</option>
+ <option value="pushover">Pushover</option>
+ <option value="slack">Slack</option>
+ </select>
+ <div id="pushover_cred" style="display: none;">
+ <h2><?php _e( 'Pushover Credentials', 'post-smtp' ); ?></h2>
+ <table class="form-table">
+ <tbody>
+ <tr>
+ <th scope="row"><?php _e( 'Pushover User Key', 'post-smtp' ); ?></th>
+ <td>
+ <input type="password" id="pushover_user" name="postman_options[pushover_user]" value="">
+ </td>
+ </tr>
+ <tr>
+ <th scope="row"><?php _e( 'Pushover App Token', 'post-smtp' ); ?></th>
+ <td>
+ <input type="password" id="pushover_token" name="postman_options[pushover_token]" value="">
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div id="slack_cred" style="display: none;">
+ <h2><?php _e( 'Slack Credentials', 'post-smtp' ); ?></h2>
+ <table class="form-table">
+ <tbody>
+ <tr>
+ <th scope="row"><?php _e( 'Slack webhook', 'post-smtp' ); ?></th>
+ <td>
+ <input type="password" id="slack_token" name="postman_options[slack_token]" value="">
+ <a target="_blank" class="" href="https://slack.postmansmtp.com/">
+ <?php _e( 'Get your webhook URL here.', 'post-smtp' ); ?>
+ </a>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+
+ <div id="use-chrome-extension">
+ <h2><?php _e( 'Push To Chrome Extension', 'post-smtp' ); ?></h2>
+ <table class="form-table">
+ <tbody>
+ <tr>
+ <th scope="row"><?php _e( 'This is an extra notification to the selection above', 'post-smtp' ); ?></th>
+ <td>
+ <input type="checkbox" id="notification_use_chrome" name="postman_options[notification_use_chrome]">
+ <a target="_blank" class="" href="https://chrome.google.com/webstore/detail/npklmbkpbknkmbohdbpikeidiaekjoch">
+ <?php _e( 'You can download the chrome extension here.', 'post-smtp' ); ?>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row"><?php _e( 'Your UID as you see in the extension.', 'post-smtp' ); ?></th>
+ <td>
+ <input type="password" id="notification_chrome_uid" name="postman_options[notification_chrome_uid]" value="">
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+
+ <?php
+ print '</fieldset>';
+
+ // Wizard Step 6
+ printf( '<h5>%s</h5>', _x( 'Finish', 'The final step of the Wizard', 'post-smtp' ) );
+ print '<fieldset>';
+ printf( '<legend>%s</legend>', _x( 'You\'re Done!', 'Wizard Step Title', 'post-smtp' ) );
+ print '<section>';
+ printf( '<p>%s</p>', __( 'Click Finish to save these settings, then:', 'post-smtp' ) );
+ print '<ul style="margin-left: 20px">';
+ printf( '<li class="wizard-auth-oauth2">%s</li>', __( 'Grant permission with the Email Provider for Postman to send email and', 'post-smtp' ) );
+ printf( '<li>%s</li>', __( 'Send yourself a Test Email to make sure everything is working!', 'post-smtp' ) );
+ print '</ul>';
+
+ // Get PHPmailer recommendation
+ Postman::getMailerTypeRecommend();
+
+ $in_wizard = true;
+ include_once POST_SMTP_PATH . '/Postman/extra/donation.php';
+
+ print '</section>';
+ print '</fieldset>';
+ print '</form>';
+ print '</div>';
+ }
+}
+
+/**
+ *
+ * @author jasonhendriks
+ */
+class PostmanGetHostnameByEmailAjaxController extends PostmanAbstractAjaxHandler {
+ const IS_GOOGLE_PARAMETER = 'is_google';
+ function __construct() {
+ parent::__construct();
+ PostmanUtils::registerAjaxHandler( 'postman_check_email', $this, 'getAjaxHostnameByEmail' );
+ }
+ /**
+ * This Ajax function retrieves the smtp hostname for a give e-mail address
+ */
+ function getAjaxHostnameByEmail() {
+
+ check_admin_referer('post-smtp', 'security');
+
+ $goDaddyHostDetected = $this->getBooleanRequestParameter( 'go_daddy' );
+ $email = $this->getRequestParameter( 'email' );
+ $d = new PostmanSmtpDiscovery( $email );
+ $smtp = $d->getSmtpServer();
+ $this->logger->debug( 'given email ' . $email . ', smtp server is ' . $smtp );
+ $this->logger->trace( $d );
+ if ( $goDaddyHostDetected && ! $d->isGoogle ) {
+ // override with the GoDaddy SMTP server
+ $smtp = 'relay-hosting.secureserver.net';
+ $this->logger->debug( 'detected GoDaddy SMTP server, smtp server is ' . $smtp );
+ }
+ $response = array(
+ 'hostname' => $smtp,
+ self::IS_GOOGLE_PARAMETER => $d->isGoogle,
+ 'is_go_daddy' => $d->isGoDaddy,
+ 'is_well_known' => $d->isWellKnownDomain,
+ );
+ $this->logger->trace( $response );
+ wp_send_json_success( $response );
+ }
+}
+class PostmanManageConfigurationAjaxHandler extends PostmanAbstractAjaxHandler {
+ function __construct() {
+ parent::__construct();
+ PostmanUtils::registerAjaxHandler( 'manual_config', $this, 'getManualConfigurationViaAjax' );
+ PostmanUtils::registerAjaxHandler( 'get_wizard_configuration_options', $this, 'getWizardConfigurationViaAjax' );
+ }
+
+ /**
+ * Handle a Advanced Configuration request with Ajax
+ *
+ * @throws Exception
+ */
+ function getManualConfigurationViaAjax() {
+
+ check_admin_referer('post-smtp', 'security');
+
+ $queryTransportType = $this->getTransportTypeFromRequest();
+ $queryAuthType = $this->getAuthenticationTypeFromRequest();
+ $queryHostname = $this->getHostnameFromRequest();
+
+ // the outgoing server hostname is only required for the SMTP Transport
+ // the Gmail API transport doesn't use an SMTP server
+ $transport = PostmanTransportRegistry::getInstance()->getTransport( $queryTransportType );
+ if ( ! $transport ) {
+ throw new Exception( 'Unable to find transport ' . $queryTransportType );
+ }
+
+ // create the response
+ $response = $transport->populateConfiguration( $queryHostname );
+ $response ['referer'] = 'manual_config';
+
+ // set the display_auth to oauth2 if the transport needs it
+ if ( $transport->isOAuthUsed( $queryAuthType ) ) {
+ $response ['display_auth'] = 'oauth2';
+ $this->logger->debug( 'ajaxRedirectUrl answer display_auth:' . $response ['display_auth'] );
+ }
+ $this->logger->trace( $response );
+ wp_send_json_success( $response );
+ }
+
+ /**
+ * Once the Port Tests have run, the results are analyzed.
+ * The Transport place bids on the sockets and highest bid becomes the recommended
+ * The UI response is built so the user may choose a different socket with different options.
+ */
+ function getWizardConfigurationViaAjax() {
+
+ check_admin_referer('post-smtp', 'security');
+
+ $this->logger->debug( 'in getWizardConfiguration' );
+ $originalSmtpServer = $this->getRequestParameter( 'original_smtp_server' );
+ $queryHostData = $this->getHostDataFromRequest();
+ $sockets = array();
+ foreach ( $queryHostData as $id => $datum ) {
+ array_push( $sockets, new PostmanWizardSocket( $datum ) );
+ }
+ $this->logger->error( $sockets );
+ $userPortOverride = $this->getUserPortOverride();
+ $userAuthOverride = $this->getUserAuthOverride();
+
+ // determine a configuration recommendation
+ $winningRecommendation = $this->getWinningRecommendation( $sockets, $userPortOverride, $userAuthOverride, $originalSmtpServer );
+ if ( $this->logger->isTrace() ) {
+ $this->logger->trace( 'winning recommendation:' );
+ $this->logger->trace( $winningRecommendation );
+ }
+
+ // create the reponse
+ $response = array();
+ $configuration = array();
+ $response ['referer'] = 'wizard';
+ if ( isset( $userPortOverride ) || isset( $userAuthOverride ) ) {
+ $configuration ['user_override'] = true;
+ }
+
+ if ( isset( $winningRecommendation ) ) {
+
+ // create an appropriate (theoretical) transport
+ $transport = PostmanTransportRegistry::getInstance()->getTransport( $winningRecommendation ['transport'] );
+
+ // create user override menu
+ $overrideMenu = $this->createOverrideMenus( $sockets, $winningRecommendation, $userPortOverride, $userAuthOverride );
+ if ( $this->logger->isTrace() ) {
+ $this->logger->trace( 'override menu:' );
+ $this->logger->trace( $overrideMenu );
+ }
+
+ $queryHostName = $winningRecommendation ['hostname'];
+ if ( $this->logger->isDebug() ) {
+ $this->logger->debug( 'Getting scribe for ' . $queryHostName );
+ }
+ $generalConfig1 = $transport->populateConfiguration( $queryHostName );
+ $generalConfig2 = $transport->populateConfigurationFromRecommendation( $winningRecommendation );
+ $configuration = array_merge( $configuration, $generalConfig1, $generalConfig2 );
+ $response ['override_menu'] = $overrideMenu;
+ $response ['configuration'] = $configuration;
+ if ( $this->logger->isTrace() ) {
+ $this->logger->trace( 'configuration:' );
+ $this->logger->trace( $configuration );
+ $this->logger->trace( 'response:' );
+ $this->logger->trace( $response );
+ }
+ wp_send_json_success( $response );
+ } else {
+ /* translators: where %s is the URL to the Connectivity Test page */
+ $configuration ['message'] = sprintf( __( 'Postman can\'t find any way to send mail on your system. Run a <a href="%s">connectivity test</a>.', 'post-smtp' ), PostmanViewController::getPageUrl( PostmanViewController::PORT_TEST_SLUG ) );
+ $response ['configuration'] = $configuration;
+ if ( $this->logger->isTrace() ) {
+ $this->logger->trace( 'configuration:' );
+ $this->logger->trace( $configuration );
+ }
+ wp_send_json_error( $response );
+ }
+ }
+
+ /**
+ * // for each successful host/port combination
+ * // ask a transport if they support it, and if they do at what priority is it
+ * // configure for the highest priority you find
+ *
+ * @param mixed $queryHostData
+ * @return mixed
+ */
+ private function getWinningRecommendation( $sockets, $userSocketOverride, $userAuthOverride, $originalSmtpServer ) {
+ foreach ( $sockets as $socket ) {
+ $winningRecommendation = $this->getWin( $socket, $userSocketOverride, $userAuthOverride, $originalSmtpServer );
+ $this->logger->error( $socket->label );
+ }
+ return $winningRecommendation;
+ }
+
+ /**
+ *
+ * @param PostmanWizardSocket $socket
+ * @param mixed $userSocketOverride
+ * @param mixed $userAuthOverride
+ * @param mixed $originalSmtpServer
+ * @return mixed
+ */
+ private function getWin( PostmanWizardSocket $socket, $userSocketOverride, $userAuthOverride, $originalSmtpServer ) {
+ static $recommendationPriority = - 1;
+ static $winningRecommendation = null;
+ $available = $socket->success;
+ if ( $available ) {
+ $this->logger->debug( sprintf( 'Asking for judgement on %s:%s', $socket->hostname, $socket->port ) );
+ $recommendation = PostmanTransportRegistry::getInstance()->getRecommendation( $socket, $userAuthOverride, $originalSmtpServer );
+ $recommendationId = sprintf( '%s_%s', $socket->hostname, $socket->port );
+ $recommendation ['id'] = $recommendationId;
+ $this->logger->debug( sprintf( 'Got a recommendation: [%d] %s', $recommendation ['priority'], $recommendationId ) );
+ if ( isset( $userSocketOverride ) ) {
+ if ( $recommendationId == $userSocketOverride ) {
+ $winningRecommendation = $recommendation;
+ $this->logger->debug( sprintf( 'User chosen socket %s is the winner', $recommendationId ) );
+ }
+ } elseif ( $recommendation && $recommendation ['priority'] > $recommendationPriority ) {
+ $recommendationPriority = $recommendation ['priority'];
+ $winningRecommendation = $recommendation;
+ }
+ $socket->label = $recommendation ['label'];
+ }
+ return $winningRecommendation;
+ }
+
+ /**
+ *
+ * @param mixed $queryHostData
+ * @return multitype:
+ */
+ private function createOverrideMenus( $sockets, $winningRecommendation, $userSocketOverride, $userAuthOverride ) {
+ $overrideMenu = array();
+ foreach ( $sockets as $socket ) {
+ $overrideItem = $this->createOverrideMenu( $socket, $winningRecommendation, $userSocketOverride, $userAuthOverride );
+ if ( $overrideItem != null ) {
+ $overrideMenu [ $socket->id ] = $overrideItem;
+ }
+ }
+
+ // sort
+ krsort( $overrideMenu );
+ $sortedMenu = array();
+ foreach ( $overrideMenu as $menu ) {
+ array_push( $sortedMenu, $menu );
+ }
+
+ return $sortedMenu;
+ }
+
+ /**
+ *
+ * @param PostmanWizardSocket $socket
+ * @param mixed $winningRecommendation
+ * @param mixed $userSocketOverride
+ * @param mixed $userAuthOverride
+ */
+ private function createOverrideMenu( PostmanWizardSocket $socket, $winningRecommendation, $userSocketOverride, $userAuthOverride ) {
+ if ( $socket->success ) {
+ $transport = PostmanTransportRegistry::getInstance()->getTransport( $socket->transport );
+ $this->logger->debug( sprintf( 'Transport %s is building the override menu for socket', $transport->getSlug() ) );
+ $overrideItem = $transport->createOverrideMenu( $socket, $winningRecommendation, $userSocketOverride, $userAuthOverride );
+ return $overrideItem;
+ }
+ return null;
+ }
+
+ /**
+ */
+ private function getTransportTypeFromRequest() {
+ return $this->getRequestParameter( 'transport' );
+ }
+
+ /**
+ */
+ private function getHostnameFromRequest() {
+ return $this->getRequestParameter( 'hostname' );
+ }
+
+ /**
+ */
+ private function getAuthenticationTypeFromRequest() {
+ return $this->getRequestParameter( 'auth_type' );
+ }
+
+ /**
+ */
+ private function getHostDataFromRequest() {
+ return $this->getRequestParameter( 'host_data' );
+ }
+
+ /**
+ */
+ private function getUserPortOverride() {
+ return $this->getRequestParameter( 'user_port_override' );
+ }
+
+ /**
+ */
+ private function getUserAuthOverride() {
+ return $this->getRequestParameter( 'user_auth_override' );
+ }
+}
+class PostmanImportConfigurationAjaxController extends PostmanAbstractAjaxHandler {
+ private $options;
+ /**
+ * Constructor
+ *
+ * @param PostmanOptions $options
+ */
+ function __construct( PostmanOptions $options ) {
+ parent::__construct();
+ $this->options = $options;
+ PostmanUtils::registerAjaxHandler( 'import_configuration', $this, 'getConfigurationFromExternalPluginViaAjax' );
+ }
+
+ /**
+ * This function extracts configuration details form a competing SMTP plugin
+ * and pushes them into the Postman configuration screen.
+ */
+ function getConfigurationFromExternalPluginViaAjax() {
+
+ check_admin_referer('post-smtp', 'security');
+
+ $importableConfiguration = new PostmanImportableConfiguration();
+ $plugin = $this->getRequestParameter( 'plugin' );
+ $this->logger->debug( 'Looking for config=' . $plugin );
+ foreach ( $importableConfiguration->getAvailableOptions() as $this->options ) {
+ if ( $this->options->getPluginSlug() == $plugin ) {
+ $this->logger->debug( 'Sending configuration response' );
+ $response = array(
+ PostmanOptions::MESSAGE_SENDER_EMAIL => $this->options->getMessageSenderEmail(),
+ PostmanOptions::MESSAGE_SENDER_NAME => $this->options->getMessageSenderName(),
+ PostmanOptions::HOSTNAME => $this->options->getHostname(),
+ PostmanOptions::PORT => $this->options->getPort(),
+ PostmanOptions::AUTHENTICATION_TYPE => $this->options->getAuthenticationType(),
+ PostmanOptions::SECURITY_TYPE => $this->options->getEncryptionType(),
+ PostmanOptions::BASIC_AUTH_USERNAME => $this->options->getUsername(),
+ PostmanOptions::BASIC_AUTH_PASSWORD => $this->options->getPassword(),
+ 'success' => true,
+ );
+ break;
+ }
+ }
+ if ( ! isset( $response ) ) {
+ $response = array(
+ 'success' => false,
+ );
+ }
+ wp_send_json( $response );
+ }
+}