Check for token in every received message.

This commit is contained in:
Milos Gajdos 2019-08-14 01:23:03 +01:00
parent 750267b308
commit e607485c6b
No known key found for this signature in database
GPG Key ID: 8B31058CC55DFD4F
2 changed files with 55 additions and 9 deletions

View File

@ -96,6 +96,7 @@ func (t *tun) newSocket(id, session string) (*socket, bool) {
t.Unlock() t.Unlock()
return nil, false return nil, false
} }
t.sockets[id+session] = s t.sockets[id+session] = s
t.Unlock() t.Unlock()
@ -158,21 +159,26 @@ func (t *tun) listen(link transport.Socket) {
return return
} }
// loopback flag
var loopback bool var loopback bool
switch msg.Header["Micro-Tunnel"] { // TODO: figure out the way how to populate Micro-Tunnel-Token for every message
case "connect":
// TODO: handle the connect message // check the Micro-Tunnel-Token
// check the Micro-Tunnel-Token token, ok := msg.Header["Micro-Tunnel-Token"]
token, ok := msg.Header["Micro-Tunnel-Token"] if ok {
if !ok {
// no token found; bailing
continue
}
// are we connecting to ourselves? // are we connecting to ourselves?
if token == t.token { if token == t.token {
loopback = true loopback = true
} }
}
switch msg.Header["Micro-Tunnel"] {
case "connect":
// connecting without token is not allowed
if token == "" {
continue
}
case "close": case "close":
// TODO: handle the close message // TODO: handle the close message
// maybe report io.EOF or kill the link // maybe report io.EOF or kill the link
@ -187,6 +193,8 @@ func (t *tun) listen(link transport.Socket) {
session := msg.Header["Micro-Tunnel-Session"] session := msg.Header["Micro-Tunnel-Session"]
delete(msg.Header, "Micro-Tunnel-Session") delete(msg.Header, "Micro-Tunnel-Session")
// TODO: should we delete Micro-Tunnel-Token header, too?
// if the session id is blank there's nothing we can do // if the session id is blank there's nothing we can do
// TODO: check this is the case, is there any reason // TODO: check this is the case, is there any reason
// why we'd have a blank session? Is the tunnel // why we'd have a blank session? Is the tunnel
@ -208,6 +216,12 @@ func (t *tun) listen(link transport.Socket) {
// this could be something we dialed in which case // this could be something we dialed in which case
// we have a session for it otherwise its a listener // we have a session for it otherwise its a listener
s, exists = t.getSocket(id, session) s, exists = t.getSocket(id, session)
if !exists {
// try get it based on just the tunnel id
// the assumption here is that a listener
// has no session but its set a listener session
s, exists = t.getSocket(id, "listener")
}
} }
// bail if no socket has been found // bail if no socket has been found
if !exists { if !exists {

View File

@ -98,3 +98,35 @@ func TestTunnel(t *testing.T) {
// wait until done // wait until done
wg.Wait() wg.Wait()
} }
//func TestLoopbackTunnel(t *testing.T) {
// // create a new tunnel client
// tun := NewTunnel(
// Address("127.0.0.1:9096"),
// Nodes("127.0.0.1:9096"),
// )
//
// // start tunB
// err := tun.Connect()
// if err != nil {
// t.Fatal(err)
// }
// defer tun.Close()
//
// time.Sleep(time.Millisecond * 50)
//
// var wg sync.WaitGroup
//
// // start accepting connections
// // on tunnel A
// wg.Add(1)
// go testAccept(t, tun, &wg)
//
// time.Sleep(time.Millisecond * 50)
//
// // dial and send via B
// testSend(t, tun)
//
// // wait until done
// wg.Wait()
//}