File: /var/www/html/appointmentbook.me/wp-content/plugins/fluent-smtp/app/Services/Converter.php
<?php
namespace FluentMail\App\Services;
use FluentMail\Includes\Support\Arr;
class Converter
{
public function getSuggestedConnection()
{
$wpMailSmtp = $this->maybeWPMailSmtp();
if($wpMailSmtp) {
return $wpMailSmtp;
}
$easySMTP = $this->maybeEasySmtp();
if($easySMTP) {
return $easySMTP;
}
return false;
}
private function maybeWPMailSmtp()
{
$wpMailSettings = get_option('wp_mail_smtp');
if (!$wpMailSettings) {
return false;
}
$mailSettings = Arr::get($wpMailSettings, 'mail', []);
$commonSettings = [
'sender_name' => $this->maybeFromWPMailDefined('mail', 'from_name', Arr::get($mailSettings, 'from_name')),
'sender_email' => $this->maybeFromWPMailDefined('mail', 'from_email', Arr::get($mailSettings, 'from_email')),
'force_from_name' => Arr::get($mailSettings, 'from_name_force') == 1 ? 'yes' : 'no',
'force_from_email' => Arr::get($mailSettings, 'from_email_force') == 1 ? 'yes' : 'no',
'return_path' => Arr::get($mailSettings, 'return_path') == 1 ? 'yes' : 'no'
];
// Let's try the SMTP First
$mailer = Arr::get($mailSettings, 'mailer');
if ($mailer == 'smtp') {
$smtp = Arr::get($wpMailSettings, 'smtp', []);
$auth = $this->maybeFromWPMailDefined('smtp', 'auth', Arr::get($smtp, 'auth')) == 1 ? 'yes' : 'no';
$userName = $this->maybeFromWPMailDefined('smtp', 'user', Arr::get($smtp, 'user'));
$password = $this->maybeFromWPMailDefined('smtp', 'pass', '');
if ($auth == 'yes') {
if (!$password) {
$password = $this->wpMailPassDecode(Arr::get($smtp, 'pass'));
}
}
$localSettings = [
'host' => $this->maybeFromWPMailDefined('smtp', 'host', Arr::get($smtp, 'host')),
'port' => $this->maybeFromWPMailDefined('smtp', 'port', Arr::get($smtp, 'port')),
'auth' => $auth,
'username' => $userName,
'password' => $password,
'auto_tls' => $this->maybeFromWPMailDefined('smtp', 'auto_tls', Arr::get($smtp, 'auto_tls')) == 1 ? 'yes' : 'no',
'encryption' => $this->maybeFromWPMailDefined('smtp', 'encryption', Arr::get($smtp, 'encryption', 'none')),
'key_store' => 'db',
'provider' => 'smtp'
];
$commonSettings = wp_parse_args($commonSettings, $localSettings);
} else if ($mailer == 'mailgun') {
$mailgun = Arr::get($wpMailSettings, 'mailgun', []);
$localSettings = [
'api_key' => $this->maybeFromWPMailDefined('mailgun', 'api_key', Arr::get($mailgun, 'api_key')),
'domain_name' => $this->maybeFromWPMailDefined('mailgun', 'domain', Arr::get($mailgun, 'domain')),
'key_store' => 'db',
'region' => strtolower($this->maybeFromWPMailDefined('mailgun', 'region', Arr::get($mailgun, 'region'))),
'provider' => 'mailgun'
];
$commonSettings = wp_parse_args($commonSettings, $localSettings);
unset($commonSettings['force_from_email']);
} else if ($mailer == 'sendinblue' || $mailer == 'sendgrid' || $mailer == 'pepipostapi') {
$local = Arr::get($wpMailSettings, $mailer, []);
$localSettings = [
'api_key' => $this->maybeFromWPMailDefined($mailer, 'api_key', Arr::get($local, 'api_key')),
'key_store' => 'db',
'provider' => ($mailer == 'pepipostapi') ? 'pepipost' : $mailer
];
$commonSettings = wp_parse_args($commonSettings, $localSettings);
unset($commonSettings['force_from_email']);
} else if ($mailer == 'amazonses') {
$local = Arr::get($wpMailSettings, $mailer, []);
$localSettings = [
'access_key' => $this->maybeFromWPMailDefined($mailer, 'client_id', Arr::get($local, 'client_id')),
'secret_key' => $this->maybeFromWPMailDefined($mailer, 'client_secret', Arr::get($local, 'client_secret')),
'region' => $this->maybeFromWPMailDefined($mailer, 'region', Arr::get($local, 'region')),
'key_store' => 'db',
'provider' => 'ses'
];
$commonSettings = wp_parse_args($commonSettings, $localSettings);
} else if ($mailer == 'mail') {
$commonSettings['provider'] = 'default';
} else {
return false;
}
return [
'title' => __('Import data from your current plugin (WP Mail SMTP)', 'fluent-smtp'),
'subtitle' => __('We have detected other SMTP plugin\'s settings available on your site. Click bellow to pre-populate the values', 'fluent-smtp'),
'settings' => $commonSettings,
'button_text' => __('Import From WP Mail SMTP', 'fluent-smtp')
];
}
private function wpMailPassDecode($encrypted)
{
if (apply_filters('wp_mail_smtp_helpers_crypto_stop', false)) {
return $encrypted;
}
if (!function_exists('\mb_strlen') || !function_exists('\mb_substr') || !function_exists('\sodium_crypto_secretbox_open')) {
return $encrypted;
}
// Unpack base64 message.
$decoded = base64_decode($encrypted); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode
if (false === $decoded) {
return $encrypted;
}
if (mb_strlen($decoded, '8bit') < (SODIUM_CRYPTO_SECRETBOX_NONCEBYTES + SODIUM_CRYPTO_SECRETBOX_MACBYTES)) { // phpcs:ignore
return $encrypted;
}
// Pull nonce and ciphertext out of unpacked message.
$nonce = mb_substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit'); // phpcs:ignore
$ciphertext = mb_substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit'); // phpcs:ignore
$secret_key = $this->getWPMailSecretKey();
if (empty($secret_key)) {
return $encrypted;
}
// Decrypt it.
$message = sodium_crypto_secretbox_open( // phpcs:ignore
$ciphertext,
$nonce,
$secret_key
);
// Check for decryption failures.
if (false === $message) {
return $encrypted;
}
return $message;
}
private function getWPMailSecretKey()
{
if (defined('WPMS_CRYPTO_KEY')) {
return WPMS_CRYPTO_KEY;
}
$secret_key = get_option('wp_mail_smtp_mail_key');
$secret_key = apply_filters('wp_mail_smtp_helpers_crypto_get_secret_key', $secret_key);
// If we already have the secret, send it back.
if (false !== $secret_key) {
$secret_key = base64_decode($secret_key); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode
}
return $secret_key;
}
private function maybeFromWPMailDefined($group, $key, $value)
{
if (!defined('WPMS_ON') || !WPMS_ON) {
return $value;
}
// Just to feel safe.
$group = sanitize_key($group);
$key = sanitize_key($key);
$return = false;
switch ($group) {
case 'mail':
switch ($key) {
case 'from_name':
if (defined('WPMS_MAIL_FROM_NAME') && WPMS_MAIL_FROM_NAME) {
$value = WPMS_MAIL_FROM_NAME;
}
break;
case 'from_email':
if (defined('WPMS_MAIL_FROM') && WPMS_MAIL_FROM) {
$value = WPMS_MAIL_FROM;
}
break;
case 'mailer':
if (defined('WPMS_MAILER') && WPMS_MAILER) {
$value = WPMS_MAILER;
}
break;
case 'return_path':
if (defined('WPMS_SET_RETURN_PATH') && WPMS_SET_RETURN_PATH) {
$value = WPMS_SET_RETURN_PATH;
}
break;
case 'from_name_force':
if (defined('WPMS_MAIL_FROM_NAME_FORCE') && WPMS_MAIL_FROM_NAME_FORCE) {
$value = WPMS_MAIL_FROM_NAME_FORCE;
}
break;
case 'from_email_force':
if (defined('WPMS_MAIL_FROM_FORCE') && WPMS_MAIL_FROM_FORCE) {
$value = WPMS_MAIL_FROM_FORCE;
}
break;
}
break;
case 'smtp':
switch ($key) {
case 'host':
if (defined('WPMS_SMTP_HOST') && WPMS_SMTP_HOST) {
$value = WPMS_SMTP_HOST;
}
break;
case 'port':
if (defined('WPMS_SMTP_PORT') && WPMS_SMTP_PORT) {
$value = WPMS_SMTP_PORT;
}
break;
case 'encryption':
if (defined('WPMS_SSL') && WPMS_SSL) {
$value = WPMS_SSL;
}
break;
case 'auth':
if (defined('WPMS_SMTP_AUTH') && WPMS_SMTP_AUTH) {
$value = WPMS_SMTP_AUTH;
}
break;
case 'autotls':
if (defined('WPMS_SMTP_AUTOTLS') && WPMS_SMTP_AUTOTLS) {
$value = WPMS_SMTP_AUTOTLS;
}
break;
case 'user':
if (defined('WPMS_SMTP_USER') && WPMS_SMTP_USER) {
$value = WPMS_SMTP_USER;
}
break;
case 'pass':
if (defined('WPMS_SMTP_PASS') && WPMS_SMTP_PASS) {
$value = WPMS_SMTP_PASS;
}
break;
}
break;
case 'amazonses':
switch ($key) {
case 'client_id':
if (defined('WPMS_AMAZONSES_CLIENT_ID') && WPMS_AMAZONSES_CLIENT_ID) {
$value = WPMS_AMAZONSES_CLIENT_ID;
}
break;
case 'client_secret':
if (defined('WPMS_AMAZONSES_CLIENT_SECRET') && WPMS_AMAZONSES_CLIENT_SECRET) {
$value = WPMS_AMAZONSES_CLIENT_SECRET;
}
break;
case 'region':
if (defined('WPMS_AMAZONSES_REGION') && WPMS_AMAZONSES_REGION) {
$value = WPMS_AMAZONSES_REGION;
}
break;
}
break;
case 'mailgun':
switch ($key) {
case 'api_key':
if (defined('WPMS_MAILGUN_API_KEY') && WPMS_MAILGUN_API_KEY) {
$value = WPMS_MAILGUN_API_KEY;
}
break;
case 'domain':
if (defined('WPMS_MAILGUN_DOMAIN') && WPMS_MAILGUN_DOMAIN) {
$value = WPMS_MAILGUN_DOMAIN;
}
break;
case 'region':
if (defined('WPMS_MAILGUN_REGION') && WPMS_MAILGUN_REGION) {
$value = WPMS_MAILGUN_REGION;
}
break;
}
break;
case 'sendgrid':
switch ($key) {
case 'api_key':
if (defined('WPMS_SENDGRID_API_KEY') && WPMS_SENDGRID_API_KEY) {
$value = WPMS_SENDGRID_API_KEY;
}
break;
case 'domain':
if (defined('WPMS_SENDGRID_DOMAIN') && WPMS_SENDGRID_DOMAIN) {
$value = WPMS_SENDGRID_DOMAIN;
}
break;
}
break;
case 'sendinblue':
switch ($key) {
case 'api_key':
if (defined('WPMS_SENDINBLUE_API_KEY') && WPMS_SENDINBLUE_API_KEY) {
$value = WPMS_SENDINBLUE_API_KEY;
}
break;
case 'domain':
if (defined('WPMS_SENDINBLUE_DOMAIN') && WPMS_SENDINBLUE_DOMAIN) {
$value = WPMS_SENDINBLUE_DOMAIN;
}
break;
}
break;
case 'pepipostapi':
switch ($key) {
case 'api_key':
if (defined('WPMS_PEPIPOST_API_KEY') && WPMS_PEPIPOST_API_KEY) {
$value = WPMS_PEPIPOST_API_KEY;
}
break;
}
break;
case 'elasticmail':
switch ($key) {
case 'api_key':
if (defined('FLUENTMAIL_ELASTICMAIL_API_KEY') && FLUENTMAIL_ELASTICMAIL_API_KEY) {
$value = FLUENTMAIL_ELASTICMAIL_API_KEY;
}
break;
}
break;
}
return $value;
}
/*
* For EasySMTP
*/
private function maybeEasySmtp()
{
$settings = get_option('swpsmtp_options');
if (!$settings || !is_array($settings)) {
return false;
}
$auth = 'no';
if (Arr::get($settings, 'smtp_settings.autentication')) {
$auth = 'yes';
}
$commonSettings = [
'sender_name' => Arr::get($settings, 'from_name_field'),
'sender_email' => Arr::get($settings, 'from_email_field'),
'force_from_name' => Arr::get($settings, 'force_from_name_replace') == 1 ? 'yes' : 'no',
'force_from_email' => 'yes',
'return_path' => 'yes',
'host' => Arr::get($settings, 'smtp_settings.host'),
'port' => Arr::get($settings, 'smtp_settings.port'),
'auth' => $auth,
'username' => Arr::get($settings, 'smtp_settings.username'),
'password' => $this->decryptEasySMTPPass(Arr::get($settings, 'smtp_settings.password')),
'auto_tls' => Arr::get($settings, 'smtp_settings.password') == 1 ? 'yes' : 'no',
'encryption' => Arr::get($settings, 'smtp_settings.type_encryption'),
'key_store' => 'db',
'provider' => 'smtp'
];
return [
'title' => __('Import data from your current plugin (Easy WP SMTP)', 'fluent-smtp'),
'subtitle' => __('We have detected other SMTP plugin\'s settings available on your site. Click bellow to pre-populate the values', 'fluent-smtp'),
'driver' => 'smtp',
'settings' => $commonSettings,
'button_text' => __('Import From Easy WP SMTP', 'fluent-smtp')
];
}
private function decryptEasySMTPPass($temp_password)
{
if (!$temp_password) {
return $temp_password;
}
try {
if (get_option('swpsmtp_pass_encrypted')) {
$key = get_option('swpsmtp_enc_key', false);
if (empty($key)) {
$key = wp_salt();
}
return $this->decryptEasypassword($temp_password, $key);
}
} catch (\Exception $e) {
return $temp_password;
}
$password = '';
$decoded_pass = base64_decode($temp_password); //phpcs:ignore
/* no additional checks for servers that aren't configured with mbstring enabled */
if (!function_exists('mb_detect_encoding')) {
return $decoded_pass;
}
/* end of mbstring check */
if (base64_encode($decoded_pass) === $temp_password) { //phpcs:ignore
//it might be encoded
if (false === mb_detect_encoding($decoded_pass)) { //could not find character encoding.
$password = $temp_password;
} else {
$password = base64_decode($temp_password); //phpcs:ignore
}
} else { //not encoded
$password = $temp_password;
}
return stripslashes($password);
}
private function decryptEasyPassword($in, $key, $fmt = 1)
{
if (!function_exists('\openssl_cipher_iv_length') || !function_exists('\openssl_decrypt') || !function_exists('\openssl_digest')) {
return $in;
}
$raw = base64_decode($in);
$iv_num_bytes = openssl_cipher_iv_length('aes-256-ctr');
// and do an integrity check on the size.
if (strlen($raw) < $iv_num_bytes) {
return $in;
}
// Extract the initialisation vector and encrypted data
$iv = substr($raw, 0, $iv_num_bytes);
$raw = substr($raw, $iv_num_bytes);
$hasAlgo = 'sha256';
// Hash the key
$keyhash = openssl_digest($key, $hasAlgo, true);
// and decrypt.
$opts = 1;
$res = openssl_decrypt($raw, 'aes-256-ctr', $keyhash, $opts, $iv);
if ($res === false) {
return $in;
}
return $res;
}
}