PluginProbe
WebTotem Security / 2.1.9
WebTotem Security v2.1.9
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.1.9, at services.php

250 lines 9.8 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 wtsec_app()->set($_service . '_installed_file', $file['name']);
47 }
48 }
49 if ($service !== "AM") {
50 wtsec_serviceConnect($uid, $service, $domain . '/' . $file['name']);
51 }
52 } catch (Exception $e) {
53 WTSEC_LIBRARY_Session::setNotification("error", $e->getMessage());
54 return false;
55 }
56 break;
57 case $_service . "_start":
58 WTSEC_LIBRARY_WT::changeStatus($status['config_id'], $uid);
59 wtsec_app()->set($_service . '_status', "start");
60 break;
61 case $_service . "_stop":
62 // WTSEC_LIBRARY_WT::changeStatus($status['config_id'],$uid);
63 wtsec_app()->set($_service . '_status', "stop");
64 break;
65 case $_service . "_connect":
66 $file = wtsec_getInstalledFile($_service);
67 if ($file) {
68 wtsec_serviceConnect($uid, $service, $domain . '/' . $file);
69 } else {
70 WTSEC_LIBRARY_Session::setNotification("warning", WTSEC_LIBRARY_Localization::lmsg('file_not_found', ['service' => $service]));
71 }
72 break;
73 case $_service . "_uninstall":
74 try {
75 $file = wtsec_getInstalledFile($_service);
76 if ($service === "WAF") {
77 $plugin_path = str_replace(ABSPATH, $wp_filesystem->abspath(), WTSEC_INSTALLATION_DIR);
78 $mainDir = $plugin_path;
79 } else {
80 $mainDir = $wp_filesystem->abspath();
81 }
82 $target_dir = $wp_filesystem->find_folder($mainDir);
83 $target_file = trailingslashit($mainDir) . $file;
84 if (!$wp_filesystem->delete($target_file)) {
85 WTSEC_LIBRARY_Session::setNotification("warning", WTSEC_LIBRARY_Localization::lmsg('could_not_uninstall_file', ['service' => $service, 'directory' => $target_dir]));
86 }
87 wtsec_app()->set($_service . '_status', "uninstalled");
88 WTSEC_LIBRARY_App::deleteOption($_service . '_installed_file');
89 } catch (Exception $e) {
90 WTSEC_LIBRARY_Session::setNotification("error", $e->getMessage());
91 return false;
92 }
93 break;
94 }
95 return true;
96 }
97
98 function wtsec_checkStatus($id, $service)
99 {
100 $service = ucfirst(strtolower($service));
101 $is_active = null;
102 $config_id = null;
103 $result = WTSEC_LIBRARY_WT::checkStatus($id, $service);
104 $data = $result['data']['auth']['viewer']['sites']['one']['configs'];
105 foreach ($data as &$cfg) {
106 if (!empty($cfg)) {
107 $is_active = $cfg['isActive'];
108 $config_id = $cfg['id'];
109 }
110 }
111
112 if ($is_active === false) {
113 wtsec_app()->set($service . '_connected_' . $id, true);
114 }
115 return ['active' => $is_active, 'config_id' => $config_id];
116 }
117
118 function wtsec_generateFile($id, $service)
119 {
120 if ($service === "AM") {
121 $result = WTSEC_LIBRARY_WT::generateAmFile($id);
122 if (!isset($result['data']['auth']['am']['install'])) {
123 $file = ['filename' => null, "body" => null];
124 } else {
125 $url = $result['data']['auth']['am']['install'];
126 $file = WTSEC_LIBRARY_WT::getFileByUrl($url);
127 if (empty($file)) {
128 $file = WTSEC_LIBRARY_WT::getFileByUrl($url);
129 }
130 }
131
132 $name = $file["filename"];
133 $file = $file["body"];
134 } else {
135 $result = WTSEC_LIBRARY_WT::generateFile($id, $service);
136 $name = $result['data']['auth']['agents']['generate']['agentName'];
137 $file = WTSEC_LIBRARY_WT::requestURL(WTSEC_FILE_URL . '/' . $name);
138 if (empty($file)) {
139 $file = WTSEC_LIBRARY_WT::requestURL(WTSEC_FILE_URL . '/' . $name);
140 }
141 }
142
143 return ['file' => $file, 'name' => $name];
144 }
145
146 function wtsec_serviceConnect($id, $service, $domain = '')
147 {
148 $result = WTSEC_LIBRARY_WT::serviceConnect($id, $service);
149 $status = isset($result['errors']) && !isset($result['data']['auth']['agents']['check']) ? false : true;
150 if (!$status) {
151 WTSEC_LIBRARY_Session::setNotification("warning", WTSEC_LIBRARY_Localization::lmsg('unable_to_connect_to_service', ['service' => $service, 'site' => $domain]));
152 }
153 return $status;
154 }
155
156
157 function wtsec_servicePing($service, $domain = '')
158 {
159 if ($domain == NULL) return false;
160 if (stripos($domain, "http") === false) {
161 $domain = "http://" . $domain;
162 }
163 $args = [
164 'timeout' => '10',
165 'sslverify' => false,
166 'redirection' => 3,
167 ];
168 $response = wp_remote_get($domain, $args);
169 $httpcode = wp_remote_retrieve_response_code($response);
170 if ($httpcode >= 200 && $httpcode < 400) {
171 return true;
172 } else {
173 WTSEC_LIBRARY_Session::setNotification("warning", WTSEC_LIBRARY_Localization::lmsg('unable_to_connect_to_service', ['service' => $service, 'site' => $domain]));
174 return false;
175 }
176 }
177
178 function wtsec_button($label = '', $class = '')
179 {
180 return '<button class="ww-button ' . $class . '">' . $label . '</button>';
181 }
182
183 function wtsec_main_button($label = '', $class = '')
184 {
185 return '<button class="ww-button ' . $class . '">' . $label . '</button>';
186 }
187
188 function wtsec_generateButtons($uid, $_service, $service, $status, $domain = '')
189 {
190 $url = esc_url(admin_url('admin-post.php'));
191 $buttons = [];
192
193 $form = '<form action="' . $url . '" method="post" style="display:inline-block;">
194 <input type="hidden" name="service" value="' . $_service . '">
195 <input type="hidden" name="action" value="ajax_cmd">
196 <input type="hidden" name="uid" value="' . $uid . '">
197 <input type="hidden" name="cmd" value="{{{cmd}}}">{{{button}}}</form>';
198 $result = [];
199 $installedFile = wtsec_checkInstalledFile($_service);
200 $disable_uninstall = false;
201 $first_class = "ww-button--block ";
202
203 if ($service === "AM") {
204 if (!$installedFile['status']) {
205 $cmd = $_service . '_install';
206 $buttons[] = ['place' => 'first', 'button' => wtsec_button(WTSEC_LIBRARY_Localization::lmsg('install'), $first_class . "ww-button--success"), 'cmd' => $cmd];
207 } else {
208 // $url = $domain.'/'.$installedFile['file'];
209 // $connected = wtsec_servicePing($service,$url);
210 if (!$disable_uninstall) {
211 $cmd = $_service . '_uninstall';
212 $buttons[] = ['place' => 'first', 'button' => wtsec_button(WTSEC_LIBRARY_Localization::lmsg('uninstall'), $first_class . "ww-button--attention"), 'cmd' => $cmd];
213 }
214 }
215 } else {
216 if ($service === "WAF") {
217 $first_class = "";
218 }
219
220 if ($status === "not_installed") {
221 $cmd = $_service . '_install';
222 $buttons[] = ['place' => 'first', 'button' => wtsec_button(WTSEC_LIBRARY_Localization::lmsg('install'), $first_class . "ww-button--success"), 'cmd' => $cmd];
223 }
224 }
225
226
227 foreach ($buttons as $btn) {
228 $newform = $form;
229 $newform = str_replace("{{{cmd}}}", $btn['cmd'], $newform);
230 $newform = str_replace("{{{button}}}", $btn['button'], $newform);
231 $result[$btn['place']] = $newform;
232 }
233 return $result;
234 }
235
236 function wtsec_checkInstalledFile($service)
237 {
238 $file = wtsec_getInstalledFile($service);
239 if ($service == "waf") {
240 $root = WTSEC_INSTALLATION_DIR;
241 } else {
242 $root = ABSPATH;
243 }
244 return ['status' => ((bool)$file) && is_file($root . $file), 'file' => $file];
245 }
246
247 function wtsec_getInstalledFile($service)
248 {
249 return wtsec_app()->get($service . "_installed_file");
250 }