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 +120 -47 2.2.42.3.14 View file →
@@ -3,15 +3,14 @@
3 3
4 4 class WTSEC_LIBRARY_WT
5 5 {
6 6
7 - const URL = "https://api.wtotem.com/graphql";
8 -// const URL = "https://api-1.2ke2xgwx4.wtotem.net/graphql";
9 -// const URL = "https://api.webtotem.kz/graphql";
7 + const URL = "https://api.wtotem.com/graphql";
10 8
11 9 public static function auth($key)
12 10 {
13 - $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 } } } } }"}';
14 13 return self::requestApi($payload);
15 14 }
16 15
17 16 protected static function requestApi($payload, $token = false, $repeat = false)
@@ -18,8 +17,28 @@
18 17 {
19 18 if ($token) {
20 19 $token = WTSEC_LIBRARY_App::getToken();
21 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 +
22 41 $args = [
23 42 'body' => $payload,
24 43 'timeout' => '60',
25 44 'sslverify' => false,
@@ -38,21 +57,11 @@
38 57 $response = wp_remote_retrieve_body($response);
39 58 $result = json_decode($response, true);
40 59 if (isset($result['errors'][0]['message'])) {
41 60 $message = self::diffMesageForHuman($result['errors'][0]['message']);
42 - if (stripos($result['errors'][0]['message'], "token") !== false && !$repeat) {
43 - $result = WTSEC_LIBRARY_WT::auth(wtsec_app()->get("api_key"));
44 - if (isset($result['data']['guest']['apiKeys']['auth']['token']['value'])) {
45 - $token_ = $result['data']['guest']['apiKeys']['auth']['token']['value'];
46 - WTSEC_LIBRARY_App::login($token_);
47 - return self::requestApi($payload, $token, true);
48 - } else {
49 - WTSEC_LIBRARY_App::logout();
50 - }
51 - } else {
52 - if ($message !== false) {
53 - WTSEC_LIBRARY_Session::setNotification("warning", $message);
54 - }
61 +
62 + if ($message !== false) {
63 + WTSEC_LIBRARY_Session::setNotification("warning", $message);
55 64 }
56 65 }
57 66 return $result;
58 67 }
@@ -137,11 +146,9 @@
137 146 //mutator
138 147 foreach ($result['data']['auth']['viewer']['sites']['list']['edges'] as &$m) {
139 148 if (isset($m['node']['hostname'])) {
140 149 $m['node']['hostname'] = WTSEC_LIBRARY_Idn::idn_to_utf8($m['node']['hostname']);
141 -// if ($m['node']['id'] == "c2l0ZV8yNTg=") {
142 -// return $m['node'];
143 -// }
150 +
144 151 if (self::isSiteUrl($m['node']['hostname'])) {
145 152 return $m['node'];
146 153 }
147 154 }
@@ -170,13 +177,13 @@
170 177 }
171 178
172 179 public static function getAllChecks($host_id)
173 180 {
174 - $from = time() - (60 * 60 * 24);
181 + $from = time() - (60 * 60 * 24 * 7);
175 182 $to = time();
176 183 $from_waf = time() - (60 * 60 * 24 * 30);
177 - $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 . '}}}';
178 -// $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.'"}}';
179 186 $response = self::requestApi($payload, true);
180 187 if (isset($response['data']['auth']['viewer']['sites']['one'])) {
181 188 return $response['data']['auth']['viewer']['sites']['one'];
182 189 }
@@ -182,8 +189,40 @@
182 189 }
183 190 return [];
184 191 }
185 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 +
186 225 public static function changeStatus($config_id, $host_id)
187 226 {
188 227 $payload = '{"query":"\n mutation {\n toggleServiceConfig(\n id: ' . $config_id . '\n userhostId: ' . $host_id . '\n ) {\n isActive\n }\n }\n "}';
189 228 return self::requestApi($payload, true);
@@ -206,8 +245,14 @@
206 245 $payload = '{ "operationName":null, "variables":{}, "query":"mutation { auth { am { install(siteId: \"'.$id.'\"){ downloadLink, amFilename, wafFilename, avFilename } } } }"}';
207 246 return self::requestApi($payload, true);
208 247 }
209 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 +
210 255 public static function checkStatus($id, $service)
211 256 {
212 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"}';
213 258 return self::requestApi($payload, true);
@@ -212,23 +257,49 @@
212 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"}';
213 258 return self::requestApi($payload, true);
214 259 }
215 260
216 - public static function getAntivirus($host_id, $limit = 10, $cursor = null, $days = 365, $event = 'infected')
261 +
262 + public static function getQuarantineList($host_id)
217 263 {
218 - $from = (is_array($days)) ? $days['begin'] : time() - (60 * 60 * 24 * $days);
219 - $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 + {
220 282 $cursor = ($cursor == null) ? 'null' : '"' . $cursor . '"';
221 - $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 } } } } } }"}';
222 284 return self::requestApi($payload, true);
223 285 }
224 286
225 -// public static function getOptions($host_id)
226 -// {
227 -// $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}"}';
228 -// return self::requestApi($payload, true);
229 -// }
287 + public static function reportGenerate($host_id, $period, $services, $language = "en")
288 + {
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.'" } } }';
230 292
293 + return self::requestApi($payload, true);
294 + }
295 +
296 + public static function reportDownload($id)
297 + {
298 + $payload = '{"query": "query { auth { viewer { reports { download(id: \"' . $id . '\") } } } }"}';
299 + return self::requestApi($payload, true);
300 + }
301 +
231 302 public static function getConfigs($host_id)
232 303 {
233 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 } } } } } } } "}';
234 305 return self::requestApi($payload, true);
@@ -239,28 +310,23 @@
239 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 } } } } } "}';
240 311 return self::requestApi($payload, true);
241 312 }
242 313
243 - public static function getFirewall($host_id, $limit = 20, $cursor = null, $days = 365)
314 + public static function wafSettings($host_id, $settings)
244 315 {
245 - $from = (is_array($days)) ? $days['begin'] : time() - (60 * 60 * 24 * $days);
246 - $to = (is_array($days)) ? $days['end'] : time();
247 - $cursor = ($cursor == null) ? 'null' : '"'.$cursor.'"';
248 -
249 - $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 }"}';
250 - $res = self::requestApi($payload, true);
251 -
252 - return $res;
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);
253 318 }
254 319
255 - public static function getFirewallChart($host_id, $days = 7)
320 + public static function getServerStatusChart($host_id, $days = 7)
256 321 {
257 322 $to = time();
258 - $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);
259 324
260 - $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 . '} } }';
261 326
262 - return self::requestApi($payload, true);
327 + $response = self::requestApi($payload, true);
328 + return $response['data']['auth']['viewer']['sites']['one']['serverStatus'];
263 329 }
264 330
265 331 public static function getStatusIcon($status)
266 332 {
@@ -274,8 +340,13 @@
274 340 "text" => WTSEC_LIBRARY_Localization::lmsg('statuses.pending'),
275 341 "color" => self::getColor("grey"),
276 342 "image" => "loading.svg"
277 343 ],
344 + "pause" => [
345 + "text" => WTSEC_LIBRARY_Localization::lmsg('statuses.pause'),
346 + "color" => self::getColor("grey"),
347 + "image" => "warning.svg"
348 + ],
278 349 "expired" => [
279 350 "text" => WTSEC_LIBRARY_Localization::lmsg('statuses.expired'),
280 351 "color" => self::getColor("orange"),
281 352 "image" => "warning.svg"
@@ -357,11 +428,13 @@
357 428 "image" => "check-mark.svg"
358 429 ],
359 430 ];
360 431 if (isset($statuses[$status])) {
361 - 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];
362 435 } else {
363 - 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>"];
364 437 }
365 438 }
366 439
367 440 public static function getColor($type)