From: Sergey Matveev Date: Sun, 27 Aug 2017 10:01:50 +0000 (+0300) Subject: Merge branch 'develop' X-Git-Tag: 7.4^0 X-Git-Url: http://www.git.cypherpunks.ru/?p=govpn.git;a=commitdiff_plain;h=f70a3aa49e188be843952738d8ad4eb3a6f1341a;hp=8b1de1c28a4ef7b651d0196cac4d63eca35b93d1 Merge branch 'develop' --- diff --git a/.gitmodules b/.gitmodules index c837a03..8b03d42 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,3 +14,6 @@ path = src/gopkg.in/yaml.v2 url = https://github.com/go-yaml/yaml.git branch = v2 +[submodule "src/golang.org/x/sys"] + path = src/golang.org/x/sys + url = https://go.googlesource.com/sys diff --git a/README b/README index 51ee94e..221809e 100644 --- a/README +++ b/README @@ -15,13 +15,14 @@ GNU/Linux and FreeBSD support. GoVPN is free software: see the file COPYING for copying conditions. Home page: http://www.govpn.info/ -also available as Tor hidden service: http://2wir2p7ibeu72jk3.onion/ +Also available as I2P service: +http://zy2qxyziqzledqqb5vcq5unfxnn2csv6revteliybd7qxb64dpxq.b32.i2p/ Please send questions regarding the use of GoVPN, bug reports and patches to govpn-devel mailing list: https://lists.cypherpunks.ru/pipermail/govpn-devel/ Development Git source code repository currently is located here: -http://git.cypherpunks.ru/cgit.cgi/govpn.git/ +https://git.cypherpunks.ru/cgit.cgi/govpn.git/ For further information please read either doc/govpn.info or doc/govpn.texi. diff --git a/README.RU b/README.RU index 63b7024..f1731a2 100644 --- a/README.RU +++ b/README.RU @@ -19,14 +19,15 @@ GoVPN это свободное программное обеспечением: находятся в файле COPYING. Домашняя страница: http://www.govpn.info/ -также доступна как скрытый сервис Tor: http://2wir2p7ibeu72jk3.onion/ +Также доступная как I2P сервис: +http://zy2qxyziqzledqqb5vcq5unfxnn2csv6revteliybd7qxb64dpxq.b32.i2p/ Пожалуйста все вопросы касающиеся использования GoVPN, отчёты об ошибках и патчи отправляйте в govpn-devel почтовую рассылку: https://lists.cypherpunks.ru/pipermail/govpn-devel/ Исходный код для разработчика находится в Git репозитории: -http://git.cypherpunks.ru/cgit.cgi/govpn.git/ +https://git.cypherpunks.ru/cgit.cgi/govpn.git/ -За большей информацией пожалуйста прочтите или doc/govpn.info или -doc/govpn.texi. +Для дополнительной информации пожалуйста читайте или doc/govpn.info +или doc/govpn.texi. diff --git a/THANKS b/THANKS index a7fe0af..d2294bf 100644 --- a/THANKS +++ b/THANKS @@ -2,4 +2,4 @@ * Zhuoyun Wei for AUR port maintaining and his documentation related fixes. * Bruno Clermont for finding serious bugs - and code refactoring + and code refactoring. diff --git a/VERSION b/VERSION index f994162..37722eb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -7.3 +7.4 diff --git a/common.mk b/common.mk index 99e1c0d..988964f 100644 --- a/common.mk +++ b/common.mk @@ -38,7 +38,7 @@ install: all doc cp -f utils/newclient.sh $(SHAREDIR) chmod 755 $(SHAREDIR)/newclient.sh mkdir -p $(DOCDIR) - cp -f -L AUTHORS INSTALL NEWS README README.RU THANKS $(DOCDIR) + cp -f -L AUTHORS INSTALL NEWS NEWS.RU README README.RU THANKS $(DOCDIR) chmod 644 $(DOCDIR)/* install-strip: install diff --git a/doc/about.ru.texi b/doc/about.ru.texi index 0c45017..c56eaaf 100644 --- a/doc/about.ru.texi +++ b/doc/about.ru.texi @@ -10,7 +10,7 @@ GoVPN это простой демон виртуальных частных с @url{https://www.gnu.org/philosophy/free-sw.ru.html, Свободное программное обеспечение}, @url{https://www.gnu.org/philosophy/pragmatic.ru.html, копилефт}: лицензировано под условиями @url{https://www.gnu.org/licenses/gpl-3.0.ru.html, -GPLv3+}. +GNU GPLv3+}. @item Быстрый сильный @ref{PAKE, аутентифицируемый по парольной фразе} diff --git a/doc/about.texi b/doc/about.texi index 7cda5af..5fbafe7 100644 --- a/doc/about.texi +++ b/doc/about.texi @@ -9,7 +9,7 @@ See also this page @ref{О демоне, on russian}. @item @url{https://www.gnu.org/philosophy/pragmatic.html, Copylefted} @url{https://www.gnu.org/philosophy/free-sw.html, free software}: -licenced under @url{https://www.gnu.org/licenses/gpl-3.0.html, GPLv3+}. +licenced under @url{https://www.gnu.org/licenses/gpl-3.0.html, GNU GPLv3+}. @item Fast strong @ref{PAKE, passphrase authenticated} augmented diff --git a/doc/contacts.texi b/doc/contacts.texi index 15e5235..1c8b5b2 100644 --- a/doc/contacts.texi +++ b/doc/contacts.texi @@ -5,7 +5,6 @@ Please send questions regarding the use of GoVPN, bug reports and patches to @url{https://lists.cypherpunks.ru/pipermail/govpn-devel/, govpn-devel} mailing list. Announcements also go to this mailing list. -Official website is @url{http://www.govpn.info/}, also available via -@url{https://www.govpn.info/, HTTPS} and as -@url{https://www.torproject.org/, Tor} hidden service: -@url{http://2wir2p7ibeu72jk3.onion/}. +Official website is @url{http://www.govpn.info/}, also available as +@url{https://geti2p.net/en/, I2P} service +@url{http://zy2qxyziqzledqqb5vcq5unfxnn2csv6revteliybd7qxb64dpxq.b32.i2p/}. diff --git a/doc/download.texi b/doc/download.texi index f12e40e..463aa91 100644 --- a/doc/download.texi +++ b/doc/download.texi @@ -1,23 +1,28 @@ @node Tarballs @section Prepared tarballs -You can obtain releases source code prepared tarballs from the links below -(or use @url{https://sourceforge.net/projects/govpn/files/, Sourceforge mirror}). +You can obtain releases source code prepared tarballs from the links below. Do not forget to check tarball @ref{Integrity, integrity}. Tarballs include all necessary required libraries: @multitable @columnfractions .40 .20 .40 @headitem Library @tab Platform @tab Licence +@item @code{cypherpunks.ru/balloon} @tab All @tab GNU LGPLv3+ @item @code{github.com/agl/ed25519} @tab All @tab BSD 3-Clause @item @code{github.com/bigeagle/water} @tab GNU/Linux @tab BSD 3-Clause @item @code{github.com/go-yaml/yaml} @tab All @tab Apache License 2.0 and MIT @item @code{golang.org/x/crypto} @tab All @tab BSD 3-Clause +@item @code{golang.org/x/sys} @tab All @tab BSD 3-Clause @end multitable @multitable {XXXXX} {XXXX KiB} {link sign} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} @headitem Version @tab Size @tab Tarball @tab SHA256 checksum +@item @ref{Release 7.3, 7.3} @tab 289 KiB +@tab @url{download/govpn-7.3.tar.xz, link} @url{download/govpn-7.3.tar.xz.sig, sign} +@tab @code{C3A27353 4A448112 09C4CB1D CA26EBFE 56644D5A D51C8216 BA22EC18 150A4EE8} + @item @ref{Release 7.2, 7.2} @tab 289 KiB @tab @url{download/govpn-7.2.tar.xz, link} @url{download/govpn-7.2.tar.xz.sig, sign} @tab @code{8C787DCD 6FFB718E 850F287E 959FCB45 7880A8A1 1C417BCA 17A86346 AC9BAAEE} @@ -136,4 +141,4 @@ Tarballs include all necessary required libraries: @end multitable -Also you can try its @ref{Contacts, .onion} version. +Also you can try its @ref{Contacts, .i2p} version. diff --git a/doc/installation.texi b/doc/installation.texi index 9abc822..1f8a74c 100644 --- a/doc/installation.texi +++ b/doc/installation.texi @@ -11,14 +11,14 @@ Possibly GoVPN already exists in your distribution: @end itemize GoVPN is written on @url{https://golang.org/, Go} programming language -and you have to install Go compiler (1.5+ version is highly recommended, -1.4 is the minimal sufficient): @code{lang/go} port in FreeBSD and -@code{golang} package in most GNU/Linux distributions. @emph{Make} (BSD -and GNU ones are fine) is recommended for convenient building. -@url{https://www.gnu.org/software/texinfo/, Texinfo} (6.1+ version is -recommended) is used for building documentation. Possibly you also need -to install TUN/TAP interface utilities (depending on your operating -system): @command{uml-utilities} package in most GNU/Linux distributions. +and you have to install Go compiler 1.9+ version: @code{lang/go} port in +FreeBSD and @code{golang} package in most GNU/Linux distributions. +@emph{Make} (BSD and GNU ones are fine) is recommended for convenient +building. @url{https://www.gnu.org/software/texinfo/, Texinfo} (6.1+ +version is recommended) is used for building documentation. Possibly you +also need to install TUN/TAP interface utilities (depending on your +operating system): @command{uml-utilities} package in most GNU/Linux +distributions. Get @ref{Tarballs, the tarball}, check its @ref{Integrity, integrity and authenticity} and run @command{make}. diff --git a/doc/news.ru.texi b/doc/news.ru.texi index f00c3b1..08aa4c7 100644 --- a/doc/news.ru.texi +++ b/doc/news.ru.texi @@ -1,6 +1,13 @@ @node Новости @section Новости +@node Релиз 7.4 +@subsection Релиз 7.4 +@itemize +@item Маленький рефакторинг. Минимальная необходимая версия Go 1.9. +@item Обновлены зависимые криптографические библиотеки. +@end itemize + @node Релиз 7.3 @subsection Релиз 7.3 @itemize diff --git a/doc/news.texi b/doc/news.texi index cb119e2..03d61ef 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -3,6 +3,13 @@ See also this page @ref{Новости, on russian}. +@node Release 7.4 +@section Release 7.4 +@itemize +@item Tiny refactoring. Go 1.9 is minimal required version. +@item Dependant cryptographic libraries are updated. +@end itemize + @node Release 7.3 @section Release 7.3 @itemize diff --git a/doc/sources.texi b/doc/sources.texi index f3864ef..7ceeebf 100644 --- a/doc/sources.texi +++ b/doc/sources.texi @@ -7,7 +7,7 @@ libraries source code. Because of that, it is recommended for porters to use @ref{Tarballs, tarballs} instead. You can obtain it by cloning @url{http://git-scm.com/, Git} -@url{http://git.cypherpunks.ru/cgit.cgi/govpn.git/log/, repository} +@url{https://git.cypherpunks.ru/cgit.cgi/govpn.git/log/, repository} and fetching dependent libraries source code as git submodules: @verbatim @@ -22,7 +22,6 @@ repositories will be unavailable (they are seldom updated): @multitable @columnfractions .50 .50 @headitem Software/library @tab Mirror -@item @code{cypherpunks.ru/govpn} @tab @url{https://github.com/stargrave/govpn.git} @item @code{github.com/agl/ed25519} @tab @url{git://git.cypherpunks.ru/ed25519.git} @item @code{github.com/bigeagle/water} @tab @url{git://git.cypherpunks.ru/water.git} @item @code{github.com/go-yaml/yaml} @tab @url{git://git.cypherpunks.ru/yaml.git} diff --git a/ports/govpn/Makefile b/ports/govpn/Makefile index 5d78be6..8e7a2eb 100644 --- a/ports/govpn/Makefile +++ b/ports/govpn/Makefile @@ -1,10 +1,9 @@ # $FreeBSD$ PORTNAME= govpn -PORTVERSION= 7.3 +PORTVERSION= 7.4 CATEGORIES= security -MASTER_SITES= http://www.govpn.info/download/ \ - http://sourceforge.net/projects/govpn/files/ +MASTER_SITES= http://www.govpn.info/download/ MAINTAINER= stargrave@stargrave.org COMMENT= Simple secure, DPI-resistant VPN daemon @@ -17,7 +16,7 @@ BUILD_DEPENDS= go:lang/go USES= tar:xz MAKEFILE= BSDmakefile -PORTDOCS= AUTHORS INSTALL NEWS README THANKS README.RU +PORTDOCS= AUTHORS INSTALL NEWS NEWS.RU README README.RU THANKS INFO= govpn INSTALL_TARGET= install-strip diff --git a/src/cypherpunks.ru/balloon b/src/cypherpunks.ru/balloon index 9e7f630..3cd3006 160000 --- a/src/cypherpunks.ru/balloon +++ b/src/cypherpunks.ru/balloon @@ -1 +1 @@ -Subproject commit 9e7f63092012aa91a6690d93f00f5bc476e4d3b5 +Subproject commit 3cd3006ad829a0afc7ca3d964ff333ef068464bd diff --git a/src/cypherpunks.ru/govpn/client/client.go b/src/cypherpunks.ru/govpn/client/client.go index 8102cc6..3014bdf 100644 --- a/src/cypherpunks.ru/govpn/client/client.go +++ b/src/cypherpunks.ru/govpn/client/client.go @@ -23,6 +23,7 @@ import ( "fmt" "net" "os" + "sync" "time" "github.com/agl/ed25519" @@ -72,7 +73,7 @@ func (c *Configuration) isProxy() bool { type Client struct { idsCache *govpn.MACCache tap *govpn.TAP - knownPeers govpn.KnownPeers + knownPeers sync.Map statsPort net.Listener timeouted chan struct{} rehandshaking chan struct{} @@ -99,7 +100,6 @@ func (c *Client) MainCycle() { c.Error <- fmt.Errorf("Can't listen on stats port: %s", err.Error()) return } - c.knownPeers = govpn.KnownPeers(make(map[string]**govpn.Peer)) go govpn.StatsProcessor(c.statsPort, &c.knownPeers) } diff --git a/src/cypherpunks.ru/govpn/client/tcp.go b/src/cypherpunks.ru/govpn/client/tcp.go index 40d81ca..4bb7a5f 100644 --- a/src/cypherpunks.ru/govpn/client/tcp.go +++ b/src/cypherpunks.ru/govpn/client/tcp.go @@ -86,7 +86,7 @@ HandshakeCycle: continue } govpn.Printf(`[handshake-completed remote="%s"]`, c.config.RemoteAddress) - c.knownPeers = govpn.KnownPeers(map[string]**govpn.Peer{c.config.RemoteAddress: &peer}) + c.knownPeers.Store(c.config.RemoteAddress, &peer) if c.firstUpCall { go govpn.ScriptCall(c.config.UpPath, c.config.InterfaceName, c.config.RemoteAddress) c.firstUpCall = false diff --git a/src/cypherpunks.ru/govpn/client/udp.go b/src/cypherpunks.ru/govpn/client/udp.go index bb7045a..bb29dcc 100644 --- a/src/cypherpunks.ru/govpn/client/udp.go +++ b/src/cypherpunks.ru/govpn/client/udp.go @@ -93,7 +93,7 @@ MainCycle: continue } govpn.Printf(`[handshake-completed remote="%s"]`, c.config.RemoteAddress) - c.knownPeers = govpn.KnownPeers(map[string]**govpn.Peer{c.config.RemoteAddress: &peer}) + c.knownPeers.Store(c.config.RemoteAddress, &peer) if c.firstUpCall { go govpn.ScriptCall(c.config.UpPath, c.config.InterfaceName, c.config.RemoteAddress) c.firstUpCall = false diff --git a/src/cypherpunks.ru/govpn/cmd/govpn-server/common.go b/src/cypherpunks.ru/govpn/cmd/govpn-server/common.go index f18d34b..e0e8e03 100644 --- a/src/cypherpunks.ru/govpn/cmd/govpn-server/common.go +++ b/src/cypherpunks.ru/govpn/cmd/govpn-server/common.go @@ -32,17 +32,10 @@ type PeerState struct { } var ( - handshakes map[string]*govpn.Handshake = make(map[string]*govpn.Handshake) - hsLock sync.RWMutex - - peers = make(map[string]*PeerState) - peersLock sync.RWMutex - - peersByID = make(map[govpn.PeerID]string) - peersByIDLock sync.RWMutex - - knownPeers govpn.KnownPeers - kpLock sync.RWMutex + handshakes sync.Map + peers sync.Map + peersByID sync.Map + knownPeers sync.Map ) func callUp(peerID *govpn.PeerID, remoteAddr string) (string, error) { diff --git a/src/cypherpunks.ru/govpn/cmd/govpn-server/main.go b/src/cypherpunks.ru/govpn/cmd/govpn-server/main.go index 3e80975..0dfd8ab 100644 --- a/src/cypherpunks.ru/govpn/cmd/govpn-server/main.go +++ b/src/cypherpunks.ru/govpn/cmd/govpn-server/main.go @@ -58,7 +58,6 @@ func main() { log.Println(govpn.VersionGet()) confInit() - knownPeers = govpn.KnownPeers(make(map[string]**govpn.Peer)) if *egdPath != "" { log.Println("Using", *egdPath, "EGD") @@ -106,28 +105,33 @@ MainCycle: select { case <-termSignal: govpn.BothPrintf(`[terminating bind="%s"]`, *bindAddr) - for _, ps := range peers { + peers.Range(func(_, psI interface{}) bool { + ps := psI.(*PeerState) govpn.ScriptCall( confs[*ps.peer.ID].Down, ps.tap.Name, ps.peer.Addr, ) - } + return true + }) break MainCycle case <-hsHeartbeat: now := time.Now() - hsLock.Lock() - for addr, hs := range handshakes { + + handshakes.Range(func(addrI, hsI interface{}) bool { + addr := addrI.(string) + hs := hsI.(*govpn.Handshake) if hs.LastPing.Add(timeout).Before(now) { govpn.Printf(`[handshake-delete bind="%s" addr="%s"]`, *bindAddr, addr) hs.Zero() - delete(handshakes, addr) + handshakes.Delete(addr) } - } - peersLock.Lock() - peersByIDLock.Lock() - kpLock.Lock() - for addr, ps := range peers { + return true + }) + + peers.Range(func(addrI, psI interface{}) bool { + addr := addrI.(string) + ps := psI.(*PeerState) ps.peer.BusyR.Lock() needsDeletion = ps.peer.LastPing.Add(timeout).Before(now) ps.peer.BusyR.Unlock() @@ -137,9 +141,9 @@ MainCycle: *bindAddr, ps.peer.ID.String(), ) - delete(peers, addr) - delete(knownPeers, addr) - delete(peersByID, *ps.peer.ID) + peers.Delete(addr) + knownPeers.Delete(addr) + peersByID.Delete(*ps.peer.ID) go govpn.ScriptCall( confs[*ps.peer.ID].Down, ps.tap.Name, @@ -147,11 +151,8 @@ MainCycle: ) ps.terminator <- struct{}{} } - } - hsLock.Unlock() - peersLock.Unlock() - peersByIDLock.Unlock() - kpLock.Unlock() + return true + }) } } } diff --git a/src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go b/src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go index 61eb1e0..aab59b7 100644 --- a/src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go +++ b/src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go @@ -60,6 +60,9 @@ func handleTCP(conn net.Conn) { var peer *govpn.Peer var tap *govpn.TAP var conf *govpn.PeerConf + var addrPrev string + var peerPrevI interface{} + var peerPrev *PeerState for { if prev == len(buf) { break @@ -96,16 +99,13 @@ func handleTCP(conn net.Conn) { `[handshake-completed bind="%s" addr="%s" peer="%s"]`, *bindAddr, addr, peerID.String(), ) - peersByIDLock.RLock() - addrPrev, exists := peersByID[*peer.ID] - peersByIDLock.RUnlock() - var peerPrev *PeerState + addrPrevI, exists := peersByID.Load(*peer.ID) if exists { - peersLock.Lock() - peerPrev = peers[addrPrev] - if peerPrev == nil { - exists = false - peersLock.Unlock() + addrPrev = addrPrevI.(string) + peerPrevI, exists = peers.Load(addrPrev) + if exists { + peerPrev = peerPrevI.(*PeerState) + exists = peerPrev == nil } } if exists { @@ -117,16 +117,11 @@ func handleTCP(conn net.Conn) { terminator: make(chan struct{}), } go govpn.PeerTapProcessor(ps.peer, ps.tap, ps.terminator) - peersByIDLock.Lock() - kpLock.Lock() - delete(peers, addrPrev) - delete(knownPeers, addrPrev) - peers[addr] = ps - knownPeers[addr] = &peer - peersByID[*peer.ID] = addr - peersLock.Unlock() - peersByIDLock.Unlock() - kpLock.Unlock() + peers.Delete(addrPrev) + peers.Store(addr, ps) + knownPeers.Delete(addrPrev) + knownPeers.Store(addr, &peer) + peersByID.Store(*peer.ID, addr) govpn.Printf( `[rehandshake-completed bind="%s" peer="%s"]`, *bindAddr, peerID.String(), @@ -152,15 +147,9 @@ func handleTCP(conn net.Conn) { terminator: make(chan struct{}, 1), } go govpn.PeerTapProcessor(ps.peer, ps.tap, ps.terminator) - peersLock.Lock() - peersByIDLock.Lock() - kpLock.Lock() - peers[addr] = ps - peersByID[*peer.ID] = addr - knownPeers[addr] = &peer - peersLock.Unlock() - peersByIDLock.Unlock() - kpLock.Unlock() + peers.Store(addr, ps) + peersByID.Store(*peer.ID, addr) + knownPeers.Store(addr, &peer) govpn.Printf(`[peer-created bind="%s" peer="%s"]`, *bindAddr, peerID.String()) } break diff --git a/src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go b/src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go index 0373517..f074df4 100644 --- a/src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go +++ b/src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go @@ -57,10 +57,15 @@ func startUDP() { var addr string var n int var err error + var exists bool + var psI interface{} var ps *PeerState + var hsI interface{} var hs *govpn.Handshake + var addrPrevI interface{} var addrPrev string - var exists bool + var peerPrevI interface{} + var peerPrev *PeerState var peerID *govpn.PeerID var conf *govpn.PeerConf for { @@ -72,10 +77,9 @@ func startUDP() { } addr = raddr.String() - peersLock.RLock() - ps, exists = peers[addr] - peersLock.RUnlock() + psI, exists = peers.Load(addr) if exists { + ps = psI.(*PeerState) go func(peer *govpn.Peer, tap *govpn.TAP, buf []byte, n int) { peer.PktProcess(buf[:n], tap, true) udpBufs <- buf @@ -83,9 +87,7 @@ func startUDP() { continue } - hsLock.RLock() - hs, exists = handshakes[addr] - hsLock.RUnlock() + hsI, exists = handshakes.Load(addr) if !exists { peerID = idsCache.Find(buf[:n]) if peerID == nil { @@ -109,12 +111,11 @@ func startUDP() { ) hs.Server(buf[:n]) udpBufs <- buf - hsLock.Lock() - handshakes[addr] = hs - hsLock.Unlock() + handshakes.Store(addr, hs) continue } + hs = hsI.(*govpn.Handshake) peer := hs.Server(buf[:n]) if peer == nil { udpBufs <- buf @@ -125,24 +126,19 @@ func startUDP() { *bindAddr, addr, peerID.String(), ) hs.Zero() - hsLock.Lock() - delete(handshakes, addr) - hsLock.Unlock() + handshakes.Delete(addr) go func() { udpBufs <- make([]byte, govpn.MTUMax) udpBufs <- make([]byte, govpn.MTUMax) }() - peersByIDLock.RLock() - addrPrev, exists = peersByID[*peer.ID] - peersByIDLock.RUnlock() - var peerPrev *PeerState + addrPrevI, exists = peersByID.Load(*peer.ID) if exists { - peersLock.Lock() - peerPrev = peers[addrPrev] - if peerPrev == nil { - exists = false - peersLock.Unlock() + addrPrev = addrPrevI.(string) + peerPrevI, exists = peers.Load(addrPrev) + if exists { + peerPrev = peerPrevI.(*PeerState) + exists = peerPrev == nil } } if exists { @@ -157,16 +153,11 @@ func startUDP() { <-udpBufs <-udpBufs }(psNew.peer, psNew.tap, psNew.terminator) - peersByIDLock.Lock() - kpLock.Lock() - delete(peers, addrPrev) - delete(knownPeers, addrPrev) - peers[addr] = psNew - knownPeers[addr] = &peer - peersByID[*peer.ID] = addr - peersLock.Unlock() - peersByIDLock.Unlock() - kpLock.Unlock() + peers.Delete(addrPrev) + peers.Store(addr, psNew) + knownPeers.Delete(addrPrev) + knownPeers.Store(addr, &peer) + peersByID.Store(*peer.ID, addr) govpn.Printf( `[rehandshake-completed bind="%s" peer="%s"]`, *bindAddr, peer.ID.String(), @@ -195,15 +186,9 @@ func startUDP() { <-udpBufs <-udpBufs }(psNew.peer, psNew.tap, psNew.terminator) - peersLock.Lock() - peersByIDLock.Lock() - kpLock.Lock() - peers[addr] = psNew - knownPeers[addr] = &peer - peersByID[*peer.ID] = addr - peersLock.Unlock() - peersByIDLock.Unlock() - kpLock.Unlock() + peers.Store(addr, psNew) + knownPeers.Store(addr, &peer) + peersByID.Store(*peer.ID, addr) govpn.Printf( `[peer-created bind="%s" peer="%s"]`, *bindAddr, diff --git a/src/cypherpunks.ru/govpn/stats.go b/src/cypherpunks.ru/govpn/stats.go index c8ea622..8354d39 100644 --- a/src/cypherpunks.ru/govpn/stats.go +++ b/src/cypherpunks.ru/govpn/stats.go @@ -22,6 +22,7 @@ import ( "encoding/json" "log" "net" + "sync" "time" ) @@ -29,15 +30,13 @@ const ( RWTimeout = 10 * time.Second ) -type KnownPeers map[string]**Peer - // StatsProcessor is assumed to be run in background. It accepts // connection on statsPort, reads anything one send to them and show // information about known peers in serialized JSON format. peers // argument is a reference to the map with references to the peers as // values. Map is used here because of ease of adding and removing // elements in it. -func StatsProcessor(statsPort net.Listener, peers *KnownPeers) { +func StatsProcessor(statsPort net.Listener, peers *sync.Map) { var conn net.Conn var err error var data []byte @@ -52,9 +51,10 @@ func StatsProcessor(statsPort net.Listener, peers *KnownPeers) { conn.Read(buf) conn.Write([]byte("HTTP/1.0 200 OK\r\nContent-Type: application/json\r\n\r\n")) var peersList []*Peer - for _, peer := range *peers { - peersList = append(peersList, *peer) - } + peers.Range(func(_, peerI interface{}) bool { + peersList = append(peersList, *peerI.(**Peer)) + return true + }) data, err = json.Marshal(peersList) if err != nil { panic(err) diff --git a/src/cypherpunks.ru/govpn/verifier.go b/src/cypherpunks.ru/govpn/verifier.go index 8be6ea7..26e0275 100644 --- a/src/cypherpunks.ru/govpn/verifier.go +++ b/src/cypherpunks.ru/govpn/verifier.go @@ -133,9 +133,9 @@ func KeyRead(path string) (string, error) { var err error var pass string if path == "" { - os.Stderr.Write([]byte("Passphrase:")) + os.Stderr.WriteString("Passphrase:") p, err = terminal.ReadPassword(0) - os.Stderr.Write([]byte("\n")) + os.Stderr.WriteString("\n") pass = string(p) } else { p, err = ioutil.ReadFile(path) diff --git a/src/golang.org/x/crypto b/src/golang.org/x/crypto index 573951c..81e9090 160000 --- a/src/golang.org/x/crypto +++ b/src/golang.org/x/crypto @@ -1 +1 @@ -Subproject commit 573951cbe80bb6352881271bb276f48749eab6f4 +Subproject commit 81e90905daefcd6fd217b62423c0908922eadb30 diff --git a/src/golang.org/x/sys b/src/golang.org/x/sys new file mode 160000 index 0000000..2d6f6f8 --- /dev/null +++ b/src/golang.org/x/sys @@ -0,0 +1 @@ +Subproject commit 2d6f6f883a06fc0d5f4b14a81e4c28705ea64c15 diff --git a/utils/makedist.sh b/utils/makedist.sh index 3deab39..7b1547b 100755 --- a/utils/makedist.sh +++ b/utils/makedist.sh @@ -12,6 +12,7 @@ repos=" src/github.com/bigeagle/water src/gopkg.in/yaml.v2 src/golang.org/x/crypto + src/golang.org/x/sys " for repo in $repos; do git clone $repo $tmp/govpn-$release/$repo @@ -25,12 +26,18 @@ golang.org/x/crypto/AUTHORS golang.org/x/crypto/CONTRIBUTORS golang.org/x/crypto/LICENSE golang.org/x/crypto/PATENTS -golang.org/x/crypto/README +golang.org/x/crypto/README.md golang.org/x/crypto/blake2b golang.org/x/crypto/chacha20poly1305/internal/chacha20 golang.org/x/crypto/curve25519 golang.org/x/crypto/poly1305 golang.org/x/crypto/ssh/terminal +golang.org/x/sys/AUTHORS +golang.org/x/sys/CONTRIBUTORS +golang.org/x/sys/LICENSE +golang.org/x/sys/PATENTS +golang.org/x/sys/README +golang.org/x/sys/unix EOF tar cfCI - src $tmp/includes | tar xfC - $tmp rm -fr src/golang.org @@ -99,7 +106,8 @@ $(git cat-file -p $release | sed -n '6,/^.*BEGIN/p' | sed '$d') ------------------------ >8 ------------------------ GoVPN's home page is: http://www.govpn.info/ -also available as Tor hidden service: http://2wir2p7ibeu72jk3.onion/ +Also available as I2P service: +http://zy2qxyziqzledqqb5vcq5unfxnn2csv6revteliybd7qxb64dpxq.b32.i2p/ Source code and its signature for that version can be found here: @@ -145,10 +153,11 @@ $(git cat-file -p $release | sed -n '6,/^.*BEGIN/p' | sed '$d') ------------------------ >8 ------------------------ Домашняя страница GoVPN: http://www.govpn.info/ -также доступна как скрытый сервис Tor: http://2wir2p7ibeu72jk3.onion/ +Также доступная как I2P сервис: +http://zy2qxyziqzledqqb5vcq5unfxnn2csv6revteliybd7qxb64dpxq.b32.i2p/ Коротко о демоне: http://www.govpn.info/O-demone.html -Исходный код и его подпись для этой версии находится здесь: +Исходный код и его подпись для этой версии находятся здесь: http://www.govpn.info/download/govpn-${release}.tar.xz ($size KiB) http://www.govpn.info/download/govpn-${release}.tar.xz.sig