diff --git a/internal/allocation/allocation.go b/internal/allocation/allocation.go index 5b5ff369..77400701 100644 --- a/internal/allocation/allocation.go +++ b/internal/allocation/allocation.go @@ -28,6 +28,7 @@ type Allocation struct { Protocol Protocol TurnSocket net.PacketConn RelaySocket net.PacketConn + Username string fiveTuple *FiveTuple permissionsLock sync.RWMutex permissions map[string]*Permission @@ -45,10 +46,11 @@ type Allocation struct { } // NewAllocation creates a new instance of NewAllocation. -func NewAllocation(turnSocket net.PacketConn, fiveTuple *FiveTuple, log logging.LeveledLogger) *Allocation { +func NewAllocation(turnSocket net.PacketConn, fiveTuple *FiveTuple, username string, log logging.LeveledLogger) *Allocation { return &Allocation{ TurnSocket: turnSocket, fiveTuple: fiveTuple, + Username: username, permissions: make(map[string]*Permission, 64), closed: make(chan interface{}), log: log, diff --git a/internal/allocation/allocation_manager.go b/internal/allocation/allocation_manager.go index 2b765921..4ef241d8 100644 --- a/internal/allocation/allocation_manager.go +++ b/internal/allocation/allocation_manager.go @@ -15,8 +15,8 @@ import ( // ManagerConfig a bag of config params for Manager. type ManagerConfig struct { LeveledLogger logging.LeveledLogger - AllocatePacketConn func(network string, requestedPort int) (net.PacketConn, net.Addr, error) - AllocateConn func(network string, requestedPort int) (net.Conn, net.Addr, error) + AllocatePacketConn func(network string, requestedPort int, username string) (net.PacketConn, net.Addr, error) + AllocateConn func(network string, requestedPort int, username string) (net.Conn, net.Addr, error) PermissionHandler func(sourceAddr net.Addr, peerIP net.IP) bool } @@ -33,8 +33,8 @@ type Manager struct { allocations map[FiveTupleFingerprint]*Allocation reservations []*reservation - allocatePacketConn func(network string, requestedPort int) (net.PacketConn, net.Addr, error) - allocateConn func(network string, requestedPort int) (net.Conn, net.Addr, error) + allocatePacketConn func(network string, requestedPort int, username string) (net.PacketConn, net.Addr, error) + allocateConn func(network string, requestedPort int, username string) (net.Conn, net.Addr, error) permissionHandler func(sourceAddr net.Addr, peerIP net.IP) bool } @@ -86,7 +86,7 @@ func (m *Manager) Close() error { } // CreateAllocation creates a new allocation and starts relaying -func (m *Manager) CreateAllocation(fiveTuple *FiveTuple, turnSocket net.PacketConn, requestedPort int, lifetime time.Duration) (*Allocation, error) { +func (m *Manager) CreateAllocation(fiveTuple *FiveTuple, turnSocket net.PacketConn, requestedPort int, lifetime time.Duration, username string) (*Allocation, error) { switch { case fiveTuple == nil: return nil, errNilFiveTuple @@ -103,9 +103,9 @@ func (m *Manager) CreateAllocation(fiveTuple *FiveTuple, turnSocket net.PacketCo if a := m.GetAllocation(fiveTuple); a != nil { return nil, fmt.Errorf("%w: %v", errDupeFiveTuple, fiveTuple) } - a := NewAllocation(turnSocket, fiveTuple, m.log) + a := NewAllocation(turnSocket, fiveTuple, username, m.log) - conn, relayAddr, err := m.allocatePacketConn("udp4", requestedPort) + conn, relayAddr, err := m.allocatePacketConn("udp4", requestedPort, username) if err != nil { return nil, err } @@ -180,9 +180,13 @@ func (m *Manager) GetReservation(reservationToken string) (int, bool) { } // GetRandomEvenPort returns a random un-allocated udp4 port -func (m *Manager) GetRandomEvenPort() (int, error) { +func (m *Manager) GetRandomEvenPort(username string) (int, error) { for i := 0; i < 128; i++ { - conn, addr, err := m.allocatePacketConn("udp4", 0) + conn, addr, err := m.allocatePacketConn("udp4", 0, username) + if err != nil { + return 0, err + } + if err != nil { return 0, err } diff --git a/internal/allocation/allocation_manager_test.go b/internal/allocation/allocation_manager_test.go index 014d85d3..0374bc4f 100644 --- a/internal/allocation/allocation_manager_test.go +++ b/internal/allocation/allocation_manager_test.go @@ -7,6 +7,7 @@ package allocation import ( + "errors" "io" "math/rand" "net" @@ -22,7 +23,7 @@ import ( func TestManager(t *testing.T) { tt := []struct { name string - f func(*testing.T, net.PacketConn) + f func(*testing.T, net.PacketConn, string) }{ {"CreateInvalidAllocation", subTestCreateInvalidAllocation}, {"CreateAllocation", subTestCreateAllocation}, @@ -42,34 +43,34 @@ func TestManager(t *testing.T) { for _, tc := range tt { f := tc.f t.Run(tc.name, func(t *testing.T) { - f(t, turnSocket) + f(t, turnSocket, "test_user_1") }) } } // Test invalid Allocation creations -func subTestCreateInvalidAllocation(t *testing.T, turnSocket net.PacketConn) { - m, err := newTestManager() +func subTestCreateInvalidAllocation(t *testing.T, turnSocket net.PacketConn, username string) { + m, err := newTestManager(username) assert.NoError(t, err) - if a, err := m.CreateAllocation(nil, turnSocket, 0, proto.DefaultLifetime); a != nil || err == nil { + if a, err := m.CreateAllocation(nil, turnSocket, 0, proto.DefaultLifetime, username); a != nil || err == nil { t.Errorf("Illegally created allocation with nil FiveTuple") } - if a, err := m.CreateAllocation(randomFiveTuple(), nil, 0, proto.DefaultLifetime); a != nil || err == nil { + if a, err := m.CreateAllocation(randomFiveTuple(), nil, 0, proto.DefaultLifetime, username); a != nil || err == nil { t.Errorf("Illegally created allocation with nil turnSocket") } - if a, err := m.CreateAllocation(randomFiveTuple(), turnSocket, 0, 0); a != nil || err == nil { + if a, err := m.CreateAllocation(randomFiveTuple(), turnSocket, 0, 0, username); a != nil || err == nil { t.Errorf("Illegally created allocation with 0 lifetime") } } // Test valid Allocation creations -func subTestCreateAllocation(t *testing.T, turnSocket net.PacketConn) { - m, err := newTestManager() +func subTestCreateAllocation(t *testing.T, turnSocket net.PacketConn, username string) { + m, err := newTestManager(username) assert.NoError(t, err) fiveTuple := randomFiveTuple() - if a, err := m.CreateAllocation(fiveTuple, turnSocket, 0, proto.DefaultLifetime); a == nil || err != nil { + if a, err := m.CreateAllocation(fiveTuple, turnSocket, 0, proto.DefaultLifetime, username); a == nil || err != nil { t.Errorf("Failed to create allocation %v %v", a, err) } @@ -79,26 +80,26 @@ func subTestCreateAllocation(t *testing.T, turnSocket net.PacketConn) { } // Test that two allocations can't be created with the same FiveTuple -func subTestCreateAllocationDuplicateFiveTuple(t *testing.T, turnSocket net.PacketConn) { - m, err := newTestManager() +func subTestCreateAllocationDuplicateFiveTuple(t *testing.T, turnSocket net.PacketConn, username string) { + m, err := newTestManager(username) assert.NoError(t, err) fiveTuple := randomFiveTuple() - if a, err := m.CreateAllocation(fiveTuple, turnSocket, 0, proto.DefaultLifetime); a == nil || err != nil { + if a, err := m.CreateAllocation(fiveTuple, turnSocket, 0, proto.DefaultLifetime, username); a == nil || err != nil { t.Errorf("Failed to create allocation %v %v", a, err) } - if a, err := m.CreateAllocation(fiveTuple, turnSocket, 0, proto.DefaultLifetime); a != nil || err == nil { + if a, err := m.CreateAllocation(fiveTuple, turnSocket, 0, proto.DefaultLifetime, username); a != nil || err == nil { t.Errorf("Was able to create allocation with same FiveTuple twice") } } -func subTestDeleteAllocation(t *testing.T, turnSocket net.PacketConn) { - m, err := newTestManager() +func subTestDeleteAllocation(t *testing.T, turnSocket net.PacketConn, username string) { + m, err := newTestManager(username) assert.NoError(t, err) fiveTuple := randomFiveTuple() - if a, err := m.CreateAllocation(fiveTuple, turnSocket, 0, proto.DefaultLifetime); a == nil || err != nil { + if a, err := m.CreateAllocation(fiveTuple, turnSocket, 0, proto.DefaultLifetime, username); a == nil || err != nil { t.Errorf("Failed to create allocation %v %v", a, err) } @@ -113,8 +114,8 @@ func subTestDeleteAllocation(t *testing.T, turnSocket net.PacketConn) { } // Test that allocation should be closed if timeout -func subTestAllocationTimeout(t *testing.T, turnSocket net.PacketConn) { - m, err := newTestManager() +func subTestAllocationTimeout(t *testing.T, turnSocket net.PacketConn, username string) { + m, err := newTestManager(username) assert.NoError(t, err) allocations := make([]*Allocation, 5) @@ -123,7 +124,7 @@ func subTestAllocationTimeout(t *testing.T, turnSocket net.PacketConn) { for index := range allocations { fiveTuple := randomFiveTuple() - a, err := m.CreateAllocation(fiveTuple, turnSocket, 0, lifetime) + a, err := m.CreateAllocation(fiveTuple, turnSocket, 0, lifetime, username) if err != nil { t.Errorf("Failed to create allocation with %v", fiveTuple) } @@ -141,15 +142,15 @@ func subTestAllocationTimeout(t *testing.T, turnSocket net.PacketConn) { } // Test for manager close -func subTestManagerClose(t *testing.T, turnSocket net.PacketConn) { - m, err := newTestManager() +func subTestManagerClose(t *testing.T, turnSocket net.PacketConn, username string) { + m, err := newTestManager(username) assert.NoError(t, err) allocations := make([]*Allocation, 2) - a1, _ := m.CreateAllocation(randomFiveTuple(), turnSocket, 0, time.Second) + a1, _ := m.CreateAllocation(randomFiveTuple(), turnSocket, 0, time.Second, username) allocations[0] = a1 - a2, _ := m.CreateAllocation(randomFiveTuple(), turnSocket, 0, time.Minute) + a2, _ := m.CreateAllocation(randomFiveTuple(), turnSocket, 0, time.Minute, username) allocations[1] = a2 // Make a1 timeout @@ -174,12 +175,15 @@ func randomFiveTuple() *FiveTuple { } } -func newTestManager() (*Manager, error) { +func newTestManager(expectedUsername string) (*Manager, error) { loggerFactory := logging.NewDefaultLoggerFactory() config := ManagerConfig{ LeveledLogger: loggerFactory.NewLogger("test"), - AllocatePacketConn: func(string, int) (net.PacketConn, net.Addr, error) { + AllocatePacketConn: func(_ string, _ int, username string) (net.PacketConn, net.Addr, error) { + if username != expectedUsername { + return nil, nil, errors.New("unexpected user name") + } conn, err := net.ListenPacket("udp4", "0.0.0.0:0") if err != nil { return nil, nil, err @@ -187,8 +191,9 @@ func newTestManager() (*Manager, error) { return conn, conn.LocalAddr(), nil }, - AllocateConn: func(string, int) (net.Conn, net.Addr, error) { return nil, nil, nil }, + AllocateConn: func(string, int, string) (net.Conn, net.Addr, error) { return nil, nil, nil }, } + return NewManager(config) } @@ -197,11 +202,11 @@ func isClose(conn io.Closer) bool { return closeErr != nil && strings.Contains(closeErr.Error(), "use of closed network connection") } -func subTestGetRandomEvenPort(t *testing.T, _ net.PacketConn) { - m, err := newTestManager() +func subTestGetRandomEvenPort(t *testing.T, _ net.PacketConn, username string) { + m, err := newTestManager(username) assert.NoError(t, err) - port, err := m.GetRandomEvenPort() + port, err := m.GetRandomEvenPort(username) assert.NoError(t, err) assert.True(t, port > 0) assert.True(t, port%2 == 0) diff --git a/internal/allocation/allocation_test.go b/internal/allocation/allocation_test.go index 49269d68..8d84eb08 100644 --- a/internal/allocation/allocation_test.go +++ b/internal/allocation/allocation_test.go @@ -46,7 +46,7 @@ func TestAllocation(t *testing.T) { } func subTestGetPermission(t *testing.T) { - a := NewAllocation(nil, nil, nil) + a := NewAllocation(nil, nil, "", nil) addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:3478") if err != nil { @@ -88,7 +88,7 @@ func subTestGetPermission(t *testing.T) { } func subTestAddPermission(t *testing.T) { - a := NewAllocation(nil, nil, nil) + a := NewAllocation(nil, nil, "", nil) addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:3478") if err != nil { @@ -107,7 +107,7 @@ func subTestAddPermission(t *testing.T) { } func subTestRemovePermission(t *testing.T) { - a := NewAllocation(nil, nil, nil) + a := NewAllocation(nil, nil, "", nil) addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:3478") if err != nil { @@ -130,7 +130,7 @@ func subTestRemovePermission(t *testing.T) { } func subTestAddChannelBind(t *testing.T) { - a := NewAllocation(nil, nil, nil) + a := NewAllocation(nil, nil, "", nil) addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:3478") if err != nil { @@ -154,7 +154,7 @@ func subTestAddChannelBind(t *testing.T) { } func subTestGetChannelByNumber(t *testing.T) { - a := NewAllocation(nil, nil, nil) + a := NewAllocation(nil, nil, "", nil) addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:3478") if err != nil { @@ -173,7 +173,7 @@ func subTestGetChannelByNumber(t *testing.T) { } func subTestGetChannelByAddr(t *testing.T) { - a := NewAllocation(nil, nil, nil) + a := NewAllocation(nil, nil, "", nil) addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:3478") if err != nil { @@ -193,7 +193,7 @@ func subTestGetChannelByAddr(t *testing.T) { } func subTestRemoveChannelBind(t *testing.T) { - a := NewAllocation(nil, nil, nil) + a := NewAllocation(nil, nil, "", nil) addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:3478") if err != nil { @@ -214,7 +214,7 @@ func subTestRemoveChannelBind(t *testing.T) { } func subTestAllocationRefresh(t *testing.T) { - a := NewAllocation(nil, nil, nil) + a := NewAllocation(nil, nil, "", nil) var wg sync.WaitGroup wg.Add(1) @@ -236,7 +236,7 @@ func subTestAllocationClose(t *testing.T) { panic(err) } - a := NewAllocation(nil, nil, nil) + a := NewAllocation(nil, nil, "", nil) a.RelaySocket = l // Add mock lifetimeTimer a.lifetimeTimer = time.AfterFunc(proto.DefaultLifetime, func() {}) @@ -259,9 +259,12 @@ func subTestAllocationClose(t *testing.T) { } func subTestPacketHandler(t *testing.T) { - network := "udp" + const ( + network = "udp" + testUsername = "test_user_2" + ) - m, _ := newTestManager() + m, _ := newTestManager(testUsername) // TURN server initialization turnSocket, err := net.ListenPacket(network, "127.0.0.1:0") @@ -292,7 +295,7 @@ func subTestPacketHandler(t *testing.T) { a, err := m.CreateAllocation(&FiveTuple{ SrcAddr: clientListener.LocalAddr(), DstAddr: turnSocket.LocalAddr(), - }, turnSocket, 0, proto.DefaultLifetime) + }, turnSocket, 0, proto.DefaultLifetime, testUsername) assert.Nil(t, err, "should succeed") @@ -357,7 +360,7 @@ func subTestPacketHandler(t *testing.T) { } func subTestResponseCache(t *testing.T) { - a := NewAllocation(nil, nil, nil) + a := NewAllocation(nil, nil, "", nil) transactionID := [stun.TransactionIDSize]byte{1, 2, 3} responseAttrs := []stun.Setter{ &proto.Lifetime{ diff --git a/internal/allocation/channel_bind_test.go b/internal/allocation/channel_bind_test.go index 30e3034a..035ce6b5 100644 --- a/internal/allocation/channel_bind_test.go +++ b/internal/allocation/channel_bind_test.go @@ -42,7 +42,7 @@ func TestChannelBindReset(t *testing.T) { } func newChannelBind(lifetime time.Duration) *ChannelBind { - a := NewAllocation(nil, nil, nil) + a := NewAllocation(nil, nil, "", nil) addr, _ := net.ResolveUDPAddr("udp", "0.0.0.0:0") c := &ChannelBind{ diff --git a/internal/server/turn.go b/internal/server/turn.go index 46e45ecb..708defda 100644 --- a/internal/server/turn.go +++ b/internal/server/turn.go @@ -25,7 +25,7 @@ func handleAllocateRequest(r Request, m *stun.Message) error { // mechanism of [https://tools.ietf.org/html/rfc5389#section-10.2.2] // unless the client and server agree to use another mechanism through // some procedure outside the scope of this document. - messageIntegrity, hasAuth, err := authenticateRequest(r, m, stun.MethodAllocate) + messageIntegrity, username, hasAuth, err := authenticateRequest(r, m, stun.MethodAllocate) if !hasAuth { return err } @@ -104,7 +104,7 @@ func handleAllocateRequest(r Request, m *stun.Message) error { var evenPort proto.EvenPort if err = evenPort.GetFrom(m); err == nil { var randomPort int - randomPort, err = r.AllocationManager.GetRandomEvenPort() + randomPort, err = r.AllocationManager.GetRandomEvenPort(username) if err != nil { return buildAndSendErr(r.Conn, r.SrcAddr, err, insufficientCapacityMsg...) } @@ -131,7 +131,8 @@ func handleAllocateRequest(r Request, m *stun.Message) error { fiveTuple, r.Conn, requestedPort, - lifetimeDuration) + lifetimeDuration, + username) if err != nil { return buildAndSendErr(r.Conn, r.SrcAddr, err, insufficientCapacityMsg...) } @@ -185,7 +186,7 @@ func handleAllocateRequest(r Request, m *stun.Message) error { func handleRefreshRequest(r Request, m *stun.Message) error { r.Log.Debugf("Received RefreshRequest from %s", r.SrcAddr) - messageIntegrity, hasAuth, err := authenticateRequest(r, m, stun.MethodRefresh) + messageIntegrity, _, hasAuth, err := authenticateRequest(r, m, stun.MethodRefresh) if !hasAuth { return err } @@ -228,7 +229,7 @@ func handleCreatePermissionRequest(r Request, m *stun.Message) error { return fmt.Errorf("%w %v:%v", errNoAllocationFound, r.SrcAddr, r.Conn.LocalAddr()) } - messageIntegrity, hasAuth, err := authenticateRequest(r, m, stun.MethodCreatePermission) + messageIntegrity, _, hasAuth, err := authenticateRequest(r, m, stun.MethodCreatePermission) if !hasAuth { return err } @@ -317,7 +318,7 @@ func handleChannelBindRequest(r Request, m *stun.Message) error { badRequestMsg := buildMsg(m.TransactionID, stun.NewType(stun.MethodChannelBind, stun.ClassErrorResponse), &stun.ErrorCodeAttribute{Code: stun.CodeBadRequest}) - messageIntegrity, hasAuth, err := authenticateRequest(r, m, stun.MethodChannelBind) + messageIntegrity, _, hasAuth, err := authenticateRequest(r, m, stun.MethodChannelBind) if !hasAuth { return err } diff --git a/internal/server/turn_test.go b/internal/server/turn_test.go index e4a3b947..da181436 100644 --- a/internal/server/turn_test.go +++ b/internal/server/turn_test.go @@ -64,7 +64,7 @@ func TestAllocationLifeTime(t *testing.T) { logger := logging.NewDefaultLoggerFactory().NewLogger("turn") allocationManager, err := allocation.NewManager(allocation.ManagerConfig{ - AllocatePacketConn: func(network string, _ int) (net.PacketConn, net.Addr, error) { + AllocatePacketConn: func(network string, _ int, _ string) (net.PacketConn, net.Addr, error) { conn, listenErr := net.ListenPacket(network, "0.0.0.0:0") if err != nil { return nil, nil, listenErr @@ -72,7 +72,7 @@ func TestAllocationLifeTime(t *testing.T) { return conn, conn.LocalAddr(), nil }, - AllocateConn: func(string, int) (net.Conn, net.Addr, error) { + AllocateConn: func(string, int, string) (net.Conn, net.Addr, error) { return nil, nil, nil }, LeveledLogger: logger, @@ -97,7 +97,7 @@ func TestAllocationLifeTime(t *testing.T) { fiveTuple := &allocation.FiveTuple{SrcAddr: r.SrcAddr, DstAddr: r.Conn.LocalAddr(), Protocol: allocation.UDP} - _, err = r.AllocationManager.CreateAllocation(fiveTuple, r.Conn, 0, time.Hour) + _, err = r.AllocationManager.CreateAllocation(fiveTuple, r.Conn, 0, time.Hour, "") assert.NoError(t, err) assert.NotNil(t, r.AllocationManager.GetAllocation(fiveTuple)) diff --git a/internal/server/util.go b/internal/server/util.go index 7c01d329..9832e90b 100644 --- a/internal/server/util.go +++ b/internal/server/util.go @@ -42,14 +42,14 @@ func buildMsg(transactionID [stun.TransactionIDSize]byte, msgType stun.MessageTy return append([]stun.Setter{&stun.Message{TransactionID: transactionID}, msgType}, additional...) } -func authenticateRequest(r Request, m *stun.Message, callingMethod stun.Method) (stun.MessageIntegrity, bool, error) { - respondWithNonce := func(responseCode stun.ErrorCode) (stun.MessageIntegrity, bool, error) { +func authenticateRequest(r Request, m *stun.Message, callingMethod stun.Method) (stun.MessageIntegrity, string, bool, error) { + respondWithNonce := func(responseCode stun.ErrorCode) (stun.MessageIntegrity, string, bool, error) { nonce, err := r.NonceHash.Generate() if err != nil { - return nil, false, err + return nil, "", false, err } - return nil, false, buildAndSend(r.Conn, r.SrcAddr, buildMsg(m.TransactionID, + return nil, "", false, buildAndSend(r.Conn, r.SrcAddr, buildMsg(m.TransactionID, stun.NewType(callingMethod, stun.ClassErrorResponse), &stun.ErrorCodeAttribute{Code: responseCode}, stun.NewNonce(nonce), @@ -70,11 +70,11 @@ func authenticateRequest(r Request, m *stun.Message, callingMethod stun.Method) // Respond with 400 so clients don't retry if r.AuthHandler == nil { sendErr := buildAndSend(r.Conn, r.SrcAddr, badRequestMsg...) - return nil, false, sendErr + return nil, "", false, sendErr } if err := nonceAttr.GetFrom(m); err != nil { - return nil, false, buildAndSendErr(r.Conn, r.SrcAddr, err, badRequestMsg...) + return nil, "", false, buildAndSendErr(r.Conn, r.SrcAddr, err, badRequestMsg...) } // Assert Nonce is signed and is not expired @@ -83,21 +83,21 @@ func authenticateRequest(r Request, m *stun.Message, callingMethod stun.Method) } if err := realmAttr.GetFrom(m); err != nil { - return nil, false, buildAndSendErr(r.Conn, r.SrcAddr, err, badRequestMsg...) + return nil, "", false, buildAndSendErr(r.Conn, r.SrcAddr, err, badRequestMsg...) } else if err := usernameAttr.GetFrom(m); err != nil { - return nil, false, buildAndSendErr(r.Conn, r.SrcAddr, err, badRequestMsg...) + return nil, "", false, buildAndSendErr(r.Conn, r.SrcAddr, err, badRequestMsg...) } ourKey, ok := r.AuthHandler(usernameAttr.String(), realmAttr.String(), r.SrcAddr) if !ok { - return nil, false, buildAndSendErr(r.Conn, r.SrcAddr, fmt.Errorf("%w %s", errNoSuchUser, usernameAttr.String()), badRequestMsg...) + return nil, "", false, buildAndSendErr(r.Conn, r.SrcAddr, fmt.Errorf("%w %s", errNoSuchUser, usernameAttr.String()), badRequestMsg...) } if err := stun.MessageIntegrity(ourKey).Check(m); err != nil { - return nil, false, buildAndSendErr(r.Conn, r.SrcAddr, err, badRequestMsg...) + return nil, "", false, buildAndSendErr(r.Conn, r.SrcAddr, err, badRequestMsg...) } - return stun.MessageIntegrity(ourKey), true, nil + return stun.MessageIntegrity(ourKey), usernameAttr.String(), true, nil } func allocationLifeTime(m *stun.Message) time.Duration { diff --git a/relay_address_generator_none.go b/relay_address_generator_none.go index b0974010..bc7cdbb2 100644 --- a/relay_address_generator_none.go +++ b/relay_address_generator_none.go @@ -39,7 +39,7 @@ func (r *RelayAddressGeneratorNone) Validate() error { } // AllocatePacketConn generates a new PacketConn to receive traffic on and the IP/Port to populate the allocation response with -func (r *RelayAddressGeneratorNone) AllocatePacketConn(network string, requestedPort int) (net.PacketConn, net.Addr, error) { +func (r *RelayAddressGeneratorNone) AllocatePacketConn(network string, requestedPort int, _ string) (net.PacketConn, net.Addr, error) { conn, err := r.Net.ListenPacket(network, r.Address+":"+strconv.Itoa(requestedPort)) if err != nil { return nil, nil, err @@ -49,6 +49,6 @@ func (r *RelayAddressGeneratorNone) AllocatePacketConn(network string, requested } // AllocateConn generates a new Conn to receive traffic on and the IP/Port to populate the allocation response with -func (r *RelayAddressGeneratorNone) AllocateConn(string, int) (net.Conn, net.Addr, error) { +func (r *RelayAddressGeneratorNone) AllocateConn(string, int, string) (net.Conn, net.Addr, error) { return nil, nil, errTODO } diff --git a/relay_address_generator_range.go b/relay_address_generator_range.go index d87a57f9..c64d27b5 100644 --- a/relay_address_generator_range.go +++ b/relay_address_generator_range.go @@ -68,7 +68,7 @@ func (r *RelayAddressGeneratorPortRange) Validate() error { } // AllocatePacketConn generates a new PacketConn to receive traffic on and the IP/Port to populate the allocation response with -func (r *RelayAddressGeneratorPortRange) AllocatePacketConn(network string, requestedPort int) (net.PacketConn, net.Addr, error) { +func (r *RelayAddressGeneratorPortRange) AllocatePacketConn(network string, requestedPort int, _ string) (net.PacketConn, net.Addr, error) { if requestedPort != 0 { conn, err := r.Net.ListenPacket(network, fmt.Sprintf("%s:%d", r.Address, requestedPort)) if err != nil { @@ -103,6 +103,6 @@ func (r *RelayAddressGeneratorPortRange) AllocatePacketConn(network string, requ } // AllocateConn generates a new Conn to receive traffic on and the IP/Port to populate the allocation response with -func (r *RelayAddressGeneratorPortRange) AllocateConn(string, int) (net.Conn, net.Addr, error) { +func (r *RelayAddressGeneratorPortRange) AllocateConn(string, int, string) (net.Conn, net.Addr, error) { return nil, nil, errTODO } diff --git a/relay_address_generator_static.go b/relay_address_generator_static.go index 39c68777..07832268 100644 --- a/relay_address_generator_static.go +++ b/relay_address_generator_static.go @@ -45,7 +45,7 @@ func (r *RelayAddressGeneratorStatic) Validate() error { } // AllocatePacketConn generates a new PacketConn to receive traffic on and the IP/Port to populate the allocation response with -func (r *RelayAddressGeneratorStatic) AllocatePacketConn(network string, requestedPort int) (net.PacketConn, net.Addr, error) { +func (r *RelayAddressGeneratorStatic) AllocatePacketConn(network string, requestedPort int, _ string) (net.PacketConn, net.Addr, error) { conn, err := r.Net.ListenPacket(network, r.Address+":"+strconv.Itoa(requestedPort)) if err != nil { return nil, nil, err @@ -63,6 +63,6 @@ func (r *RelayAddressGeneratorStatic) AllocatePacketConn(network string, request } // AllocateConn generates a new Conn to receive traffic on and the IP/Port to populate the allocation response with -func (r *RelayAddressGeneratorStatic) AllocateConn(string, int) (net.Conn, net.Addr, error) { +func (r *RelayAddressGeneratorStatic) AllocateConn(string, int, string) (net.Conn, net.Addr, error) { return nil, nil, errTODO } diff --git a/server.go b/server.go index 3b58938f..47200883 100644 --- a/server.go +++ b/server.go @@ -171,11 +171,11 @@ type nilAddressGenerator struct{} func (n *nilAddressGenerator) Validate() error { return errRelayAddressGeneratorNil } -func (n *nilAddressGenerator) AllocatePacketConn(string, int) (net.PacketConn, net.Addr, error) { +func (n *nilAddressGenerator) AllocatePacketConn(string, int, string) (net.PacketConn, net.Addr, error) { return nil, nil, errRelayAddressGeneratorNil } -func (n *nilAddressGenerator) AllocateConn(string, int) (net.Conn, net.Addr, error) { +func (n *nilAddressGenerator) AllocateConn(string, int, string) (net.Conn, net.Addr, error) { return nil, nil, errRelayAddressGeneratorNil } diff --git a/server_config.go b/server_config.go index eab2988e..02a9edc6 100644 --- a/server_config.go +++ b/server_config.go @@ -20,10 +20,10 @@ type RelayAddressGenerator interface { Validate() error // Allocate a PacketConn (UDP) RelayAddress - AllocatePacketConn(network string, requestedPort int) (net.PacketConn, net.Addr, error) + AllocatePacketConn(network string, requestedPort int, username string) (net.PacketConn, net.Addr, error) // Allocate a Conn (TCP) RelayAddress - AllocateConn(network string, requestedPort int) (net.Conn, net.Addr, error) + AllocateConn(network string, requestedPort int, username string) (net.Conn, net.Addr, error) } // PermissionHandler is a callback to filter incoming CreatePermission and ChannelBindRequest