I have a question about the windows defender problem with my golang application.
I've developed a tray application in Go, its general purpose is serving features that run the server on local device, so every teammates in my team can run the server even when I was in the office.
It is only deployed by my team slack channel after I built it as .exe file.
The below is portion of my project, I removed host and port.
package main
import (
"Go-Tray/icon"
"fmt"
"github.com/getlantern/systray"
"net"
"net/http"
"time"
)
type serverType int
const (
dclo serverType = iota
admin
)
type serverInfo struct {
serverType
host string
port string
isRunning bool
}
func main() {
systray.Run(onReady, onExit)
}
func onReady() {
systray.SetIcon(icon.GetIconData("blackAndWhite.ico"))
systray.SetTitle("D-Clo Local Server")
systray.SetTooltip("D-Clo Local Server")
dcloStart := systray.AddMenuItem("Start Dclo", "Run D-clo Api Local Server")
dcloStop := systray.AddMenuItem("Stop Dclo", "Stop D-clo Api Local Server")
adminStart := systray.AddMenuItem("Start Admin", "Run Admin Api Local Server")
adminStop := systray.AddMenuItem("Stop Admin", "Stop Admin Api Local Server")
systray.AddSeparator()
mQuit := systray.AddMenuItem("Quit", "Quit the whole app")
dcloServerInfo := serverInfo{
host: "",
port: "",
serverType: dclo,
isRunning: false,
}
adminServerInfo := serverInfo{
host: "",
port: "",
serverType: admin,
isRunning: false,
}
ticker := time.NewTicker(1 * time.Second)
go func() {
for range ticker.C {
dcloServerInfo.isRunning = checkServerStatus(dcloServerInfo)
adminServerInfo.isRunning = checkServerStatus(adminServerInfo)
if !dcloServerInfo.isRunning && !adminServerInfo.isRunning {
systray.SetIcon(icon.GetIconData("blackAndWhite.ico"))
systray.SetTooltip("Every server is stopped")
dcloStart.Show()
dcloStop.Hide()
adminStart.Show()
adminStop.Hide()
continue
} else {
systray.SetIcon(icon.GetIconData("default.ico"))
}
if dcloServerInfo.isRunning {
dcloStart.Hide()
dcloStop.Show()
if adminServerInfo.isRunning {
adminStart.Hide()
adminStop.Show()
systray.SetTooltip("Servers(Dclo, Admin) are running")
} else {
adminStart.Show()
adminStop.Hide()
systray.SetTooltip("Dclo server is running")
}
} else {
dcloStart.Show()
dcloStop.Hide()
adminStart.Hide()
adminStop.Show()
systray.SetTooltip("Admin server is running")
}
}
}()
go func() {
for {
select {
case <-dcloStart.ClickedCh:
resp, err := http.Get("")
if err != nil {
fmt.Println("Error:", err)
systray.Quit()
return
}
resp.Body.Close()
break
case <-dcloStop.ClickedCh:
resp, err := http.Get("")
if err != nil {
fmt.Println("Error:", err)
systray.Quit()
return
}
resp.Body.Close()
break
case <-adminStart.ClickedCh:
resp, err := http.Get("")
if err != nil {
fmt.Println("Error:", err)
systray.Quit()
return
}
resp.Body.Close()
break
case <-adminStop.ClickedCh:
resp, err := http.Get("")
if err != nil {
fmt.Println("Error:", err)
systray.Quit()
return
}
resp.Body.Close()
break
case <-mQuit.ClickedCh:
ticker.Stop()
systray.Quit()
return
}
}
}()
}
func onExit() {
}
func checkServerStatus(info serverInfo) bool {
timeout := 1 * time.Second
conn, err := net.DialTimeout("tcp", net.JoinHostPort(info.host, info.port), timeout)
if err != nil {
return false
}
if conn != nil {
defer conn.Close()
return true
}
return false
}
I used getlantern/systray package for developing windows tray icon application.
I've seen that it works well on my local device, and I've seen that it works even when I download it directly after it's been deployed on slack. However, when a team member who uses the same environment as me downloaded the file 'exe' built on slack, Windows defender blocks it.
I want to know the cause of this phenomenon, but with my level of knowledge, it's hard to even know where to check.
If anyone has experienced something similar or has any knowledge, I would appreciate any help.