.gitmodules | 3 +++ README | 5 +++-- README.RU | 9 +++++---- THANKS | 2 +- VERSION | 2 +- common.mk | 2 +- doc/about.ru.texi | 2 +- doc/about.texi | 2 +- doc/contacts.texi | 7 +++---- doc/download.texi | 11 ++++++++--- doc/installation.texi | 16 ++++++++-------- doc/news.ru.texi | 7 +++++++ doc/news.texi | 7 +++++++ doc/sources.texi | 3 +-- ports/govpn/Makefile | 7 +++---- src/cypherpunks.ru/govpn/client/client.go | 4 ++-- src/cypherpunks.ru/govpn/client/tcp.go | 2 +- src/cypherpunks.ru/govpn/client/udp.go | 2 +- src/cypherpunks.ru/govpn/cmd/govpn-server/common.go | 15 ++++----------- src/cypherpunks.ru/govpn/cmd/govpn-server/main.go | 39 ++++++++++++++++++++------------------- src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go | 45 +++++++++++++++++---------------------------- src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go | 67 +++++++++++++++++++++-------------------------------- src/cypherpunks.ru/govpn/stats.go | 12 ++++++------ src/cypherpunks.ru/govpn/verifier.go | 4 ++-- utils/makedist.sh | 17 +++++++++++++---- diff --git a/.gitmodules b/.gitmodules index c837a039e17a5ea45e75cc416ebcd3cbe97f1dda..8b03d42057f6d46223b8695c24ddb201205987b6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,3 +14,6 @@ [submodule "src/gopkg.in/yaml.v2"] 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 51ee94e4b2e4af34c87f5dfc7331e78bbf849555..221809ea61dc3139fa8eb0c19c0578160dcf2d29 100644 --- a/README +++ b/README @@ -15,13 +15,14 @@ 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 63b702462f3f6ea8eb48b55200ab5dbf152a6dff..f1731a21830c7355e28dfb1c904ffdc4f70d5046 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 a7fe0af928a49fd277d4e7705927aa906c011744..d2294bfc0f3f7c461e7886e542570cf9a601d600 100644 --- a/THANKS +++ b/THANKS @@ -2,4 +2,4 @@ * Watson Ladd for suggestion of Elligator encoding. * 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 f99416236e9fc148fb5b694705c04492d60793dd..37722ebbc756a3160e7f4aeb04d4c8f69e5fa8a3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -7.3 +7.4 diff --git a/common.mk b/common.mk index 99e1c0d1b6c9eb1247020f598b0fa2b8240ce666..988964fdd09892feaf487460efc952847abeb682 100644 --- a/common.mk +++ b/common.mk @@ -38,7 +38,7 @@ mkdir -p $(SHAREDIR) 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 0c45017ca7ed2b3d2422c36f4d2ebeb9bea5f6d8..c56eaafb0a2b57163108b48b566589a4b08cd924 100644 --- a/doc/about.ru.texi +++ b/doc/about.ru.texi @@ -10,7 +10,7 @@ @item @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 7cda5af5d6db5f52bc8d6466b986c1888538a54b..5fbafe7fd2530d29d7fa774e01d95346f4efb8b8 100644 --- a/doc/about.texi +++ b/doc/about.texi @@ -9,7 +9,7 @@ @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 15e5235c6d3a94893f0c2a14e2c9f1e5b0fe8410..1c8b5b27219e7e370461db8333350028ef1c2755 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 f12e40ea8baf78ffde4f6cf12a3c246ca1ec54e3..463aa91408662278ddc0c4276575c0cfd960e630 100644 --- a/doc/download.texi +++ b/doc/download.texi @@ -1,22 +1,27 @@ @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} @@ -136,4 +141,4 @@ @tab @code{715B07D4 D1EA4396 C3E37014 CA65EC37 68818423 521F3C12 E7200B6E DCA48C31} @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 9abc8229d6a215403f6ef11e9d0fe16ce38f4cc8..1f8a74c36bf06b4a70a4965f2c595b21d6b554c8 100644 --- a/doc/installation.texi +++ b/doc/installation.texi @@ -11,14 +11,14 @@ @item @url{https://pkgs.org/download/govpn, openSUSE OSS} @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 f00c3b1b1aa36fb30f98ac7de7dd8f845af3216c..08aa4c792c698d60564ac5b489f757e928634263 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 cb119e25ab565d8bb49dc1dc3edc9d72f5fe0e78..03d61ef30df7ea66c02ca10ff9314cde2bf4a3f5 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -3,6 +3,13 @@ @unnumbered News 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 f3864ef47fef546637e4611d8133c097b0e08331..7ceeebf2a8a113e4e0e32aee46f08488c965924b 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 5d78be67a0148e00d9f6e2c1a7cf51fa34b8bf49..8e7a2eb1986d9a3d5dae4334aa54e0741e494522 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 @@ 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/govpn/client/client.go b/src/cypherpunks.ru/govpn/client/client.go index 8102cc6cdf1430217a27052526496b8c8af446a4..3014bdfab6adf0bf9276d6e31a7575286917791b 100644 --- a/src/cypherpunks.ru/govpn/client/client.go +++ b/src/cypherpunks.ru/govpn/client/client.go @@ -23,6 +23,7 @@ "errors" "fmt" "net" "os" + "sync" "time" "github.com/agl/ed25519" @@ -72,7 +73,7 @@ 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 @@ if err != nil { 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 40d81ca818081789c3a9f87ac4e4a2f063c63a76..4bb7a5fd4856390f812045da4b03bd831270709d 100644 --- a/src/cypherpunks.ru/govpn/client/tcp.go +++ b/src/cypherpunks.ru/govpn/client/tcp.go @@ -86,7 +86,7 @@ if peer == nil { 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 bb7045ac711778f25e8a9f8d839dea3ae9f11d92..bb29dccd961f4fd0385046a23f33de123277d433 100644 --- a/src/cypherpunks.ru/govpn/client/udp.go +++ b/src/cypherpunks.ru/govpn/client/udp.go @@ -93,7 +93,7 @@ if peer == nil { 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 f18d34b420c964a644dcbc4ae76170c1672e8800..e0e8e033da043f42a000a219f3559d1f0fbda613 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 @@ tap *govpn.TAP } 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 3e80975587fbe6df3abd8572d9ae23d7ddea9aa1..0dfd8ab83198f449f7d4148f8e1e11c780eff189 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 @@ log.SetFlags(log.Ldate | log.Lmicroseconds | log.Lshortfile) log.Println(govpn.VersionGet()) confInit() - knownPeers = govpn.KnownPeers(make(map[string]**govpn.Peer)) if *egdPath != "" { log.Println("Using", *egdPath, "EGD") @@ -106,28 +105,33 @@ for { 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 @@ `[peer-delete bind="%s" peer="%s"]`, *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 @@ ps.peer.Addr, ) 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 61eb1e07395fcc8b10ddf690d43b706b0f28300b..aab59b723c57986d5520e64e6251f45c5f3e812e 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 @@ var ps *PeerState 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 @@ govpn.Printf( `[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 @@ tap: tap, 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 @@ tap: tap, 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 037351778f566605fcc28733350ac60d663cc978..f074df47a6740ff390a665c3cfc94c3bfb1e0454 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 @@ var raddr *net.UDPAddr 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 @@ break } 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 @@ }(ps.peer, ps.tap, buf, n) 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 @@ conf, ) 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 @@ `[handshake-completed bind="%s" addr="%s" peer="%s"]`, *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 @@ govpn.PeerTapProcessor(peer, tap, terminator) <-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 @@ govpn.PeerTapProcessor(peer, tap, terminator) <-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 c8ea6223e655912e60e6623344838174a7f6a718..8354d39de8a2f73008cb0883ae23eea51d0946b3 100644 --- a/src/cypherpunks.ru/govpn/stats.go +++ b/src/cypherpunks.ru/govpn/stats.go @@ -22,14 +22,13 @@ import ( "encoding/json" "log" "net" + "sync" "time" ) 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 @@ -37,7 +36,7 @@ // 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 @@ conn.SetDeadline(time.Now().Add(RWTimeout)) 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 8be6ea7ac62c1f25e1d2222d4176c7465b7b1c71..26e0275df46e7db2226c9d8b388663e530ed4a7a 100644 --- a/src/cypherpunks.ru/govpn/verifier.go +++ b/src/cypherpunks.ru/govpn/verifier.go @@ -133,9 +133,9 @@ var p []byte 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/utils/makedist.sh b/utils/makedist.sh index 3deab39ef1f53b5038561736b142ecd4b34a0733..7b1547bdd7a15b9c00b17e1ca9e451ce7028aac2 100755 --- a/utils/makedist.sh +++ b/utils/makedist.sh @@ -12,6 +12,7 @@ src/github.com/agl/ed25519 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 @@ ------------------------ >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 @@ ------------------------ >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