diff --git a/web/html/index.html b/web/html/index.html index b6a9993e..1302bbed 100644 --- a/web/html/index.html +++ b/web/html/index.html @@ -817,40 +817,56 @@ this.formattedLogs = this.logs?.length > 0 ? this.formatLogs(this.logs) : "No Record..."; }, formatLogs(logs) { - let formattedLogs = ''; + let formattedLogs = ` + - const parts = log.split(' '); + + + + + + + + + +`; - if(parts.length === 10) { - const dateTime = `${parts[0]} ${parts[1]}`; - const from = `${parts[3]}`; - const to = `${parts[5].replace(/^\/+/, "")}`; + logs.reverse().forEach((log, index) => { + let outboundColor = ''; + if (log.Event === 1) { + outboundColor = ' style="color: #e04141;"'; //red for blocked + } + else if (log.Event === 2) { + outboundColor = ' style="color: #3c89e8;"'; //blue for proxies + } - let outboundColor = ''; - if (parts[9] === "b") { - outboundColor = ' style="color: #e04141;"'; //red for blocked - } - else if (parts[9] === "p") { - outboundColor = ' style="color: #3c89e8;"'; //blue for proxies - } + let text = ``; + if (log.Email !== "") { + text = ``; + } - formattedLogs += ` -${dateTime} - ${parts[2]} - ${from} - ${parts[4]} - ${to} - ${parts.slice(6, 9).join(' ')} -`; - } else { - formattedLogs += `${log}`; - } - }); + formattedLogs += ` + + + + + + + ${text} + +`; + }); - return formattedLogs; + return formattedLogs += "
DateFromToInboundOutboundEmail
${log.Email}
${new Date(log.DateTime).toLocaleString()}${log.FromAddress}${log.ToAddress}${log.Inbound}${log.Outbound}
"; }, hide() { this.visible = false; diff --git a/web/service/server.go b/web/service/server.go index de6cc7f5..de9e7469 100644 --- a/web/service/server.go +++ b/web/service/server.go @@ -115,6 +115,16 @@ type CPUSample struct { Cpu float64 `json:"cpu"` // percent 0..100 } +type LogEntry struct { + DateTime time.Time + FromAddress string + ToAddress string + Inbound string + Outbound string + Email string + Event int +} + func getPublicIP(url string) string { client := &http.Client{ Timeout: 3 * time.Second, @@ -662,19 +672,25 @@ func (s *ServerService) GetXrayLogs( showBlocked string, showProxy string, freedoms []string, - blackholes []string) []string { + blackholes []string) []LogEntry { + + const ( + Direct = iota + Blocked + Proxied + ) countInt, _ := strconv.Atoi(count) - var lines []string + var entries []LogEntry pathToAccessLog, err := xray.GetAccessLogPath() if err != nil { - return lines + return nil } file, err := os.Open(pathToAccessLog) if err != nil { - return lines + return nil } defer file.Close() @@ -693,37 +709,62 @@ func (s *ServerService) GetXrayLogs( continue } - //adding suffixes to further distinguish entries by outbound - if hasSuffix(line, freedoms) { + var entry LogEntry + parts := strings.Fields(line) + + for i, part := range parts { + + if i == 0 { + dateTime, err := time.Parse("2006/01/02 15:04:05.999999", parts[0]+" "+parts[1]) + if err != nil { + continue + } + entry.DateTime = dateTime + } + + if part == "from" { + entry.FromAddress = parts[i+1] + } else if part == "accepted" { + entry.ToAddress = parts[i+1] + } else if strings.HasPrefix(part, "[") { + entry.Inbound = part[1:] + } else if strings.HasSuffix(part, "]") { + entry.Outbound = part[:len(part)-1] + } else if part == "email:" { + entry.Email = parts[i+1] + } + } + + if logEntryContains(line, freedoms) { if showDirect == "false" { continue } - line = line + " f" - } else if hasSuffix(line, blackholes) { + entry.Event = Direct + } else if logEntryContains(line, blackholes) { if showBlocked == "false" { continue } - line = line + " b" + entry.Event = Blocked } else { if showProxy == "false" { continue } - line = line + " p" + entry.Event = Proxied } - lines = append(lines, line) + entries = append(entries, entry) } - if len(lines) > countInt { - lines = lines[len(lines)-countInt:] + if len(entries) > countInt { + entries = entries[len(entries)-countInt:] } - return lines + return entries } -func hasSuffix(line string, suffixes []string) bool { +func logEntryContains(line string, suffixes []string) bool { for _, sfx := range suffixes { - if strings.HasSuffix(line, sfx+"]") { + if strings.Contains(line, sfx+"]") { return true } }