Skip to content

Commit

Permalink
Merge pull request #154 from anywherelan/socks5-tray
Browse files Browse the repository at this point in the history
cmd/awl-tray: add Proxy menu that allows to set current peer for proxy
  • Loading branch information
pymq authored Jan 26, 2025
2 parents 041145e + 63c416a commit d9ab5f0
Show file tree
Hide file tree
Showing 8 changed files with 162 additions and 86 deletions.
5 changes: 1 addition & 4 deletions api/settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,7 @@ func (h *Handler) UpdateProxySettings(c echo.Context) (err error) {
return c.JSON(http.StatusBadRequest, ErrorMessage("peer doesn't allow using as exit node"))
}

h.conf.Lock()
h.conf.SOCKS5.UsingPeerID = req.UsingPeerID
h.conf.Unlock()
h.conf.Save()
h.socks5.SetProxyPeerID(req.UsingPeerID)

return c.NoContent(http.StatusOK)
}
6 changes: 2 additions & 4 deletions cmd/awl-tray/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ module awl-tray
go 1.23.0

require (
fyne.io/systray v1.10.1-0.20230403195833-7dc3c09283d6
fyne.io/systray v1.11.1-0.20240917165310-0f99d4d0758b
github.com/GrigoryKrasnochub/updaterini v0.1.0
github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9
github.com/anywherelan/awl v0.0.0-00010101000000-000000000000
github.com/gen2brain/beeep v0.0.0-20230907135156-1a38885a97fc
github.com/gen2brain/beeep v0.0.0-20240516210008-9c006672e7f4
github.com/godbus/dbus/v5 v5.1.1-0.20230522191255-76236955d466
github.com/ipfs/go-log/v2 v2.5.1
github.com/libp2p/go-libp2p v0.36.5
Expand All @@ -16,7 +16,6 @@ require (
)

replace (
fyne.io/systray => github.com/anywherelan/systray v0.0.0-20230509110713-9d662d95edcb
github.com/anywherelan/awl => ../../
github.com/ipfs/go-log/v2 => github.com/anywherelan/go-log/v2 v2.0.3-0.20221101180049-46e3967f6fe5
github.com/ncruces/zenity => github.com/pymq/zenity v0.0.0-20230509161854-c117c448544d
Expand Down Expand Up @@ -150,7 +149,6 @@ require (
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/stretchr/testify v1.9.0 // indirect
github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af // indirect
github.com/tevino/abool v1.2.0 // indirect
github.com/urfave/cli/v2 v2.27.5 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect
Expand Down
11 changes: 4 additions & 7 deletions cmd/awl-tray/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl
dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU=
dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4=
dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU=
fyne.io/systray v1.11.1-0.20240917165310-0f99d4d0758b h1:U8f3vqA1nLgLe25vPpSw4Hk5vjT37OyzfbeziBieNb8=
fyne.io/systray v1.11.1-0.20240917165310-0f99d4d0758b/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs=
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/GrigoryKrasnochub/updaterini v0.1.0 h1:csl3bqQIShuI8RnXzKprTgEhqi3I59XbfZn5+0LGYR8=
Expand All @@ -17,8 +19,6 @@ github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxk
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/anywherelan/go-log/v2 v2.0.3-0.20221101180049-46e3967f6fe5 h1:uQsw+HnQo6Ru5eFgUdEQYKMwkiYkoNZDQmY2ob1E58Y=
github.com/anywherelan/go-log/v2 v2.0.3-0.20221101180049-46e3967f6fe5/go.mod h1:r8UEDyeHO6bYVcP9R2/HnK2ZSZ5CJp89gubcHLKfRv0=
github.com/anywherelan/systray v0.0.0-20230509110713-9d662d95edcb h1:puTJIQvD41dONJuVUUoSU8wFfkipYBWFpxRhIOsBdV8=
github.com/anywherelan/systray v0.0.0-20230509110713-9d662d95edcb/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE=
github.com/anywherelan/ts-dns v0.0.0-20240721135326-6d6b7b811853 h1:RVKWGnppAfxgD2wphkq+OYDOqqI8zgbymBLl2pxYKzY=
github.com/anywherelan/ts-dns v0.0.0-20240721135326-6d6b7b811853/go.mod h1:ly7HpPle1G3D0jwrr12uolTGWKN3DPgxzBYNR086BLo=
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
Expand Down Expand Up @@ -84,8 +84,8 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I=
github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s=
github.com/gen2brain/beeep v0.0.0-20230907135156-1a38885a97fc h1:NNgdMgPX3j33uEAoVVxNxillDPnxT0xbGv8uh4CKIAo=
github.com/gen2brain/beeep v0.0.0-20230907135156-1a38885a97fc/go.mod h1:0W7dI87PvXJ1Sjs0QPvWXKcQmNERY77e8l7GFhZB/s4=
github.com/gen2brain/beeep v0.0.0-20240516210008-9c006672e7f4 h1:ygs9POGDQpQGLJPlq4+0LBUmMBNox1N4JSpw+OETcvI=
github.com/gen2brain/beeep v0.0.0-20240516210008-9c006672e7f4/go.mod h1:0W7dI87PvXJ1Sjs0QPvWXKcQmNERY77e8l7GFhZB/s4=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
Expand Down Expand Up @@ -475,8 +475,6 @@ github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8
github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af h1:6yITBqGTE2lEeTPG04SN9W+iWHCRyHqlVYILiSXziwk=
github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af/go.mod h1:4F09kP5F+am0jAwlQLddpoMDM+iewkxxt6nxUQ5nq5o=
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
github.com/tevino/abool v1.2.0 h1:heAkClL8H6w+mK5md9dzsuohKeXHUpY7Vw0ZCKW+huA=
github.com/tevino/abool v1.2.0/go.mod h1:qc66Pna1RiIsPa7O4Egxxs9OqkuxDX55zznh9K07Tzg=
github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w=
Expand Down Expand Up @@ -610,7 +608,6 @@ golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
Expand Down
60 changes: 59 additions & 1 deletion cmd/awl-tray/tray.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (

"github.com/anywherelan/awl/config"
"github.com/anywherelan/awl/embeds"
"github.com/anywherelan/awl/entity"
"github.com/anywherelan/awl/update"
)

Expand All @@ -24,6 +25,7 @@ var (
peersCountMenu *systray.MenuItem
openBrowserMenu *systray.MenuItem
peersMenu *systray.MenuItem
proxyMenu *systray.MenuItem
startStopMenu *systray.MenuItem
restartMenu *systray.MenuItem
updateMenu *systray.MenuItem
Expand Down Expand Up @@ -78,7 +80,7 @@ func initTray() {
}()
systray.AddSeparator()

peersMenu = systray.AddMenuItem("Peers", "Peers")
peersMenu = systray.AddMenuItem("Peers", "")
go func() {
// On windows systray does not trigger clicked event on menus with submenus
for range peersMenu.ClickedCh {
Expand All @@ -92,9 +94,12 @@ func initTray() {
continue
}
refreshPeersSubmenus()
refreshProxySubmenus()
}
}()

proxyMenu = systray.AddMenuItem("Proxy", "")

startStopMenu = systray.AddMenuItem("", "")
go func() {
for range startStopMenu.ClickedCh {
Expand Down Expand Up @@ -141,17 +146,20 @@ func refreshMenusOnStartedServer() {
setPeersConnectedCounter(0)
openBrowserMenu.Enable()
peersMenu.Enable()
proxyMenu.Enable()
startStopMenu.SetTitle("Stop server")
restartMenu.Enable()

refreshPeersSubmenus()
refreshProxySubmenus()
}

func refreshMenusOnStoppedServer() {
statusMenu.SetTitle("Status: stopped")
setPeersConnectedCounter(0)
openBrowserMenu.Disable()
peersMenu.Disable()
proxyMenu.Disable()
startStopMenu.SetTitle("Start server")
restartMenu.Disable()
}
Expand Down Expand Up @@ -242,6 +250,56 @@ func refreshPeersSubmenus() {
}
}

var proxySubmenus []*systray.MenuItem
var previousProxies []entity.AvailableProxy
var previousProxyPeerID string

func refreshProxySubmenus() {
if app == nil || proxyMenu == nil {
return
}

app.Conf.RLock()
currentProxy := app.Conf.SOCKS5.UsingPeerID
app.Conf.RUnlock()

proxies := app.SOCKS5.ListAvailableProxies()

if slices.Equal(previousProxies, proxies) && previousProxyPeerID == currentProxy {
return
}

for _, submenu := range proxySubmenus {
submenu.Remove()
}
proxySubmenus = nil

previousProxies = proxies
previousProxyPeerID = currentProxy

for _, proxy := range proxies {
isChecked := proxy.PeerID == currentProxy
submenu := proxyMenu.AddSubMenuItemCheckbox(proxy.PeerName, "", isChecked)
proxySubmenus = append(proxySubmenus, submenu)

go func() {
for range submenu.ClickedCh {
app.SOCKS5.SetProxyPeerID(proxy.PeerID)

app.Conf.Lock()
for _, currentSubmenu := range proxySubmenus {
if currentSubmenu == submenu {
submenu.Check()
} else {
currentSubmenu.Uncheck()
}
}
app.Conf.Unlock()
}
}()
}
}

func onClickUpdateMenu() error {
updateMenu.SetTitle("Checking...")
updateMenu.Disable()
Expand Down
63 changes: 63 additions & 0 deletions embeds/compare.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package embeds

import (
"bufio"
"bytes"
"errors"
"fmt"
"io"
"os"
)

func checkIsFileEqual(path string, data []byte) bool {
stat, err := os.Stat(path)
if errors.Is(err, os.ErrNotExist) {
return false
} else if stat.Size() != int64(len(data)) {
return false
}

file, err := os.Open(path)
if err != nil {
fmt.Printf("error: read %s file: %v\n", path, err)
return false
}
fileClosed := false
closeFile := func() {
if fileClosed {
return
}
err := file.Close()
fileClosed = true
if err != nil {
fmt.Printf("error: close read %s file: %v\n", path, err)
}
}
defer closeFile()

equal, err := streamsEqual(bytes.NewReader(data), bufio.NewReader(file))
if err != nil {
fmt.Printf("error: compare %s files: %v\n", path, err)
}

return equal
}

func streamsEqual(s1 io.Reader, s2 io.Reader) (bool, error) {
const chunkSize = 4096
buf1 := make([]byte, chunkSize)
buf2 := make([]byte, chunkSize)
for {
len1, err1 := io.ReadFull(s1, buf1)
len2, err2 := io.ReadFull(s2, buf2)
if (err1 != nil && err1 != io.ErrUnexpectedEOF) || (err2 != nil && err2 != io.ErrUnexpectedEOF) {
if (err1 == io.EOF || err1 == nil) && (err2 == io.EOF || err2 == nil) {
return err1 == io.EOF && err2 == io.EOF, nil
}
return false, fmt.Errorf("compare streams reading err: source1 err: %v; source2 err: %v", err1, err2)
}
if !bytes.Equal(buf1[:len1], buf2[:len2]) {
return false, nil
}
}
}
28 changes: 17 additions & 11 deletions embeds/icon.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,17 @@ const (
iconDirWindows = config.AppDataDirectory
iconName = "anywherelan.png"

dirMod = 0700
iconMod = 0664
dirMode = 0700
iconMode = 0664
)

var (
//go:embed Icon.png
appIcon []byte

appIconPath string

isTempIcon bool
)

func GetIcon() []byte {
Expand All @@ -46,43 +48,47 @@ func EmbedIcon() (string, error) {
iconDir, err = getIconDirWindows()
default:
iconDir = getIconDirDefault()
isTempIcon = true
}

if err != nil {
return "", err
}

err = os.Mkdir(iconDir, dirMod)
err = os.Mkdir(iconDir, dirMode)
if err != nil && !os.IsExist(err) {
return "", fmt.Errorf("error: create dir: %w", err)
}
config.ChownFileIfNeeded(iconDir)

iconPath := filepath.Join(iconDir, iconName)
err = os.WriteFile(iconPath, appIcon, iconMod)
equal := checkIsFileEqual(iconPath, appIcon)
if equal {
appIconPath = iconPath
return iconDir, nil
}

err = os.WriteFile(iconPath, appIcon, iconMode)
if err != nil {
return "", fmt.Errorf("error: write file: %w", err)
}
config.ChownFileIfNeeded(iconPath)

appIconPath = iconPath

return iconPath, nil
return iconDir, nil
}

func RemoveIconIfNeeded() error {
if len(appIconPath) == 0 {
return nil
}

switch runtime.GOOS {
case "linux":
case "windows":
default:
return os.Remove(appIconPath)
if !isTempIcon {
return nil
}

return nil
return os.Remove(appIconPath)
}

func getIconDirLinux() (string, error) {
Expand Down
Loading

0 comments on commit d9ab5f0

Please sign in to comment.