auto adjust server and local timestamp for totp
This commit is contained in:
@@ -77,7 +77,7 @@ type NetworkConfig struct {
|
|||||||
os string
|
os string
|
||||||
publicIP string
|
publicIP string
|
||||||
natType int
|
natType int
|
||||||
shareBandwidth int
|
ShareBandwidth int
|
||||||
// server info
|
// server info
|
||||||
ServerHost string
|
ServerHost string
|
||||||
ServerPort int
|
ServerPort int
|
||||||
|
|||||||
@@ -129,6 +129,27 @@ func install() {
|
|||||||
shareBandwidth := installFlag.Int("sharebandwidth", 10, "N mbps share bandwidth limit, private node no limit")
|
shareBandwidth := installFlag.Int("sharebandwidth", 10, "N mbps share bandwidth limit, private node no limit")
|
||||||
// logLevel := installFlag.Int("loglevel", 1, "0:debug 1:info 2:warn 3:error")
|
// logLevel := installFlag.Int("loglevel", 1, "0:debug 1:info 2:warn 3:error")
|
||||||
installFlag.Parse(os.Args[2:])
|
installFlag.Parse(os.Args[2:])
|
||||||
|
checkParams(*node, *user, *password)
|
||||||
|
gConf.Network.ServerHost = *serverHost
|
||||||
|
gConf.Network.User = *user
|
||||||
|
gConf.Network.Node = *node
|
||||||
|
gConf.Network.Password = *password
|
||||||
|
gConf.Network.ServerPort = 27182
|
||||||
|
gConf.Network.UDPPort1 = 27182
|
||||||
|
gConf.Network.UDPPort2 = 27183
|
||||||
|
gConf.Network.NoShare = *noShare
|
||||||
|
gConf.Network.ShareBandwidth = *shareBandwidth
|
||||||
|
config := AppConfig{}
|
||||||
|
config.PeerNode = *peerNode
|
||||||
|
config.PeerUser = *peerUser
|
||||||
|
config.PeerPassword = *peerPassword
|
||||||
|
config.DstHost = *dstIP
|
||||||
|
config.DstPort = *dstPort
|
||||||
|
config.SrcPort = *srcPort
|
||||||
|
config.Protocol = *protocol
|
||||||
|
gConf.add(config)
|
||||||
|
os.Chdir(defaultInstallPath)
|
||||||
|
gConf.save()
|
||||||
|
|
||||||
// copy files
|
// copy files
|
||||||
os.MkdirAll(defaultInstallPath, 0775)
|
os.MkdirAll(defaultInstallPath, 0775)
|
||||||
@@ -153,27 +174,6 @@ func install() {
|
|||||||
}
|
}
|
||||||
src.Close()
|
src.Close()
|
||||||
dst.Close()
|
dst.Close()
|
||||||
gConf.Network.ServerHost = *serverHost
|
|
||||||
gConf.Network.User = *user
|
|
||||||
gConf.Network.Node = *node
|
|
||||||
gConf.Network.Password = *password
|
|
||||||
gConf.Network.ServerPort = 27182
|
|
||||||
gConf.Network.UDPPort1 = 27182
|
|
||||||
gConf.Network.UDPPort2 = 27183
|
|
||||||
gConf.Network.NoShare = *noShare
|
|
||||||
gConf.Network.shareBandwidth = *shareBandwidth
|
|
||||||
config := AppConfig{}
|
|
||||||
config.PeerNode = *peerNode
|
|
||||||
config.PeerUser = *peerUser
|
|
||||||
config.PeerPassword = *peerPassword
|
|
||||||
config.DstHost = *dstIP
|
|
||||||
config.DstPort = *dstPort
|
|
||||||
config.SrcPort = *srcPort
|
|
||||||
config.Protocol = *protocol
|
|
||||||
gConf.add(config)
|
|
||||||
// TODO other params
|
|
||||||
os.Chdir(defaultInstallPath)
|
|
||||||
gConf.save()
|
|
||||||
|
|
||||||
// install system service
|
// install system service
|
||||||
d := daemon{}
|
d := daemon{}
|
||||||
@@ -210,3 +210,18 @@ func uninstall() {
|
|||||||
os.Rename(binPath, binPath+"0")
|
os.Rename(binPath, binPath+"0")
|
||||||
os.RemoveAll(defaultInstallPath)
|
os.RemoveAll(defaultInstallPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func checkParams(node, user, password string) {
|
||||||
|
if len(node) < 8 {
|
||||||
|
gLog.Println(LevelERROR, "node name too short, it must >=8 charaters")
|
||||||
|
os.Exit(9)
|
||||||
|
}
|
||||||
|
if len(user) < 8 {
|
||||||
|
gLog.Println(LevelERROR, "user name too short, it must >=8 charaters")
|
||||||
|
os.Exit(9)
|
||||||
|
}
|
||||||
|
if len(password) < 8 {
|
||||||
|
gLog.Println(LevelERROR, "password too short, it must >=8 charaters")
|
||||||
|
os.Exit(9)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+11
-13
@@ -22,6 +22,14 @@ func main() {
|
|||||||
case "update":
|
case "update":
|
||||||
gLog = InitLogger(filepath.Dir(os.Args[0]), "openp2p", LevelDEBUG, 1024*1024, LogFileAndConsole)
|
gLog = InitLogger(filepath.Dir(os.Args[0]), "openp2p", LevelDEBUG, 1024*1024, LogFileAndConsole)
|
||||||
update()
|
update()
|
||||||
|
targetPath := filepath.Join(defaultInstallPath, defaultBinName)
|
||||||
|
d := daemon{}
|
||||||
|
err := d.Control("restart", targetPath, []string{"-d", "-f"})
|
||||||
|
if err != nil {
|
||||||
|
gLog.Println(LevelERROR, "restart service error:", err)
|
||||||
|
} else {
|
||||||
|
gLog.Println(LevelINFO, "restart service ok.")
|
||||||
|
}
|
||||||
return
|
return
|
||||||
case "install":
|
case "install":
|
||||||
install()
|
install()
|
||||||
@@ -50,6 +58,7 @@ func main() {
|
|||||||
byDaemon := flag.Bool("bydaemon", false, "start by daemon")
|
byDaemon := flag.Bool("bydaemon", false, "start by daemon")
|
||||||
logLevel := flag.Int("loglevel", 1, "0:debug 1:info 2:warn 3:error")
|
logLevel := flag.Int("loglevel", 1, "0:debug 1:info 2:warn 3:error")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
gLog = InitLogger(filepath.Dir(os.Args[0]), "openp2p", LogLevel(*logLevel), 1024*1024, LogFileAndConsole)
|
gLog = InitLogger(filepath.Dir(os.Args[0]), "openp2p", LogLevel(*logLevel), 1024*1024, LogFileAndConsole)
|
||||||
gLog.Println(LevelINFO, "openp2p start. version: ", OpenP2PVersion)
|
gLog.Println(LevelINFO, "openp2p start. version: ", OpenP2PVersion)
|
||||||
if *daemonMode {
|
if *daemonMode {
|
||||||
@@ -59,18 +68,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
if !*configFile {
|
if !*configFile {
|
||||||
// validate cmd params
|
// validate cmd params
|
||||||
if *node == "" {
|
checkParams(*node, *user, *password)
|
||||||
gLog.Println(LevelERROR, "node name not set", os.Args, len(os.Args), os.Args[0])
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if *user == "" {
|
|
||||||
gLog.Println(LevelERROR, "user name not set")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if *password == "" {
|
|
||||||
gLog.Println(LevelERROR, "password not set")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if *peerNode != "" {
|
if *peerNode != "" {
|
||||||
if *dstPort == 0 {
|
if *dstPort == 0 {
|
||||||
gLog.Println(LevelERROR, "dstPort not set")
|
gLog.Println(LevelERROR, "dstPort not set")
|
||||||
@@ -109,7 +107,7 @@ func main() {
|
|||||||
UDPPort1: 27182,
|
UDPPort1: 27182,
|
||||||
UDPPort2: 27183,
|
UDPPort2: 27183,
|
||||||
ipv6: "240e:3b7:621:def0:fda4:dd7f:36a1:2803", // TODO: detect real ipv6
|
ipv6: "240e:3b7:621:def0:fda4:dd7f:36a1:2803", // TODO: detect real ipv6
|
||||||
shareBandwidth: *shareBandwidth,
|
ShareBandwidth: *shareBandwidth,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// gConf.save() // not change config file
|
// gConf.save() // not change config file
|
||||||
|
|||||||
+11
-8
@@ -30,7 +30,8 @@ type P2PNetwork struct {
|
|||||||
restartCh chan bool
|
restartCh chan bool
|
||||||
wg sync.WaitGroup
|
wg sync.WaitGroup
|
||||||
writeMtx sync.Mutex
|
writeMtx sync.Mutex
|
||||||
serverTs uint64
|
serverTs int64
|
||||||
|
localTs int64
|
||||||
// msgMap sync.Map
|
// msgMap sync.Map
|
||||||
msgMap map[uint64]chan []byte //key: nodeID
|
msgMap map[uint64]chan []byte //key: nodeID
|
||||||
msgMapMtx sync.Mutex
|
msgMapMtx sync.Mutex
|
||||||
@@ -48,7 +49,7 @@ func P2PNetworkInstance(config *NetworkConfig) *P2PNetwork {
|
|||||||
online: false,
|
online: false,
|
||||||
running: true,
|
running: true,
|
||||||
msgMap: make(map[uint64]chan []byte),
|
msgMap: make(map[uint64]chan []byte),
|
||||||
limiter: newBandwidthLimiter(config.shareBandwidth),
|
limiter: newBandwidthLimiter(config.ShareBandwidth),
|
||||||
}
|
}
|
||||||
instance.msgMap[0] = make(chan []byte) // for gateway
|
instance.msgMap[0] = make(chan []byte) // for gateway
|
||||||
if config != nil {
|
if config != nil {
|
||||||
@@ -249,7 +250,7 @@ func (pn *P2PNetwork) AddApp(config AppConfig) error {
|
|||||||
PeerUser: config.PeerUser,
|
PeerUser: config.PeerUser,
|
||||||
PeerNatType: peerNatType,
|
PeerNatType: peerNatType,
|
||||||
PeerIP: peerIP,
|
PeerIP: peerIP,
|
||||||
ShareBandwidth: pn.config.shareBandwidth,
|
ShareBandwidth: pn.config.ShareBandwidth,
|
||||||
RelayNode: relayNode,
|
RelayNode: relayNode,
|
||||||
Version: OpenP2PVersion,
|
Version: OpenP2PVersion,
|
||||||
}
|
}
|
||||||
@@ -391,7 +392,6 @@ func (pn *P2PNetwork) init() error {
|
|||||||
q.Add("password", pn.config.Password)
|
q.Add("password", pn.config.Password)
|
||||||
q.Add("version", OpenP2PVersion)
|
q.Add("version", OpenP2PVersion)
|
||||||
q.Add("nattype", fmt.Sprintf("%d", pn.config.natType))
|
q.Add("nattype", fmt.Sprintf("%d", pn.config.natType))
|
||||||
q.Add("timestamp", fmt.Sprintf("%d", time.Now().Unix()))
|
|
||||||
|
|
||||||
noShareStr := "false"
|
noShareStr := "false"
|
||||||
if pn.config.NoShare {
|
if pn.config.NoShare {
|
||||||
@@ -465,8 +465,9 @@ func (pn *P2PNetwork) handleMessage(t int, msg []byte) {
|
|||||||
gLog.Printf(LevelERROR, "login error:%d, detail:%s", rsp.Error, rsp.Detail)
|
gLog.Printf(LevelERROR, "login error:%d, detail:%s", rsp.Error, rsp.Detail)
|
||||||
pn.running = false
|
pn.running = false
|
||||||
} else {
|
} else {
|
||||||
gLog.Printf(LevelINFO, "login ok. Server ts=%d, local ts=%d", rsp.Ts, time.Now().Unix())
|
|
||||||
pn.serverTs = rsp.Ts
|
pn.serverTs = rsp.Ts
|
||||||
|
pn.localTs = time.Now().Unix()
|
||||||
|
gLog.Printf(LevelINFO, "login ok. Server ts=%d, local ts=%d", rsp.Ts, pn.localTs)
|
||||||
}
|
}
|
||||||
case MsgHeartbeat:
|
case MsgHeartbeat:
|
||||||
gLog.Printf(LevelDEBUG, "P2PNetwork heartbeat ok")
|
gLog.Printf(LevelDEBUG, "P2PNetwork heartbeat ok")
|
||||||
@@ -609,7 +610,9 @@ func (pn *P2PNetwork) handlePush(subType uint16, msg []byte) error {
|
|||||||
gLog.Printf(LevelINFO, "%s is connecting...", req.From)
|
gLog.Printf(LevelINFO, "%s is connecting...", req.From)
|
||||||
gLog.Println(LevelDEBUG, "push connect response to ", req.From)
|
gLog.Println(LevelDEBUG, "push connect response to ", req.From)
|
||||||
// verify token or name&password
|
// verify token or name&password
|
||||||
if VerifyTOTP(req.Token, pn.config.User, pn.config.Password, time.Now().Unix()) || (req.User == pn.config.User && req.Password == pn.config.Password) {
|
if VerifyTOTP(req.Token, pn.config.User, pn.config.Password, time.Now().Unix()+(pn.serverTs-pn.localTs)) || // localTs may behind, auto adjust ts
|
||||||
|
VerifyTOTP(req.Token, pn.config.User, pn.config.Password, time.Now().Unix()) ||
|
||||||
|
(req.User == pn.config.User && req.Password == pn.config.Password) {
|
||||||
gLog.Printf(LevelINFO, "Access Granted\n")
|
gLog.Printf(LevelINFO, "Access Granted\n")
|
||||||
config := AppConfig{}
|
config := AppConfig{}
|
||||||
config.peerNatType = req.NatType
|
config.peerNatType = req.NatType
|
||||||
@@ -618,8 +621,8 @@ func (pn *P2PNetwork) handlePush(subType uint16, msg []byte) error {
|
|||||||
config.PeerNode = req.From
|
config.PeerNode = req.From
|
||||||
// share relay node will limit bandwidth
|
// share relay node will limit bandwidth
|
||||||
if req.User != pn.config.User || req.Password != pn.config.Password {
|
if req.User != pn.config.User || req.Password != pn.config.Password {
|
||||||
gLog.Printf(LevelINFO, "set share bandwidth %d mbps", pn.config.shareBandwidth)
|
gLog.Printf(LevelINFO, "set share bandwidth %d mbps", pn.config.ShareBandwidth)
|
||||||
config.shareBandwidth = pn.config.shareBandwidth
|
config.shareBandwidth = pn.config.ShareBandwidth
|
||||||
}
|
}
|
||||||
// go pn.AddTunnel(config, req.ID)
|
// go pn.AddTunnel(config, req.ID)
|
||||||
go pn.addDirectTunnel(config, req.ID)
|
go pn.addDirectTunnel(config, req.ID)
|
||||||
|
|||||||
+2
-2
@@ -11,7 +11,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
const OpenP2PVersion = "0.96.1"
|
const OpenP2PVersion = "0.97.0"
|
||||||
const ProducnName string = "openp2p"
|
const ProducnName string = "openp2p"
|
||||||
|
|
||||||
type openP2PHeader struct {
|
type openP2PHeader struct {
|
||||||
@@ -198,7 +198,7 @@ type PushRsp struct {
|
|||||||
type LoginRsp struct {
|
type LoginRsp struct {
|
||||||
Error int `json:"error,omitempty"`
|
Error int `json:"error,omitempty"`
|
||||||
Detail string `json:"detail,omitempty"`
|
Detail string `json:"detail,omitempty"`
|
||||||
Ts uint64 `json:"ts,omitempty"`
|
Ts int64 `json:"ts,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type NatDetectReq struct {
|
type NatDetectReq struct {
|
||||||
|
|||||||
Reference in New Issue
Block a user