Files
doitinpoland.com/wp-content/plugins/sitepress-multilingual-cms/classes/menu/translation-services/AuthenticationAjax.php
2023-09-12 21:41:04 +02:00

154 lines
3.5 KiB
PHP

<?php
namespace WPML\TM\Menu\TranslationServices;
use WPML\TM\TranslationProxy\Services\AuthorizationFactory;
class AuthenticationAjax {
const AJAX_ACTION = 'translation_service_authentication';
/** @var AuthorizationFactory */
protected $authorize_factory;
/**
* @param AuthorizationFactory $authorize_factory
*/
public function __construct( AuthorizationFactory $authorize_factory ) {
$this->authorize_factory = $authorize_factory;
}
public function add_hooks() {
add_action( 'wp_ajax_translation_service_authentication', [ $this, 'authenticate_service' ] );
add_action( 'wp_ajax_translation_service_update_credentials', [ $this, 'update_credentials' ] );
add_action( 'wp_ajax_translation_service_invalidation', [ $this, 'invalidate_service' ] );
}
/**
* @return bool
*/
public function authenticate_service() {
return $this->handle_action(
function () {
$this->authorize_factory->create()->authorize(
json_decode( stripslashes( $_POST['custom_fields'] ) )
);
},
[ $this, 'is_valid_request_with_params' ],
__( 'Service activated.', 'wpml-translation-management' ),
__(
'The authentication didn\'t work. Please make sure you entered your details correctly and try again.',
'wpml-translation-management'
)
);
}
/**
* @return bool
*/
public function update_credentials() {
return $this->handle_action(
function () {
$this->authorize_factory->create()->updateCredentials(
json_decode( stripslashes( $_POST['custom_fields'] ) )
);
},
[ $this, 'is_valid_request_with_params' ],
__( 'Service credentials updated.', 'wpml-translation-management' ),
__(
'The authentication didn\'t work. Please make sure you entered your details correctly and try again.',
'wpml-translation-management'
)
);
}
/**
* @return bool
*/
public function invalidate_service() {
return $this->handle_action(
function () {
$this->authorize_factory->create()->deauthorize();
},
[ $this, 'is_valid_request' ],
__( 'Service invalidated.', 'wpml-translation-management' ),
__( 'Unable to invalidate this service. Please contact WPML support.', 'wpml-translation-management' )
);
}
/**
* @param callable $action
* @param callable $request_validation
* @param string $success_message
* @param string $failure_message
*
* @return bool
*/
private function handle_action(
callable $action,
callable $request_validation,
$success_message,
$failure_message
) {
if ( $request_validation() ) {
try {
$action();
return $this->send_success_response( $success_message );
} catch ( \Exception $e ) {
return $this->send_error_message( $failure_message );
}
} else {
return $this->send_error_message( __( 'Invalid Request', 'wpml-translation-management' ) );
}
}
/**
* @param string $msg
*
* @return bool
*/
private function send_success_response( $msg ) {
wp_send_json_success(
[
'errors' => 0,
'message' => $msg,
'reload' => 1,
]
);
return true;
}
/**
* @param string $msg
*
* @return bool
*/
private function send_error_message( $msg ) {
wp_send_json_error(
[
'errors' => 1,
'message' => $msg,
'reload' => 0,
]
);
return false;
}
/**
* @return bool
*/
public function is_valid_request() {
return isset( $_POST['nonce'] ) && wp_verify_nonce( $_POST['nonce'], self::AJAX_ACTION );
}
/**
* @return bool
*/
public function is_valid_request_with_params() {
return isset( $_POST['service_id'], $_POST['custom_fields'] ) && $this->is_valid_request();
}
}