Windows defender flags my `Golang Tray Application` as virus program

54 Views Asked by At

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.

0

There are 0 best solutions below