PluginProbe
WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services / 8.8.4
WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services v8.8.4
8.8.4 8.8.3 8.8.2 8.8.1 8.8.0 8.7.9 8.7.8 8.7.7 8.7.6 8.7.5 8.7.4 8.7.3 8.7.2 8.7.1 8.7.0 8.6.9 8.6.8 8.6.7 8.6.6 8.6.5 8.6.4 8.6.2 8.6.1 8.6.0 8.5.9 All 540 releases
← All changes | addons/automator/includes/actions/data_transformer_action.php +136 -136 8.7.9 → 8.8.4 View file →
@@ -1,137 +1,137 @@
1 -<?php
2 -/**
3 - * Data Transformer Actions
4 - *
5 - * @package WPbot_Automator
6 - */
7 -
8 -namespace WPbot_Automator\Actions;
9 -
10 -if ( ! defined( 'ABSPATH' ) ) {
11 - exit;
12 -}
13 -// File: includes/class-dts-transformer.php
14 -
15 -class Data_Transformer extends Action {
16 -
17 - public function __construct() {
18 - $this->id = 'data_transformer';
19 - $this->group = __( 'Data Transformer', 'wpbot-automator' );
20 - }
21 -
22 - public function execute( $action_data, $trigger_data ) {
23 - $action_id = $action_data['actionId'] ?? '';
24 -
25 - if ( empty( $action_id ) ) {
26 - return false;
27 - }
28 -
29 - $config_values = $action_data['config'] ?? [];
30 - $value = $this->parse_tokens( $config_values['value'] ?? '', $trigger_data );
31 - $secret = $this->parse_tokens( $config_values['secret'] ?? '', $trigger_data );
32 -
33 - return Data_Transformer::run( $action_id, $value, [ 'secret' => $secret ] );
34 - }
35 -
36 - /**
37 - * Run a transformation action on a value.
38 - *
39 - * @param string $action One of the supported action slugs.
40 - * @param string $value The input string.
41 - * @param array $options Extra options (e.g. secret key for HMAC).
42 - * @return array { success: bool, output: string, error: string }
43 - */
44 - public static function run( string $action, string $value, array $options = [] ): array {
45 - try {
46 - $output = match( $action ) {
47 - 'html_encode' => htmlspecialchars( $value, ENT_QUOTES | ENT_HTML5, 'UTF-8' ),
48 - 'html_decode' => htmlspecialchars_decode( $value, ENT_QUOTES | ENT_HTML5 ),
49 - 'base64_encode' => base64_encode( $value ),
50 - 'base64_decode' => self::safe_base64_decode( $value ),
51 - 'sha256' => hash( 'sha256', $value ),
52 - 'sha1' => hash( 'sha1', $value ),
53 - 'sha512' => hash( 'sha512', $value ),
54 - 'hmac_sha256' => hash_hmac( 'sha256', $value, $options['secret'] ?? '' ),
55 - 'md5' => md5( $value ),
56 - 'strip_tags' => wp_strip_all_tags( $value ),
57 - default => throw new InvalidArgumentException( "Unknown action: {$action}" ),
58 - };
59 -
60 - return [ 'success' => true, 'output' => $output, 'error' => '' ];
61 -
62 - } catch ( Throwable $e ) {
63 - return [ 'success' => false, 'output' => '', 'error' => $e->getMessage() ];
64 - }
65 - }
66 -
67 - private static function safe_base64_decode( string $value ): string {
68 - $decoded = base64_decode( $value, true );
69 - if ( $decoded === false ) {
70 - throw new RuntimeException( 'Invalid Base64 string.' );
71 - }
72 - return $decoded;
73 - }
74 -
75 - // File: qcld_wpbot_autometor
76 -
77 - public static function register(): void {
78 - add_action( 'rest_api_init', [ __CLASS__, 'register_routes' ] );
79 - }
80 -
81 - public static function register_routes(): void {
82 - register_rest_route( 'qwautomator/v1', '/transform', [
83 - 'methods' => 'POST',
84 - 'callback' => [ __CLASS__, 'handle' ],
85 - 'permission_callback' => [ __CLASS__, 'auth' ],
86 - 'args' => [
87 - 'action' => [ 'required' => true, 'type' => 'string' ],
88 - 'value' => [ 'required' => true, 'type' => 'string' ],
89 - 'secret' => [ 'required' => false, 'type' => 'string', 'default' => '' ],
90 - ],
91 - ] );
92 - }
93 -
94 - public static function handle( WP_REST_Request $req ): WP_REST_Response {
95 - $result = Data_Transformer::run(
96 - $req->get_param( 'action' ),
97 - $req->get_param( 'value' ),
98 - [ 'secret' => $req->get_param( 'secret' ) ]
99 - );
100 -
101 - $status = $result['success'] ? 200 : 422;
102 - return new WP_REST_Response( $result, $status );
103 - }
104 -
105 - public static function auth(): bool {
106 - return current_user_can( 'manage_options' )
107 - || self::valid_api_key();
108 - }
109 -
110 - private static function valid_api_key(): bool {
111 - $key = get_option( 'dts_api_key' );
112 - $header = sanitize_text_field( $_SERVER['HTTP_X_DTS_KEY'] ?? '' );
113 - return $key && hash_equals( $key, $header );
114 - }
115 -}
116 -// File: includes/class-dts-workflow-step.php
117 -
118 -// Use this when your workflow engine fires an action with step data.
119 -
120 -add_filter( 'wpbot_automator_execute_step', function( array $step_result, array $step_config ) {
121 - if ( ( $step_config['type'] ?? '' ) !== 'data_transformer' ) {
122 - return $step_result;
123 - }
124 -
125 - $action = $step_config['action'] ?? '';
126 - // Resolve dynamic variable from previous step output
127 - $value = dts_resolve_variable( $step_config['value'], $step_result['context'] );
128 - $secret = dts_resolve_variable( $step_config['secret'] ?? '', $step_result['context'] );
129 -
130 - $result = Data_Transformer::run( $action, $value, compact( 'secret' ) );
131 -
132 - $step_result['output'] = $result['output'];
133 - $step_result['success'] = $result['success'];
134 - $step_result['error'] = $result['error'];
135 -
136 - return $step_result;
1 +<?php
2 +/**
3 + * Data Transformer Actions
4 + *
5 + * @package WPbot_Automator
6 + */
7 +
8 +namespace WPbot_Automator\Actions;
9 +
10 +if ( ! defined( 'ABSPATH' ) ) {
11 + exit;
12 +}
13 +// File: includes/class-dts-transformer.php
14 +
15 +class Data_Transformer extends Action {
16 +
17 + public function __construct() {
18 + $this->id = 'data_transformer';
19 + $this->group = __( 'Data Transformer', 'wpbot-automator' );
20 + }
21 +
22 + public function execute( $action_data, $trigger_data ) {
23 + $action_id = $action_data['actionId'] ?? '';
24 +
25 + if ( empty( $action_id ) ) {
26 + return false;
27 + }
28 +
29 + $config_values = $action_data['config'] ?? [];
30 + $value = $this->parse_tokens( $config_values['value'] ?? '', $trigger_data );
31 + $secret = $this->parse_tokens( $config_values['secret'] ?? '', $trigger_data );
32 +
33 + return Data_Transformer::run( $action_id, $value, [ 'secret' => $secret ] );
34 + }
35 +
36 + /**
37 + * Run a transformation action on a value.
38 + *
39 + * @param string $action One of the supported action slugs.
40 + * @param string $value The input string.
41 + * @param array $options Extra options (e.g. secret key for HMAC).
42 + * @return array { success: bool, output: string, error: string }
43 + */
44 + public static function run( string $action, string $value, array $options = [] ): array {
45 + try {
46 + $output = match( $action ) {
47 + 'html_encode' => htmlspecialchars( $value, ENT_QUOTES | ENT_HTML5, 'UTF-8' ),
48 + 'html_decode' => htmlspecialchars_decode( $value, ENT_QUOTES | ENT_HTML5 ),
49 + 'base64_encode' => base64_encode( $value ),
50 + 'base64_decode' => self::safe_base64_decode( $value ),
51 + 'sha256' => hash( 'sha256', $value ),
52 + 'sha1' => hash( 'sha1', $value ),
53 + 'sha512' => hash( 'sha512', $value ),
54 + 'hmac_sha256' => hash_hmac( 'sha256', $value, $options['secret'] ?? '' ),
55 + 'md5' => md5( $value ),
56 + 'strip_tags' => wp_strip_all_tags( $value ),
57 + default => throw new InvalidArgumentException( "Unknown action: {$action}" ),
58 + };
59 +
60 + return [ 'success' => true, 'output' => $output, 'error' => '' ];
61 +
62 + } catch ( Throwable $e ) {
63 + return [ 'success' => false, 'output' => '', 'error' => $e->getMessage() ];
64 + }
65 + }
66 +
67 + private static function safe_base64_decode( string $value ): string {
68 + $decoded = base64_decode( $value, true );
69 + if ( $decoded === false ) {
70 + throw new RuntimeException( 'Invalid Base64 string.' );
71 + }
72 + return $decoded;
73 + }
74 +
75 + // File: qcld_wpbot_autometor
76 +
77 + public static function register(): void {
78 + add_action( 'rest_api_init', [ __CLASS__, 'register_routes' ] );
79 + }
80 +
81 + public static function register_routes(): void {
82 + register_rest_route( 'qwautomator/v1', '/transform', [
83 + 'methods' => 'POST',
84 + 'callback' => [ __CLASS__, 'handle' ],
85 + 'permission_callback' => [ __CLASS__, 'auth' ],
86 + 'args' => [
87 + 'action' => [ 'required' => true, 'type' => 'string' ],
88 + 'value' => [ 'required' => true, 'type' => 'string' ],
89 + 'secret' => [ 'required' => false, 'type' => 'string', 'default' => '' ],
90 + ],
91 + ] );
92 + }
93 +
94 + public static function handle( WP_REST_Request $req ): WP_REST_Response {
95 + $result = Data_Transformer::run(
96 + $req->get_param( 'action' ),
97 + $req->get_param( 'value' ),
98 + [ 'secret' => $req->get_param( 'secret' ) ]
99 + );
100 +
101 + $status = $result['success'] ? 200 : 422;
102 + return new WP_REST_Response( $result, $status );
103 + }
104 +
105 + public static function auth(): bool {
106 + return current_user_can( 'manage_options' )
107 + || self::valid_api_key();
108 + }
109 +
110 + private static function valid_api_key(): bool {
111 + $key = get_option( 'dts_api_key' );
112 + $header = sanitize_text_field( $_SERVER['HTTP_X_DTS_KEY'] ?? '' );
113 + return $key && hash_equals( $key, $header );
114 + }
115 +}
116 +// File: includes/class-dts-workflow-step.php
117 +
118 +// Use this when your workflow engine fires an action with step data.
119 +
120 +add_filter( 'wpbot_automator_execute_step', function( array $step_result, array $step_config ) {
121 + if ( ( $step_config['type'] ?? '' ) !== 'data_transformer' ) {
122 + return $step_result;
123 + }
124 +
125 + $action = $step_config['action'] ?? '';
126 + // Resolve dynamic variable from previous step output
127 + $value = dts_resolve_variable( $step_config['value'], $step_result['context'] );
128 + $secret = dts_resolve_variable( $step_config['secret'] ?? '', $step_result['context'] );
129 +
130 + $result = Data_Transformer::run( $action, $value, compact( 'secret' ) );
131 +
132 + $step_result['output'] = $result['output'];
133 + $step_result['success'] = $result['success'];
134 + $step_result['error'] = $result['error'];
135 +
136 + return $step_result;
137 137 }, 10, 2 );