PluginProbe
Code Engine – PHP Snippets, AI Functions & Automation for WordPress / 0.4.8
Code Engine – PHP Snippets, AI Functions & Automation for WordPress v0.4.8
0.5.7 0.5.6 0.5.5 0.5.4 0.5.3 0.5.2 0.5.1 0.5.0 0.4.9 0.4.8 0.4.7 0.4.6 trunk 0.0.1 0.0.2 0.2.8 0.2.9 0.3.0 0.3.1 0.3.2 0.3.3 0.3.4 0.3.5 0.3.6 0.3.7 All 33 releases
← All changes | common/rest.php +149 -119 0.2.90.4.8 View file →
@@ -1,136 +1,166 @@
1 1 <?php
2 2
3 -class MeowCommon_Rest
4 -{
5 - private $namespace = "meow-common/v1";
6 - static public $instance = null;
3 +class MeowKit_MWCODE_Rest {
4 + private $namespace = 'meow-common/v1';
5 + public static $instance = null;
7 6
8 - static public function init_once() {
9 - if ( !MeowCommon_Rest::$instance ) {
10 - MeowCommon_Rest::$instance = new self();
11 - }
12 - }
7 + public static function init_once() {
8 + if ( !MeowKit_MWCODE_Rest::$instance ) {
9 + MeowKit_MWCODE_Rest::$instance = new self();
10 + }
11 + }
13 12
14 - private function __construct() {
15 - add_action( 'rest_api_init', array( $this, 'rest_api_init' ) );
16 - }
13 + private function __construct() {
14 + add_action( 'rest_api_init', [ $this, 'rest_api_init' ] );
15 + }
17 16
18 - function rest_api_init() {
19 - if ( !current_user_can( 'manage_options' ) ) {
20 - return;
21 - }
22 - register_rest_route( $this->namespace, '/empty_request/', [
23 - 'methods' => 'POST',
24 - 'permission_callback' => function () {
25 - return current_user_can( 'manage_options' );
26 - },
27 - 'callback' => [ $this, 'empty_request' ]
28 - ]);
29 - register_rest_route( $this->namespace, '/file_operation/', [
30 - 'methods' => 'POST',
31 - 'permission_callback' => function () {
32 - return current_user_can( 'manage_options' );
33 - },
34 - 'callback' => [ $this, 'file_operation' ]
35 - ]);
36 - register_rest_route( $this->namespace, '/sql_request/', [
37 - 'methods' => 'POST',
38 - 'permission_callback' => function () {
39 - return current_user_can( 'manage_options' );
40 - },
41 - 'callback' => [ $this, 'sql_request' ]
42 - ]);
43 - register_rest_route( $this->namespace, '/error_logs/', [
44 - 'methods' => 'POST',
45 - 'permission_callback' => function () {
46 - $ok = current_user_can( 'manage_options' );
47 - return $ok;
48 - },
49 - 'callback' => [ $this, 'rest_error_logs' ]
50 - ]);
51 - register_rest_route( $this->namespace, '/all_settings/', [
52 - 'methods' => 'POST',
53 - 'permission_callback' => function () {
54 - $ok = current_user_can( 'manage_options' );
55 - return $ok;
56 - },
57 - 'callback' => [ $this, 'rest_all_settings' ]
58 - ]);
59 - register_rest_route( $this->namespace, '/update_option/', [
60 - 'methods' => 'POST',
61 - 'permission_callback' => function () {
62 - $ok = current_user_can( 'manage_options' );
63 - return $ok;
64 - },
65 - 'callback' => [ $this, 'rest_update_option' ]
66 - ]);
67 - }
17 + /**
18 + * Capability gate for plugin admin endpoints. Defaults to manage_options but
19 + * honours a per-plugin filter so a site can grant access to other roles
20 + * without re-implementing every permission_callback. The filter name is
21 + * derived from the class name (`MeowKit_<PREFIX>_Rest` => `<prefix>_allow_setup`),
22 + * so each plugin gets its own filter automatically after Nekofy substitution.
23 + */
24 + private function can_setup() {
25 + static $filter = null;
26 + if ( $filter === null ) {
27 + $parts = explode( '_', __CLASS__ );
28 + $prefix = isset( $parts[1] ) ? strtolower( $parts[1] ) : '';
29 + $filter = $prefix !== '' ? $prefix . '_allow_setup' : '';
30 + }
31 + $default = current_user_can( 'manage_options' );
32 + return $filter !== '' ? apply_filters( $filter, $default ) : $default;
33 + }
68 34
69 - function file_rand( $filesize ) {
70 - $tmp_file = tmpfile();
71 - fseek( $tmp_file, $filesize - 1, SEEK_CUR );
72 - fwrite( $tmp_file, 'a');
73 - fclose( $tmp_file );
74 - }
35 + public function rest_api_init() {
36 + if ( !$this->can_setup() ) {
37 + return;
38 + }
39 + $permission = function () {
40 + return $this->can_setup();
41 + };
42 + register_rest_route( $this->namespace, '/empty_request/', [
43 + 'methods' => 'POST',
44 + 'permission_callback' => $permission,
45 + 'callback' => [ $this, 'empty_request' ]
46 + ] );
47 + register_rest_route( $this->namespace, '/file_operation/', [
48 + 'methods' => 'POST',
49 + 'permission_callback' => $permission,
50 + 'callback' => [ $this, 'file_operation' ]
51 + ] );
52 + register_rest_route( $this->namespace, '/sql_request/', [
53 + 'methods' => 'POST',
54 + 'permission_callback' => $permission,
55 + 'callback' => [ $this, 'sql_request' ]
56 + ] );
57 + register_rest_route( $this->namespace, '/error_logs/', [
58 + 'methods' => 'POST',
59 + 'permission_callback' => $permission,
60 + 'callback' => [ $this, 'rest_error_logs' ]
61 + ] );
62 + register_rest_route( $this->namespace, '/all_settings/', [
63 + 'methods' => 'POST',
64 + 'permission_callback' => $permission,
65 + 'callback' => [ $this, 'rest_all_settings' ]
66 + ] );
67 + register_rest_route( $this->namespace, '/update_option/', [
68 + 'methods' => 'POST',
69 + 'permission_callback' => $permission,
70 + 'callback' => [ $this, 'rest_update_option' ]
71 + ] );
72 + register_rest_route( $this->namespace, '/installed_plugins/', [
73 + 'methods' => 'POST',
74 + 'permission_callback' => $permission,
75 + 'callback' => [ $this, 'rest_installed_plugins' ]
76 + ] );
77 + }
75 78
76 - function empty_request() {
79 + public function file_rand( $filesize ) {
80 + $tmp_file = tmpfile();
81 + fseek( $tmp_file, $filesize - 1, SEEK_CUR );
82 + fwrite( $tmp_file, 'a' );
83 + fclose( $tmp_file );
84 + }
85 +
86 + public function empty_request() {
77 87 return new WP_REST_Response( [ 'success' => true ], 200 );
78 - }
79 -
80 - function file_operation() {
81 - $this->file_rand( 1024 * 10 );
88 + }
89 +
90 + public function file_operation() {
91 + $this->file_rand( 1024 * 10 );
82 92 return new WP_REST_Response( [ 'success' => true ], 200 );
83 - }
84 -
85 - function sql_request() {
86 - global $wpdb;
87 - $count = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->posts}" );
93 + }
94 +
95 + public function sql_request() {
96 + global $wpdb;
97 + $count = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->posts}" );
88 98 return new WP_REST_Response( [ 'success' => true, 'data' => $count ], 200 );
89 - }
99 + }
90 100
91 - // List all the options with their default values.
92 - function list_options() {
93 - return array(
94 - 'meowapps_hide_meowapps' => false,
95 - 'force_sslverify' => false
96 - );
97 - }
101 + // List all the options with their default values.
102 + public function list_options() {
103 + return [
104 + 'meowapps_hide_meowapps' => false,
105 + 'force_sslverify' => false
106 + ];
107 + }
98 108
99 - function get_all_options() {
100 - $options = $this->list_options();
101 - $current_options = array();
102 - foreach ( $options as $option => $default ) {
103 - $current_options[$option] = get_option( $option, $default );
104 - }
105 - return $current_options;
106 - }
109 + public function get_all_options() {
110 + $options = $this->list_options();
111 + $current_options = [];
112 + foreach ( $options as $option => $default ) {
113 + $current_options[$option] = get_option( $option, $default );
114 + }
115 + return $current_options;
116 + }
107 117
108 - function rest_all_settings() {
109 - return new WP_REST_Response( [ 'success' => true, 'data' => $this->get_all_options() ], 200 );
110 - }
118 + public function rest_all_settings() {
119 + return new WP_REST_Response( [ 'success' => true, 'data' => $this->get_all_options() ], 200 );
120 + }
111 121
112 - function rest_update_option( $request ) {
113 - $params = $request->get_json_params();
114 - try {
115 - $name = $params['name'];
116 - $options = $this->list_options();
117 - if ( !array_key_exists( $name, $options ) ) {
118 - return new WP_REST_Response([ 'success' => false, 'message' => 'This option does not exist.' ], 200 );
119 - }
120 - $value = is_bool( $params['value'] ) ? ( $params['value'] ? '1' : '' ) : $params['value'];
121 - $success = update_option( $name, $value );
122 - if ( !$success ) {
123 - return new WP_REST_Response( [ 'success' => false, 'message' => 'Could not update option.' ], 200 );
124 - }
125 - return new WP_REST_Response( [ 'success' => true, 'data' => $value ], 200 );
126 - }
127 - catch (Exception $e) {
128 - return new WP_REST_Response( [ 'success' => false, 'message' => $e->getMessage() ], 500 );
129 - }
130 - }
122 + public function rest_installed_plugins() {
123 + if ( !function_exists( 'get_plugins' ) ) {
124 + require_once ABSPATH . 'wp-admin/includes/plugin.php';
125 + }
126 + $all_plugins = get_plugins();
127 + $result = [];
128 + foreach ( $all_plugins as $plugin_file => $plugin_data ) {
129 + // Plugin file looks like "ai-engine/ai-engine.php" — the slug is the
130 + // first path segment. Some plugins live at the root (single file),
131 + // those we just skip; we only care about Meow Apps directories anyway.
132 + $parts = explode( '/', $plugin_file );
133 + if ( count( $parts ) < 2 ) {
134 + continue;
135 + }
136 + $slug = $parts[0];
137 + $result[ $slug ] = is_plugin_active( $plugin_file ) ? 'active' : 'inactive';
138 + }
139 + return new WP_REST_Response( [ 'success' => true, 'data' => $result ], 200 );
140 + }
131 141
132 - function rest_error_logs( $request ) {
133 - return new WP_REST_Response( [ 'success' => true, 'data' => MeowCommon_Helpers::php_error_logs() ], 200 );
134 - }
142 + public function rest_update_option( $request ) {
143 + $params = $request->get_json_params();
144 + try {
145 + $name = $params['name'];
146 + $options = $this->list_options();
147 + if ( !array_key_exists( $name, $options ) ) {
148 + return new WP_REST_Response( [ 'success' => false, 'message' => 'This option does not exist.' ], 200 );
149 + }
150 + $value = is_bool( $params['value'] ) ? ( $params['value'] ? '1' : '' ) : $params['value'];
151 + $success = update_option( $name, $value );
152 + if ( !$success ) {
153 + return new WP_REST_Response( [ 'success' => false, 'message' => 'Could not update option.' ], 200 );
154 + }
155 + return new WP_REST_Response( [ 'success' => true, 'data' => $value ], 200 );
156 + }
157 + catch ( Exception $e ) {
158 + return new WP_REST_Response( [ 'success' => false, 'message' => $e->getMessage() ], 500 );
159 + }
160 + }
161 +
162 + public function rest_error_logs( $request ) {
163 + return new WP_REST_Response( [ 'success' => true, 'data' => MeowKit_MWCODE_Helpers::php_error_logs() ], 200 );
164 + }
135 165
136 166 }