PluginProbe
WebTotem Security / 2.2.1
WebTotem Security v2.2.1
3.0.1 3.0.0 trunk 1.0 1.1 1.2 1.3 1.3.1 1.3.2 1.3.3 2.0 2.1 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.1 2.2.2 2.2.3 2.2.4 All 109 releases
wt-security / services.php

services.php in WebTotem Security 2.2.1, at services.php

278 lines 10.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php defined('ABSPATH') or die("Protected By WT!");
2
3 function wtsec_cmd($cmd, $service, $_service, $uid, $status, $domain = '')
4 {
5 global $wp_filesystem;
6
7 //bug fix with wp file system, which return null
8 if (empty($wp_filesystem)) {
9 require_once(ABSPATH . '/wp-admin/includes/file.php');
10 WP_Filesystem();
11 }
12
13 //retry checking
14 if (empty($wp_filesystem)) {
15 WTSEC_LIBRARY_Session::setNotification("error", "WP FileSystem path error");
16 return false;
17 }
18
19 switch ($cmd) {
20 case $_service . "_install":
21 try {
22 $file = wtsec_generateFile($uid, $service);
23 if (is_null($file['name'])) {
24 WTSEC_LIBRARY_Session::setNotification("error", wtsec_locale("failed_to_download_agent"));
25 return false;
26 }
27 if ($service === "WAF") {
28 $plugin_path = str_replace(ABSPATH, $wp_filesystem->abspath(), WTSEC_INSTALLATION_DIR);
29 $path = $plugin_path;
30 $target_dir = $wp_filesystem->find_folder($path);
31 if (!$wp_filesystem->is_dir($path)) {
32 $wp_filesystem->mkdir($target_dir);
33 }
34 $target_file = trailingslashit($target_dir) . $file['name'];
35 if (!$wp_filesystem->put_contents($target_file, $file['file'], FS_CHMOD_FILE)) {
36 WTSEC_LIBRARY_Session::setNotification("warning", WTSEC_LIBRARY_Localization::lmsg('could_not_install_file', ['service' => $service, 'directory' => $target_dir]));
37 } else {
38 wtsec_app()->set($_service . '_installed_file', $file['name']);
39 }
40 } else {
41 $target_dir = $wp_filesystem->find_folder($wp_filesystem->abspath());
42 $target_file = trailingslashit($target_dir) . $file['name'];
43 if (!$wp_filesystem->put_contents($target_file, $file['file'])) {
44 WTSEC_LIBRARY_Session::setNotification("warning", WTSEC_LIBRARY_Localization::lmsg('could_not_install_file', ['service' => $service, 'directory' => $target_dir]));
45 } else {
46 if ($service === "AM") { wtsec_addCheckFile(); }
47 wtsec_app()->set($_service . '_installed_file', $file['name']);
48 }
49 }
50 if ($service !== "AM") {
51 wtsec_serviceConnect($uid, $service, $domain . '/' . $file['name']);
52 }
53 } catch (Exception $e) {
54 WTSEC_LIBRARY_Session::setNotification("error", $e->getMessage());
55 return false;
56 }
57 break;
58 case $_service . "_start":
59 WTSEC_LIBRARY_WT::changeStatus($status['config_id'], $uid);
60 wtsec_app()->set($_service . '_status', "start");
61 break;
62 case $_service . "_stop":
63 // WTSEC_LIBRARY_WT::changeStatus($status['config_id'],$uid);
64 wtsec_app()->set($_service . '_status', "stop");
65 break;
66 case $_service . "_connect":
67 $file = wtsec_getInstalledFile($_service);
68 if ($file) {
69 wtsec_serviceConnect($uid, $service, $domain . '/' . $file);
70 } else {
71 WTSEC_LIBRARY_Session::setNotification("warning", WTSEC_LIBRARY_Localization::lmsg('file_not_found', ['service' => $service]));
72 }
73 break;
74 case $_service . "_uninstall":
75 try {
76 $file = wtsec_getInstalledFile($_service);
77 if ($service === "WAF") {
78 $plugin_path = str_replace(ABSPATH, $wp_filesystem->abspath(), WTSEC_INSTALLATION_DIR);
79 $mainDir = $plugin_path;
80 } else {
81 $mainDir = $wp_filesystem->abspath();
82 }
83 $target_dir = $wp_filesystem->find_folder($mainDir);
84 $target_file = trailingslashit($mainDir) . $file;
85 if (!$wp_filesystem->delete($target_file)) {
86 WTSEC_LIBRARY_Session::setNotification("warning", WTSEC_LIBRARY_Localization::lmsg('could_not_uninstall_file', ['service' => $service, 'directory' => $target_dir]));
87 }
88 wtsec_app()->set($_service . '_status', "uninstalled");
89 WTSEC_LIBRARY_App::deleteOption($_service . '_installed_file');
90 } catch (Exception $e) {
91 WTSEC_LIBRARY_Session::setNotification("error", $e->getMessage());
92 return false;
93 }
94 break;
95 }
96 return true;
97 }
98
99 // Add check file if plugin is activated
100 function wtsec_addCheckFile(){
101 global $wp_filesystem;
102
103 if (empty($wp_filesystem)) {
104 require_once(ABSPATH . '/wp-admin/includes/file.php');
105 WP_Filesystem();
106 }
107
108 //retry checking
109 if (empty($wp_filesystem)) {
110 WTSEC_LIBRARY_Session::setNotification("error", "WP FileSystem path error");
111 return false;
112 }
113
114 $target_dir = $wp_filesystem->find_folder(WTSEC_PLUGIN_PATH);
115 $target_file = trailingslashit($target_dir) . 'generate.php';
116 $content = '<?php echo rand()?>';
117
118 if ($wp_filesystem->put_contents($target_file, $content, FS_CHMOD_FILE)) {
119 return true;
120 }
121
122 WTSEC_LIBRARY_Session::setNotification("error", "generate fail");
123 return false;
124 }
125
126 function wtsec_checkStatus($id, $service)
127 {
128 $service = ucfirst(strtolower($service));
129 $is_active = null;
130 $config_id = null;
131 $result = WTSEC_LIBRARY_WT::checkStatus($id, $service);
132 $data = $result['data']['auth']['viewer']['sites']['one']['configs'];
133 foreach ($data as &$cfg) {
134 if (!empty($cfg)) {
135 $is_active = $cfg['isActive'];
136 $config_id = $cfg['id'];
137 }
138 }
139
140 if ($is_active === false) {
141 wtsec_app()->set($service . '_connected_' . $id, true);
142 }
143 return ['active' => $is_active, 'config_id' => $config_id];
144 }
145
146 function wtsec_generateFile($id, $service)
147 {
148 if ($service === "AM") {
149 $result = WTSEC_LIBRARY_WT::generateAmFile($id);
150 if (!isset($result['data']['auth']['am']['install'])) {
151 $file = ['filename' => null, "body" => null];
152 } else {
153 $url = $result['data']['auth']['am']['install'];
154 $file = WTSEC_LIBRARY_WT::getFileByUrl($url);
155 if (empty($file)) {
156 $file = WTSEC_LIBRARY_WT::getFileByUrl($url);
157 }
158 }
159
160 $name = $file["filename"];
161 $file = $file["body"];
162 } else {
163 $result = WTSEC_LIBRARY_WT::generateFile($id, $service);
164 $name = $result['data']['auth']['agents']['generate']['agentName'];
165 $file = WTSEC_LIBRARY_WT::requestURL(WTSEC_FILE_URL . '/' . $name);
166 if (empty($file)) {
167 $file = WTSEC_LIBRARY_WT::requestURL(WTSEC_FILE_URL . '/' . $name);
168 }
169 }
170
171 return ['file' => $file, 'name' => $name];
172 }
173
174 function wtsec_serviceConnect($id, $service, $domain = '')
175 {
176 $result = WTSEC_LIBRARY_WT::serviceConnect($id, $service);
177 $status = isset($result['errors']) && !isset($result['data']['auth']['agents']['check']) ? false : true;
178 if (!$status) {
179 WTSEC_LIBRARY_Session::setNotification("warning", WTSEC_LIBRARY_Localization::lmsg('unable_to_connect_to_service', ['service' => $service, 'site' => $domain]));
180 }
181 return $status;
182 }
183
184
185 function wtsec_servicePing($service, $domain = '')
186 {
187 if ($domain == NULL) return false;
188 if (stripos($domain, "http") === false) {
189 $domain = "http://" . $domain;
190 }
191 $args = [
192 'timeout' => '10',
193 'sslverify' => false,
194 'redirection' => 3,
195 ];
196 $response = wp_remote_get($domain, $args);
197 $httpcode = wp_remote_retrieve_response_code($response);
198 if ($httpcode >= 200 && $httpcode < 400) {
199 return true;
200 } else {
201 WTSEC_LIBRARY_Session::setNotification("warning", WTSEC_LIBRARY_Localization::lmsg('unable_to_connect_to_service', ['service' => $service, 'site' => $domain]));
202 return false;
203 }
204 }
205
206 function wtsec_button($label = '', $class = '')
207 {
208 return '<button class="ww-button ' . $class . '">' . $label . '</button>';
209 }
210
211 function wtsec_main_button($label = '', $class = '')
212 {
213 return '<button class="ww-button ' . $class . '">' . $label . '</button>';
214 }
215
216 function wtsec_generateButtons($uid, $_service, $service, $status, $domain = '')
217 {
218 $url = esc_url(admin_url('admin-post.php'));
219 $buttons = [];
220
221 $form = '<form action="' . $url . '" method="post" style="display:inline-block;">
222 <input type="hidden" name="service" value="' . $_service . '">
223 <input type="hidden" name="action" value="ajax_cmd">
224 <input type="hidden" name="uid" value="' . $uid . '">
225 <input type="hidden" name="cmd" value="{{{cmd}}}">{{{button}}}</form>';
226 $result = [];
227 $installedFile = wtsec_checkInstalledFile($_service);
228 $disable_uninstall = false;
229 $first_class = "ww-button--block ";
230
231 if ($service === "AM") {
232 if (!$installedFile['status']) {
233 $cmd = $_service . '_install';
234 $buttons[] = ['place' => 'first', 'button' => wtsec_button(WTSEC_LIBRARY_Localization::lmsg('install'), $first_class . "ww-button--success"), 'cmd' => $cmd];
235 } else {
236 // $url = $domain.'/'.$installedFile['file'];
237 // $connected = wtsec_servicePing($service,$url);
238 if (!$disable_uninstall) {
239 $cmd = $_service . '_uninstall';
240 $buttons[] = ['place' => 'first', 'button' => wtsec_button(WTSEC_LIBRARY_Localization::lmsg('uninstall'), $first_class . "ww-button--attention"), 'cmd' => $cmd];
241 }
242 }
243 } else {
244 if ($service === "WAF") {
245 $first_class = "";
246 }
247
248 if ($status === "not_installed") {
249 $cmd = $_service . '_install';
250 $buttons[] = ['place' => 'first', 'button' => wtsec_button(WTSEC_LIBRARY_Localization::lmsg('install'), $first_class . "ww-button--success"), 'cmd' => $cmd];
251 }
252 }
253
254
255 foreach ($buttons as $btn) {
256 $newform = $form;
257 $newform = str_replace("{{{cmd}}}", $btn['cmd'], $newform);
258 $newform = str_replace("{{{button}}}", $btn['button'], $newform);
259 $result[$btn['place']] = $newform;
260 }
261 return $result;
262 }
263
264 function wtsec_checkInstalledFile($service)
265 {
266 $file = wtsec_getInstalledFile($service);
267 if ($service == "waf") {
268 $root = WTSEC_INSTALLATION_DIR;
269 } else {
270 $root = ABSPATH;
271 }
272 return ['status' => ((bool)$file) && is_file($root . $file), 'file' => $file];
273 }
274
275 function wtsec_getInstalledFile($service)
276 {
277 return wtsec_app()->get($service . "_installed_file");
278 }