PluginProbe
WebTotem Security / 2.3.14
WebTotem Security v2.3.14
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
← All changes | library/WT.php +135 -40 2.2.22.3.14 View file →
@@ -3,13 +3,14 @@
3 3
4 4 class WTSEC_LIBRARY_WT
5 5 {
6 6
7 - const URL = "https://api.wtotem.com/graphql";
7 + const URL = "https://api.wtotem.com/graphql";
8 8
9 9 public static function auth($key)
10 10 {
11 - $payload = '{"query":"mutation{ guest{ apiKeys{ auth(apiKey:\"' . $key . '\"),{ token{ value,refreshToken,expiresIn } } } } }"}';
11 + $source = get_site_url();
12 + $payload = '{"query":"mutation{ guest{ apiKeys{ auth(apiKey:\"' . $key . '\", source:\"' . $source . '\"),{ token{ value,refreshToken,expiresIn } } } } }"}';
12 13 return self::requestApi($payload);
13 14 }
14 15
15 16 protected static function requestApi($payload, $token = false, $repeat = false)
@@ -16,8 +17,28 @@
16 17 {
17 18 if ($token) {
18 19 $token = WTSEC_LIBRARY_App::getToken();
19 20 }
21 +
22 + $token_expired = wtsec_app()->get("token_expired");
23 +
24 + if($token_expired && $token_expired <= time()){
25 + $token_expired = wtsec_app()->get("token_expired");
26 + if($token_expired <= time()){
27 + $result = WTSEC_LIBRARY_WT::auth(wtsec_app()->get("api_key"));
28 + if (isset($result['data']['guest']['apiKeys']['auth']['token']['value'])) {
29 + $expiresIn = $result['data']['guest']['apiKeys']['auth']['token']['expiresIn'];
30 + wtsec_app()->set("token_expired", time() + $expiresIn - 60);
31 +
32 + $token_ = $result['data']['guest']['apiKeys']['auth']['token']['value'];
33 + WTSEC_LIBRARY_App::login($token_);
34 + return self::requestApi($payload, $token, true);
35 + } else {
36 + WTSEC_LIBRARY_App::logout();
37 + }
38 + }
39 + }
40 +
20 41 $args = [
21 42 'body' => $payload,
22 43 'timeout' => '60',
23 44 'sslverify' => false,
@@ -36,21 +57,11 @@
36 57 $response = wp_remote_retrieve_body($response);
37 58 $result = json_decode($response, true);
38 59 if (isset($result['errors'][0]['message'])) {
39 60 $message = self::diffMesageForHuman($result['errors'][0]['message']);
40 - if (stripos($result['errors'][0]['message'], "token") !== false && !$repeat) {
41 - $result = WTSEC_LIBRARY_WT::auth(wtsec_app()->get("api_key"));
42 - if (isset($result['data']['guest']['apiKeys']['auth']['token']['value'])) {
43 - $token_ = $result['data']['guest']['apiKeys']['auth']['token']['value'];
44 - WTSEC_LIBRARY_App::login($token_);
45 - return self::requestApi($payload, $token, true);
46 - } else {
47 - WTSEC_LIBRARY_App::logout();
48 - }
49 - } else {
50 - if ($message !== false) {
51 - WTSEC_LIBRARY_Session::setNotification("warning", $message);
52 - }
61 +
62 + if ($message !== false) {
63 + WTSEC_LIBRARY_Session::setNotification("warning", $message);
53 64 }
54 65 }
55 66 return $result;
56 67 }
@@ -117,8 +128,16 @@
117 128 $response = wp_remote_retrieve_body($response);
118 129 return ["body" => $response, "filename" => $fileName];
119 130 }
120 131
132 +
133 + public static function getEmail(){
134 + $payload = '{"query":"query { auth { viewer { email __typename } __typename } }"}';
135 + $result = self::requestApi($payload, true);
136 +
137 + return $result['data']['auth']['viewer']['email'];
138 + }
139 +
121 140 public static function getOwnSite($attempt = false)
122 141 {
123 142 $payload = '{"query":"query getSites { auth { viewer { sites { ...sites __typename } __typename } __typename }}fragment sites on SiteQueries { list(filter: {}) { edges { node { id hostname title ssl { status __typename } availability { status __typename } reputation { status __typename } ports { status __typename } deface { status __typename } domain { status __typename } antivirus { status __typename } firewall { status __typename } maliciousScript { stack { name __typename } __typename } __typename } __typename } __typename } __typename}"}';
124 143
@@ -127,11 +146,9 @@
127 146 //mutator
128 147 foreach ($result['data']['auth']['viewer']['sites']['list']['edges'] as &$m) {
129 148 if (isset($m['node']['hostname'])) {
130 149 $m['node']['hostname'] = WTSEC_LIBRARY_Idn::idn_to_utf8($m['node']['hostname']);
131 -// if ($m['node']['id'] == "c2l0ZV8yNTg=") {
132 -// return $m['node'];
133 -// }
150 +
134 151 if (self::isSiteUrl($m['node']['hostname'])) {
135 152 return $m['node'];
136 153 }
137 154 }
@@ -160,13 +177,13 @@
160 177 }
161 178
162 179 public static function getAllChecks($host_id)
163 180 {
164 - $from = time() - (60 * 60 * 24);
181 + $from = time() - (60 * 60 * 24 * 7);
165 182 $to = time();
166 183 $from_waf = time() - (60 * 60 * 24 * 30);
167 - $payload = '{"query":"query($id: ID!, $dateRange: DateRangeInput!) { auth { viewer { sites { one(id: $id) { ports { status ip tcp lastTest { time } } availability { status lastTest { time } responseTime downTime(dateRange: $dateRange) percent(dateRange: $dateRange) } deface { status lastTest { time } words count } domain { status registrar owner email createdDate expiredDate } ports { status lastTest { time } ip tcp country } ssl { status daysLeft expiryDate issueDate } reputation { status lastTest { time } virusList { virus{ type path } antiVirus } } firewall { lastTest { time } status chart(dateRange: $dateRange) { time attacks blocked } report(dateRange: $dateRange) { time attacks ip } } maliciousScript { lastTest { time } status } antivirus { status stats { changed deleted scaned infected error } lastTest { time } isFirstCheck } } } } } }","variables":{"id":"' . $host_id . '","dateRange":{"to":' . $to . ',"from":' . $from_waf . '}}}';
168 -// $payload = '{"query":"query($id: ID!, $dateRange:DateRangeInput!) {\n auth {\n viewer {\n sites {\n one(id: $id) {\n ports{\n status\n ip\n tcp\n lastTest{\n time\n }\n }\n availability {\n status\n lastTest {\n time\n }\n responseTime\n downTime(dateRange: $dateRange)\n percent(dateRange: $dateRange)\n }\n deface {\n status\n lastTest {\n time\n }\n words\n count\n }\n domain {\n status\n registrar\n owner\n email\n createdDate\n expiredDate\n }\n ports {\n status\n lastTest {\n time\n }\n ip\n tcp\n country\n }\n ssl {\n status\n daysLeft\n expiryDate\n issueDate\n }\n reputation {\n status\n lastTest {\n time\n }\n virusList {\n viruses\n antiVirus\n }\n }\n firewall {\n lastTest { \n time\n } \n status\n logs{\n edges\n{\n node{\n status\n country\n type\n}\n}\n}\n chart(dateRange: $dateRange) {\n time\n attacks\n blocked\n }\n report(dateRange: $dateRange) {\n time\n attacks\n ip\n }\n }\n maliciousScript{\n lastTest{\n time\n }\n status\n }\n antivirus{\n status \n stats { \n changed\n deleted\n scaned\n infected\n error\n } \n lastTest { \n time\n } \n isFirstCheck\n }\n }\n }\n }\n }\n}","variables":{"id":"' . $host_id . '","dateRange":{"to":' . $to . ',"from":' . $from_waf . '}}}';
184 + $language = WTSEC_LANGUAGE;
185 + $payload = '{"query":"query($id: ID!, $dateRange: DateRangeInput!, $language: Language!, $dateRangeWeek: DateRangeInput!, $wafLogFilter: WafLogFilter!) { auth { viewer { sites { one(id: $id) { ports { status ip tcp lastTest { time } } availability { status lastTest { time } responseTime downTime(dateRange: $dateRange) percent(dateRange: $dateRange) } deface { status lastTest { time } words count } domain { status registrar owner email createdDate expiredDate } ports { status lastTest { time } ip tcp country } ssl { status daysLeft expiryDate issueDate } reputation { status lastTest { time } virusList { virus{ type path } antiVirus } } firewall { lastTest { time } logs(wafLogFilter: $wafLogFilter){ edges{ node{ type blocked payload ip location{ country{ nameEn } } time request status country category } } } map(dateRange: $dateRange) { attacks, country } status chart(dateRange: $dateRange) { time attacks blocked } report(dateRange: $dateRange) { time attacks ip } } serverStatus { info { phpVersion phpServerUser phpServerSoftware phpGatewayInterface phpServerProtocol osInfo cpuCount cpuModel CpuFreq cpuFamily lsCpu maxExecTime mathLibraries } ramChart(dateRange: $dateRangeWeek){ total value time } cpuChart(dateRange: $dateRangeWeek){ value time } discUsage{ total free } status } maliciousScript { lastTest { time } status } scoring( language: $language ){ score lastTest{ time } result{ ip country isHigherThan }} agentManager{ createdAt } antivirus { status stats { changed deleted scaned infected error } lastTest { time } isFirstCheck } } } } } }","variables":{"id":"' . $host_id . '","dateRange":{"to":' . $to . ',"from":' . $from_waf . '}, "dateRangeWeek":{"to":' . $to . ',"from":' . $from . '}, "wafLogFilter": {"order":{"direction":"DESC","field":"time"},"pagination":{"first":5,"cursor":null}}, "language":"'.$language.'"}}';
169 186 $response = self::requestApi($payload, true);
170 187 if (isset($response['data']['auth']['viewer']['sites']['one'])) {
171 188 return $response['data']['auth']['viewer']['sites']['one'];
172 189 }
@@ -172,8 +189,40 @@
172 189 }
173 190 return [];
174 191 }
175 192
193 + public static function getFirewall($host_id, $limit = 20, $cursor = null, $days = 365)
194 + {
195 + $from = (is_array($days)) ? $days['from'] : time() - (60 * 60 * 24 * $days);
196 + $to = (is_array($days)) ? $days['to'] : time();
197 + $cursor = ($cursor == null) ? 'null' : '"'.$cursor.'"';
198 +
199 + $payload = '{"operationName":"FirewallAttackLog","variables":{"dateRange":{"to":'.$to.',"from":'.$from.'},"id":"'.$host_id.'","wafLogFilter":{"dateRange":{"to":'.$to.',"from":'.$from.'},"order":{"direction":"DESC","field":"time"},"pagination":{"first":'.$limit.',"cursor":' . $cursor . '}}},"query":"query FirewallAttackLog($id: ID!, $wafLogFilter: WafLogFilter!, $dateRange: DateRangeInput!) { auth { viewer { sites { one(id: $id) { firewall { lastTest { time } settings{ gdn dosProtection dosLimit loginAttemptsProtection loginAttemptsLimit } status... FirewallLogFragment map(dateRange: $dateRange) { attacks, country } __typename } __typename } __typename } __typename } __typename } } fragment FirewallLogFragment on Waf { logs(wafLogFilter: $wafLogFilter) { edges { cursor node { type blocked payload ip location { country { nameEn __typename } __typename } time request status country category __typename } __typename } pageInfo { endCursor hasNextPage __typename } __typename } __typename }"}';
200 + $res = self::requestApi($payload, true);
201 +
202 + return $res;
203 + }
204 +
205 +
206 + public static function getAntivirus($host_id, $limit = 10, $cursor = null, $days = 365, $event = 'new')
207 + {
208 + $from = (is_array($days)) ? $days['from'] : time() - (60 * 60 * 24 * $days);
209 + $to = (is_array($days)) ? $days['to'] : time();
210 + $cursor = ($cursor == null) ? 'null' : '"' . $cursor . '"';
211 + $payload = '{"operationName":null,"variables":{"id":"' . $host_id . '","avLogFilter":{"event":"'.$event.'","dateRange":{"to":'.$to.',"from":'.$from.'},"order":{"direction":"DESC","field":"time"},"pagination":{"first":' . $limit . ',"cursor":' . $cursor . '}}},"query":"query ($id: ID!, $avLogFilter: AvLogFilter!) { auth { viewer { sites { one(id: $id) { id ... on Site { configs { ... on AvConfig { isActive id } } } antivirus { status log(avLogFilter: $avLogFilter) { edges { node { filePath matches event signatures time permissions permissionsChanged } } pageInfo { endCursor hasNextPage __typename } } lastTest { time } stats { changed deleted scaned infected } } } } } } }"}';
212 + return self::requestApi($payload, true);
213 + }
214 +
215 + public static function getFirewallChart($host_id, $days = 7)
216 + {
217 + $to = time();
218 + $from_waf = ($days <= 1) ? strtotime(date('Y-m-d 00:00:01')) : time() - (60 * 60 * 24 * $days);
219 +
220 + $payload = '{ "query":"query($id: ID!, $dateRange: DateRangeInput!, $wafLogFilter: WafLogFilter!) { auth { viewer { sites { one(id: $id) { firewall { lastTest { time } status logs(wafLogFilter: $wafLogFilter) { edges { node { status country type userAgent } } } chart(dateRange: $dateRange) { time attacks blocked } report(dateRange: $dateRange) { time attacks ip } } } } } } }", "operationName":null,"variables":{"id":"' . $host_id . '","dateRange":{"to":' . $to . ',"from":' . $from_waf . '}, "wafLogFilter": { "dateRange": { "from": ' .$from_waf. ', "to": ' .$to. ' }, "pagination": { "cursor": null }, "order": { "direction": "DESC", "field": "time" } } } }';
221 + $response = self::requestApi($payload, true);
222 + return $response['data']['auth']['viewer']['sites']['one']['firewall']['chart'];
223 + }
224 +
176 225 public static function changeStatus($config_id, $host_id)
177 226 {
178 227 $payload = '{"query":"\n mutation {\n toggleServiceConfig(\n id: ' . $config_id . '\n userhostId: ' . $host_id . '\n ) {\n isActive\n }\n }\n "}';
179 228 return self::requestApi($payload, true);
@@ -196,8 +245,14 @@
196 245 $payload = '{ "operationName":null, "variables":{}, "query":"mutation { auth { am { install(siteId: \"'.$id.'\"){ downloadLink, amFilename, wafFilename, avFilename } } } }"}';
197 246 return self::requestApi($payload, true);
198 247 }
199 248
249 + public static function deleteAm($id)
250 + {
251 + $payload = '{ "query":"mutation { auth { am { delete(siteId: \"'.$id.'\") } } }"}';
252 + return self::requestApi($payload, true);
253 + }
254 +
200 255 public static function checkStatus($id, $service)
201 256 {
202 257 $payload = '{"operationName":null,"variables":{"id":"' . $id . '"},"query":"query ($id: ID!) {\n auth {\n viewer {\n sites {\n one(id: $id) {\n ... on Site {\n configs {\n ... on ' . $service . 'Config {\n isActive\n id\n }\n }\n }\n }\n }\n }\n }\n}\n"}';
203 258 return self::requestApi($payload, true);
@@ -202,43 +257,76 @@
202 257 $payload = '{"operationName":null,"variables":{"id":"' . $id . '"},"query":"query ($id: ID!) {\n auth {\n viewer {\n sites {\n one(id: $id) {\n ... on Site {\n configs {\n ... on ' . $service . 'Config {\n isActive\n id\n }\n }\n }\n }\n }\n }\n }\n}\n"}';
203 258 return self::requestApi($payload, true);
204 259 }
205 260
206 - public static function getAntivirus($host_id, $limit = 10, $cursor = null, $days = 365, $event = 'infected')
261 +
262 + public static function getQuarantineList($host_id)
207 263 {
208 - $from = (is_array($days)) ? $days['begin'] : time() - (60 * 60 * 24 * $days);
209 - $to = (is_array($days)) ? $days['end'] : time();
264 + $payload = '{"query":"query{ auth{ viewer{ sites{ one(id:\"'.$host_id.'\"){ antivirus{ quarantine{ id path date } } } } } } } "}';
265 + return self::requestApi($payload, true);
266 + }
267 +
268 + public static function moveToQuarantine($host_id, $path)
269 + {
270 + $payload = '{"query":"mutation{ auth{ sites{ av{ moveToQuarantine(input:{ siteId:\"'.$host_id.'\", path:\"'.$path.'\" }) } } } } "}';
271 + return self::requestApi($payload, true);
272 + }
273 +
274 + public static function moveFromQuarantine($id)
275 + {
276 + $payload = '{"query":"mutation{ auth{ sites{ av{ moveFromQuarantine(id: \"'.$id.'\") } } } } "}';
277 + return self::requestApi($payload, true);
278 + }
279 +
280 + public static function reportsList($host_id, $limit = 10, $cursor = null)
281 + {
210 282 $cursor = ($cursor == null) ? 'null' : '"' . $cursor . '"';
211 - $payload = '{"operationName":null,"variables":{"id":"' . $host_id . '","avLogFilter":{"event":"'.$event.'","dateRange":{"to":'.$to.',"from":'.$from.'},"order":{"direction":"DESC","field":"time"},"pagination":{"first":' . $limit . ',"cursor":' . $cursor . '}}},"query":"query ($id: ID!, $avLogFilter: AvLogFilter!) { auth { viewer { sites { one(id: $id) { id ... on Site { configs { ... on AvConfig { isActive id } } } antivirus { status log(avLogFilter: $avLogFilter) { edges { node { filePath matches event signatures time } } pageInfo { endCursor hasNextPage __typename } } lastTest { time } stats { changed deleted scaned infected } } } } } } }"}';
283 + $payload = '{"variables":{ "filter": { "order": { "direction": "DESC", "field": "created_at"}, "siteId":"'.$host_id.'", "pagination":{"first":' . $limit . ', "cursor":' . $cursor . '} } },"query":"query ReportsQuery($filter: ReportListFilter!) { auth { viewer { reports { list(filter: $filter) { edges { node { id site { hostname } createdAt wa dc ps rc sc av waf } cursor } pageInfo { endCursor hasNextPage } } } } } }"}';
212 284 return self::requestApi($payload, true);
213 285 }
214 286
215 - public static function getOptions($host_id)
287 + public static function reportGenerate($host_id, $period, $services, $language = "en")
216 288 {
217 - $payload = '{"query":"query{\nuserHost(id:' . $host_id . '){\n id\n title\n hostname\n stack\n createdAt\n services {\n id\n name\n configs {\n id\n \tdata\n isActive\n }\n }\n }\n}"}';
289 + $from = (is_array($period)) ? $period['from'] : time() - (60 * 60 * 24 * $period);
290 + $to = (is_array($period)) ? $period['to'] : time();
291 + $payload = '{"query":"query ($input: GenerateReportInput) { auth { viewer { reports { generate(input: $input) } } } }", "variables":{ "input": { "siteId": "' . $host_id . '", "from": ' . $from . ', "to": ' . $to . ', "wa": '.$services['wa'].', "dc": '.$services['dc'].', "ps": '.$services['ps'].', "rc": '.$services['rc'].', "sc": '.$services['sc'].', "av": '.$services['av'].', "waf": '.$services['waf'].', "language": "'.$language.'" } } }';
292 +
218 293 return self::requestApi($payload, true);
219 294 }
220 295
221 - public static function getFirewall($host_id, $limit = 20, $cursor = null, $days = 365)
296 + public static function reportDownload($id)
222 297 {
223 - $from = (is_array($days)) ? $days['begin'] : time() - (60 * 60 * 24 * $days);
224 - $to = (is_array($days)) ? $days['end'] : time();
225 - $cursor = ($cursor == null) ? 'null' : '"'.$cursor.'"';
298 + $payload = '{"query": "query { auth { viewer { reports { download(id: \"' . $id . '\") } } } }"}';
299 + return self::requestApi($payload, true);
300 + }
226 301
227 - $payload = '{"operationName":"FirewallAttackLog","variables":{"dateRange":{"to":'.$to.',"from":'.$from.'},"id":"'.$host_id.'","wafLogFilter":{"dateRange":{"to":'.$to.',"from":'.$from.'},"order":{"direction":"DESC","field":"time"},"pagination":{"first":'.$limit.',"cursor":' . $cursor . '}}},"query":"query FirewallAttackLog($id: ID!, $wafLogFilter: WafLogFilter!, $dateRange: DateRangeInput!) { auth { viewer { sites { one(id: $id) { firewall { lastTest { time } status... FirewallLogFragment map(dateRange: $dateRange) { attacks, country } __typename } __typename } __typename } __typename } __typename } } fragment FirewallLogFragment on Waf { logs(wafLogFilter: $wafLogFilter) { edges { cursor node { type blocked payload ip location { country { nameEn __typename } __typename } time request status country category __typename } __typename } pageInfo { endCursor hasNextPage __typename } __typename } __typename }"}';
228 - $res = self::requestApi($payload, true);
302 + public static function getConfigs($host_id)
303 + {
304 + $payload = '{"query":"query{ auth{ viewer{ sites{ one(id:\"'.$host_id.'\"){ configs{ ... on WaConfig { id service isActive } ... on AvConfig { id service isActive } ... on DcConfig { id service isActive } ... on DecConfig { id service isActive } ... on RcConfig { id service isActive } ... on CmsConfig { id service isActive } ... on PsConfig { id service isActive } ... on WafConfig { id service isActive } } } } } } } "}';
305 + return self::requestApi($payload, true);
306 + }
229 307
230 - return $res;
308 + public static function toggleConfigs($service_id)
309 + {
310 + $payload = '{"query":"mutation{ auth{ configs{ toggle(id: \"'.$service_id.'\"){ ... on WaConfig { service isActive } ... on AvConfig { service isActive } ... on DcConfig { service isActive } ... on DecConfig { service isActive } ... on RcConfig { service isActive } ... on CmsConfig { service isActive } ... on PsConfig { service isActive } ... on WafConfig { service isActive } } } } } "}';
311 + return self::requestApi($payload, true);
231 312 }
232 313
233 - public static function getFirewallChart($host_id, $days = 7)
314 + public static function wafSettings($host_id, $settings)
234 315 {
316 + $payload = '{"variables":{"input": {"siteId": "'.$host_id.'", "gdn": '. $settings['gdn'] .', "dosProtection": '.$settings['dosProtection'].', "dosLimit": '.$settings['dosLimit'].', "loginAttemptsProtection": '.$settings['loginAttemptsProtection'].', "loginAttemptsLimit": '.$settings['loginAttemptsLimit'].'}},"query":"mutation WafSettings($input: WafSettingsInput!) { auth { sites { waf{ settings(input: $input) { gdn dosProtection loginAttemptsProtection dosLimit loginAttemptsLimit } } } } }"}';
317 + return self::requestApi($payload, true);
318 + }
319 +
320 + public static function getServerStatusChart($host_id, $days = 7)
321 + {
235 322 $to = time();
236 - $from_waf = ($days <= 1) ? strtotime(date('Y-m-d 00:00:01')) : time() - (60 * 60 * 24 * $days);
323 + $from = ($days <= 1) ? strtotime(date('Y-m-d 00:00:01')) : time() - (60 * 60 * 24 * $days);
237 324
238 - $payload = '{ "query":"query($id: ID!, $dateRange: DateRangeInput!, $wafLogFilter: WafLogFilter!) { auth { viewer { sites { one(id: $id) { firewall { lastTest { time } status logs(wafLogFilter: $wafLogFilter) { edges { node { status country type userAgent } } } chart(dateRange: $dateRange) { time attacks blocked } report(dateRange: $dateRange) { time attacks ip } } } } } } }", "operationName":null,"variables":{"id":"' . $host_id . '","dateRange":{"to":' . $to . ',"from":' . $from_waf . '}, "wafLogFilter": { "dateRange": { "from": ' .$from_waf. ', "to": ' .$to. ' }, "pagination": { "cursor": null }, "order": { "direction": "DESC", "field": "time" } } } }';
325 + $payload = '{ "query":"query($id: ID!, $dateRange: DateRangeInput!) { auth { viewer { sites { one(id: $id) { serverStatus { ramChart(dateRange: $dateRange){ total value time } cpuChart(dateRange: $dateRange){ value time } } } } } } }", "variables":{"id":"' . $host_id . '","dateRange":{"to":' . $to . ',"from":' . $from . '} } }';
239 326
240 - return self::requestApi($payload, true);
327 + $response = self::requestApi($payload, true);
328 + return $response['data']['auth']['viewer']['sites']['one']['serverStatus'];
241 329 }
242 330
243 331 public static function getStatusIcon($status)
244 332 {
@@ -252,8 +340,13 @@
252 340 "text" => WTSEC_LIBRARY_Localization::lmsg('statuses.pending'),
253 341 "color" => self::getColor("grey"),
254 342 "image" => "loading.svg"
255 343 ],
344 + "pause" => [
345 + "text" => WTSEC_LIBRARY_Localization::lmsg('statuses.pause'),
346 + "color" => self::getColor("grey"),
347 + "image" => "warning.svg"
348 + ],
256 349 "expired" => [
257 350 "text" => WTSEC_LIBRARY_Localization::lmsg('statuses.expired'),
258 351 "color" => self::getColor("orange"),
259 352 "image" => "warning.svg"
@@ -335,11 +428,13 @@
335 428 "image" => "check-mark.svg"
336 429 ],
337 430 ];
338 431 if (isset($statuses[$status])) {
339 - return ["image" => $statuses[$status]["image"], "icon" => $statuses[$status]["color"]["icon"], "color" => $statuses[$status]["color"]["color"], "text" => "<span class='" . $statuses[$status]["color"]["color"] . "'>" . $statuses[$status]["text"] . "</span>"];
432 + $statuses[$status]['type'] = $status;
433 + $statuses[$status]["text"] = "<span data-status='$status' class='" . $statuses[$status]["color"]["color"] . "'>" . $statuses[$status]["text"] . "</span>";
434 + return $statuses[$status];
340 435 } else {
341 - return ["image" => "warning.svg", "icon" => "ww-icon--status_unknow", "color" => "ww--status_unknow", "text" => "<span class='ww--status_unknow'>Unknown status</span>"];
436 + return ["image" => "warning.svg", "color" => "ww--status_unknow", "text" => "<span class='ww--status_unknow'>Unknown status</span>"];
342 437 }
343 438 }
344 439
345 440 public static function getColor($type)