| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  *  Copyright 2012 The WebRTC Project Authors. All rights reserved. | 2  *  Copyright 2012 The WebRTC Project Authors. All rights reserved. | 
| 3  * | 3  * | 
| 4  *  Use of this source code is governed by a BSD-style license | 4  *  Use of this source code is governed by a BSD-style license | 
| 5  *  that can be found in the LICENSE file in the root of the source | 5  *  that can be found in the LICENSE file in the root of the source | 
| 6  *  tree. An additional intellectual property rights grant can be found | 6  *  tree. An additional intellectual property rights grant can be found | 
| 7  *  in the file PATENTS.  All contributing project authors may | 7  *  in the file PATENTS.  All contributing project authors may | 
| 8  *  be found in the AUTHORS file in the root of the source tree. | 8  *  be found in the AUTHORS file in the root of the source tree. | 
| 9  */ | 9  */ | 
| 10 | 10 | 
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 111   int resp_type = (req) ? GetStunErrorResponseType(req->type()) : -1; | 111   int resp_type = (req) ? GetStunErrorResponseType(req->type()) : -1; | 
| 112   if (resp_type == -1) | 112   if (resp_type == -1) | 
| 113     return false; | 113     return false; | 
| 114   resp->SetType(resp_type); | 114   resp->SetType(resp_type); | 
| 115   resp->SetTransactionID(req->transaction_id()); | 115   resp->SetTransactionID(req->transaction_id()); | 
| 116   resp->AddAttribute(new cricket::StunErrorCodeAttribute( | 116   resp->AddAttribute(new cricket::StunErrorCodeAttribute( | 
| 117       STUN_ATTR_ERROR_CODE, code, reason)); | 117       STUN_ATTR_ERROR_CODE, code, reason)); | 
| 118   return true; | 118   return true; | 
| 119 } | 119 } | 
| 120 | 120 | 
| 121 |  | 
| 122 TurnServer::TurnServer(rtc::Thread* thread) | 121 TurnServer::TurnServer(rtc::Thread* thread) | 
| 123     : thread_(thread), | 122     : thread_(thread), | 
| 124       nonce_key_(rtc::CreateRandomString(kNonceKeySize)), | 123       nonce_key_(rtc::CreateRandomString(kNonceKeySize)), | 
| 125       auth_hook_(NULL), | 124       auth_hook_(nullptr), | 
| 126       redirect_hook_(NULL), | 125       redirect_hook_(nullptr), | 
| 127       enable_otu_nonce_(false) { | 126       enable_otu_nonce_(false) {} | 
| 128 } |  | 
| 129 | 127 | 
| 130 TurnServer::~TurnServer() { | 128 TurnServer::~TurnServer() { | 
| 131   for (InternalSocketMap::iterator it = server_sockets_.begin(); | 129   for (InternalSocketMap::iterator it = server_sockets_.begin(); | 
| 132        it != server_sockets_.end(); ++it) { | 130        it != server_sockets_.end(); ++it) { | 
| 133     rtc::AsyncPacketSocket* socket = it->first; | 131     rtc::AsyncPacketSocket* socket = it->first; | 
| 134     delete socket; | 132     delete socket; | 
| 135   } | 133   } | 
| 136 | 134 | 
| 137   for (ServerSocketMap::iterator it = server_listen_sockets_.begin(); | 135   for (ServerSocketMap::iterator it = server_listen_sockets_.begin(); | 
| 138        it != server_listen_sockets_.end(); ++it) { | 136        it != server_listen_sockets_.end(); ++it) { | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 166 void TurnServer::OnNewInternalConnection(rtc::AsyncSocket* socket) { | 164 void TurnServer::OnNewInternalConnection(rtc::AsyncSocket* socket) { | 
| 167   RTC_DCHECK(server_listen_sockets_.find(socket) != | 165   RTC_DCHECK(server_listen_sockets_.find(socket) != | 
| 168              server_listen_sockets_.end()); | 166              server_listen_sockets_.end()); | 
| 169   AcceptConnection(socket); | 167   AcceptConnection(socket); | 
| 170 } | 168 } | 
| 171 | 169 | 
| 172 void TurnServer::AcceptConnection(rtc::AsyncSocket* server_socket) { | 170 void TurnServer::AcceptConnection(rtc::AsyncSocket* server_socket) { | 
| 173   // Check if someone is trying to connect to us. | 171   // Check if someone is trying to connect to us. | 
| 174   rtc::SocketAddress accept_addr; | 172   rtc::SocketAddress accept_addr; | 
| 175   rtc::AsyncSocket* accepted_socket = server_socket->Accept(&accept_addr); | 173   rtc::AsyncSocket* accepted_socket = server_socket->Accept(&accept_addr); | 
| 176   if (accepted_socket != NULL) { | 174   if (accepted_socket != nullptr) { | 
| 177     ProtocolType proto = server_listen_sockets_[server_socket]; | 175     ProtocolType proto = server_listen_sockets_[server_socket]; | 
| 178     cricket::AsyncStunTCPSocket* tcp_socket = | 176     cricket::AsyncStunTCPSocket* tcp_socket = | 
| 179         new cricket::AsyncStunTCPSocket(accepted_socket, false); | 177         new cricket::AsyncStunTCPSocket(accepted_socket, false); | 
| 180 | 178 | 
| 181     tcp_socket->SignalClose.connect(this, &TurnServer::OnInternalSocketClose); | 179     tcp_socket->SignalClose.connect(this, &TurnServer::OnInternalSocketClose); | 
| 182     // Finally add the socket so it can start communicating with the client. | 180     // Finally add the socket so it can start communicating with the client. | 
| 183     AddInternalSocket(tcp_socket, proto); | 181     AddInternalSocket(tcp_socket, proto); | 
| 184   } | 182   } | 
| 185 } | 183 } | 
| 186 | 184 | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 221     LOG(LS_WARNING) << "Received invalid STUN message"; | 219     LOG(LS_WARNING) << "Received invalid STUN message"; | 
| 222     return; | 220     return; | 
| 223   } | 221   } | 
| 224 | 222 | 
| 225   // If it's a STUN binding request, handle that specially. | 223   // If it's a STUN binding request, handle that specially. | 
| 226   if (msg.type() == STUN_BINDING_REQUEST) { | 224   if (msg.type() == STUN_BINDING_REQUEST) { | 
| 227     HandleBindingRequest(conn, &msg); | 225     HandleBindingRequest(conn, &msg); | 
| 228     return; | 226     return; | 
| 229   } | 227   } | 
| 230 | 228 | 
| 231   if (redirect_hook_ != NULL && msg.type() == STUN_ALLOCATE_REQUEST) { | 229   if (redirect_hook_ != nullptr && msg.type() == STUN_ALLOCATE_REQUEST) { | 
| 232     rtc::SocketAddress address; | 230     rtc::SocketAddress address; | 
| 233     if (redirect_hook_->ShouldRedirect(conn->src(), &address)) { | 231     if (redirect_hook_->ShouldRedirect(conn->src(), &address)) { | 
| 234       SendErrorResponseWithAlternateServer( | 232       SendErrorResponseWithAlternateServer( | 
| 235           conn, &msg, address); | 233           conn, &msg, address); | 
| 236       return; | 234       return; | 
| 237     } | 235     } | 
| 238   } | 236   } | 
| 239 | 237 | 
| 240   // Look up the key that we'll use to validate the M-I. If we have an | 238   // Look up the key that we'll use to validate the M-I. If we have an | 
| 241   // existing allocation, the key will already be cached. | 239   // existing allocation, the key will already be cached. | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 277 } | 275 } | 
| 278 | 276 | 
| 279 bool TurnServer::GetKey(const StunMessage* msg, std::string* key) { | 277 bool TurnServer::GetKey(const StunMessage* msg, std::string* key) { | 
| 280   const StunByteStringAttribute* username_attr = | 278   const StunByteStringAttribute* username_attr = | 
| 281       msg->GetByteString(STUN_ATTR_USERNAME); | 279       msg->GetByteString(STUN_ATTR_USERNAME); | 
| 282   if (!username_attr) { | 280   if (!username_attr) { | 
| 283     return false; | 281     return false; | 
| 284   } | 282   } | 
| 285 | 283 | 
| 286   std::string username = username_attr->GetString(); | 284   std::string username = username_attr->GetString(); | 
| 287   return (auth_hook_ != NULL && auth_hook_->GetKey(username, realm_, key)); | 285   return (auth_hook_ != nullptr && auth_hook_->GetKey(username, realm_, key)); | 
| 288 } | 286 } | 
| 289 | 287 | 
| 290 bool TurnServer::CheckAuthorization(TurnServerConnection* conn, | 288 bool TurnServer::CheckAuthorization(TurnServerConnection* conn, | 
| 291                                     const StunMessage* msg, | 289                                     const StunMessage* msg, | 
| 292                                     const char* data, size_t size, | 290                                     const char* data, size_t size, | 
| 293                                     const std::string& key) { | 291                                     const std::string& key) { | 
| 294   // RFC 5389, 10.2.2. | 292   // RFC 5389, 10.2.2. | 
| 295   RTC_DCHECK(IsStunRequestType(msg->type())); | 293   RTC_DCHECK(IsStunRequestType(msg->type())); | 
| 296   const StunByteStringAttribute* mi_attr = | 294   const StunByteStringAttribute* mi_attr = | 
| 297       msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY); | 295       msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY); | 
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 428 } | 426 } | 
| 429 | 427 | 
| 430 TurnServerAllocation* TurnServer::FindAllocation(TurnServerConnection* conn) { | 428 TurnServerAllocation* TurnServer::FindAllocation(TurnServerConnection* conn) { | 
| 431   AllocationMap::const_iterator it = allocations_.find(*conn); | 429   AllocationMap::const_iterator it = allocations_.find(*conn); | 
| 432   return (it != allocations_.end()) ? it->second.get() : nullptr; | 430   return (it != allocations_.end()) ? it->second.get() : nullptr; | 
| 433 } | 431 } | 
| 434 | 432 | 
| 435 TurnServerAllocation* TurnServer::CreateAllocation(TurnServerConnection* conn, | 433 TurnServerAllocation* TurnServer::CreateAllocation(TurnServerConnection* conn, | 
| 436                                                    int proto, | 434                                                    int proto, | 
| 437                                                    const std::string& key) { | 435                                                    const std::string& key) { | 
| 438   rtc::AsyncPacketSocket* external_socket = (external_socket_factory_) ? | 436   rtc::AsyncPacketSocket* external_socket = | 
| 439       external_socket_factory_->CreateUdpSocket(external_addr_, 0, 0) : NULL; | 437       (external_socket_factory_) | 
|  | 438           ? external_socket_factory_->CreateUdpSocket(external_addr_, 0, 0) | 
|  | 439           : nullptr; | 
| 440   if (!external_socket) { | 440   if (!external_socket) { | 
| 441     return NULL; | 441     return nullptr; | 
| 442   } | 442   } | 
| 443 | 443 | 
| 444   // The Allocation takes ownership of the socket. | 444   // The Allocation takes ownership of the socket. | 
| 445   TurnServerAllocation* allocation = new TurnServerAllocation(this, | 445   TurnServerAllocation* allocation = new TurnServerAllocation(this, | 
| 446       thread_, *conn, external_socket, key); | 446       thread_, *conn, external_socket, key); | 
| 447   allocation->SignalDestroyed.connect(this, &TurnServer::OnAllocationDestroyed); | 447   allocation->SignalDestroyed.connect(this, &TurnServer::OnAllocationDestroyed); | 
| 448   allocations_[*conn].reset(allocation); | 448   allocations_[*conn].reset(allocation); | 
| 449   return allocation; | 449   return allocation; | 
| 450 } | 450 } | 
| 451 | 451 | 
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 596   LOG_J(LS_INFO, this) << "Allocation destroyed"; | 596   LOG_J(LS_INFO, this) << "Allocation destroyed"; | 
| 597 } | 597 } | 
| 598 | 598 | 
| 599 std::string TurnServerAllocation::ToString() const { | 599 std::string TurnServerAllocation::ToString() const { | 
| 600   std::ostringstream ost; | 600   std::ostringstream ost; | 
| 601   ost << "Alloc[" << conn_.ToString() << "]"; | 601   ost << "Alloc[" << conn_.ToString() << "]"; | 
| 602   return ost.str(); | 602   return ost.str(); | 
| 603 } | 603 } | 
| 604 | 604 | 
| 605 void TurnServerAllocation::HandleTurnMessage(const TurnMessage* msg) { | 605 void TurnServerAllocation::HandleTurnMessage(const TurnMessage* msg) { | 
| 606   RTC_DCHECK(msg != NULL); | 606   RTC_DCHECK(msg != nullptr); | 
| 607   switch (msg->type()) { | 607   switch (msg->type()) { | 
| 608     case STUN_ALLOCATE_REQUEST: | 608     case STUN_ALLOCATE_REQUEST: | 
| 609       HandleAllocateRequest(msg); | 609       HandleAllocateRequest(msg); | 
| 610       break; | 610       break; | 
| 611     case TURN_REFRESH_REQUEST: | 611     case TURN_REFRESH_REQUEST: | 
| 612       HandleRefreshRequest(msg); | 612       HandleRefreshRequest(msg); | 
| 613       break; | 613       break; | 
| 614     case TURN_SEND_INDICATION: | 614     case TURN_SEND_INDICATION: | 
| 615       HandleSendIndication(msg); | 615       HandleSendIndication(msg); | 
| 616       break; | 616       break; | 
| 617     case TURN_CREATE_PERMISSION_REQUEST: | 617     case TURN_CREATE_PERMISSION_REQUEST: | 
| 618       HandleCreatePermissionRequest(msg); | 618       HandleCreatePermissionRequest(msg); | 
| 619       break; | 619       break; | 
| 620     case TURN_CHANNEL_BIND_REQUEST: | 620     case TURN_CHANNEL_BIND_REQUEST: | 
| 621       HandleChannelBindRequest(msg); | 621       HandleChannelBindRequest(msg); | 
| 622       break; | 622       break; | 
| 623     default: | 623     default: | 
| 624       // Not sure what to do with this, just eat it. | 624       // Not sure what to do with this, just eat it. | 
| 625       LOG_J(LS_WARNING, this) << "Invalid TURN message type received: " | 625       LOG_J(LS_WARNING, this) << "Invalid TURN message type received: " | 
| 626                               << msg->type(); | 626                               << msg->type(); | 
| 627   } | 627   } | 
| 628 } | 628 } | 
| 629 | 629 | 
| 630 void TurnServerAllocation::HandleAllocateRequest(const TurnMessage* msg) { | 630 void TurnServerAllocation::HandleAllocateRequest(const TurnMessage* msg) { | 
| 631   // Copy the important info from the allocate request. | 631   // Copy the important info from the allocate request. | 
| 632   transaction_id_ = msg->transaction_id(); | 632   transaction_id_ = msg->transaction_id(); | 
| 633   const StunByteStringAttribute* username_attr = | 633   const StunByteStringAttribute* username_attr = | 
| 634       msg->GetByteString(STUN_ATTR_USERNAME); | 634       msg->GetByteString(STUN_ATTR_USERNAME); | 
| 635   RTC_DCHECK(username_attr != NULL); | 635   RTC_DCHECK(username_attr != nullptr); | 
| 636   username_ = username_attr->GetString(); | 636   username_ = username_attr->GetString(); | 
| 637   const StunByteStringAttribute* origin_attr = | 637   const StunByteStringAttribute* origin_attr = | 
| 638       msg->GetByteString(STUN_ATTR_ORIGIN); | 638       msg->GetByteString(STUN_ATTR_ORIGIN); | 
| 639   if (origin_attr) { | 639   if (origin_attr) { | 
| 640     origin_ = origin_attr->GetString(); | 640     origin_ = origin_attr->GetString(); | 
| 641   } | 641   } | 
| 642 | 642 | 
| 643   // Figure out the lifetime and start the allocation timer. | 643   // Figure out the lifetime and start the allocation timer. | 
| 644   int lifetime_secs = ComputeLifetime(msg); | 644   int lifetime_secs = ComputeLifetime(msg); | 
| 645   thread_->PostDelayed(RTC_FROM_HERE, lifetime_secs * 1000, this, | 645   thread_->PostDelayed(RTC_FROM_HERE, lifetime_secs * 1000, this, | 
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 834   // Return the smaller of our default lifetime and the requested lifetime. | 834   // Return the smaller of our default lifetime and the requested lifetime. | 
| 835   int lifetime = kDefaultAllocationTimeout / 1000;  // convert to seconds | 835   int lifetime = kDefaultAllocationTimeout / 1000;  // convert to seconds | 
| 836   const StunUInt32Attribute* lifetime_attr = msg->GetUInt32(STUN_ATTR_LIFETIME); | 836   const StunUInt32Attribute* lifetime_attr = msg->GetUInt32(STUN_ATTR_LIFETIME); | 
| 837   if (lifetime_attr && static_cast<int>(lifetime_attr->value()) < lifetime) { | 837   if (lifetime_attr && static_cast<int>(lifetime_attr->value()) < lifetime) { | 
| 838     lifetime = static_cast<int>(lifetime_attr->value()); | 838     lifetime = static_cast<int>(lifetime_attr->value()); | 
| 839   } | 839   } | 
| 840   return lifetime; | 840   return lifetime; | 
| 841 } | 841 } | 
| 842 | 842 | 
| 843 bool TurnServerAllocation::HasPermission(const rtc::IPAddress& addr) { | 843 bool TurnServerAllocation::HasPermission(const rtc::IPAddress& addr) { | 
| 844   return (FindPermission(addr) != NULL); | 844   return (FindPermission(addr) != nullptr); | 
| 845 } | 845 } | 
| 846 | 846 | 
| 847 void TurnServerAllocation::AddPermission(const rtc::IPAddress& addr) { | 847 void TurnServerAllocation::AddPermission(const rtc::IPAddress& addr) { | 
| 848   Permission* perm = FindPermission(addr); | 848   Permission* perm = FindPermission(addr); | 
| 849   if (!perm) { | 849   if (!perm) { | 
| 850     perm = new Permission(thread_, addr); | 850     perm = new Permission(thread_, addr); | 
| 851     perm->SignalDestroyed.connect( | 851     perm->SignalDestroyed.connect( | 
| 852         this, &TurnServerAllocation::OnPermissionDestroyed); | 852         this, &TurnServerAllocation::OnPermissionDestroyed); | 
| 853     perms_.push_back(perm); | 853     perms_.push_back(perm); | 
| 854   } else { | 854   } else { | 
| 855     perm->Refresh(); | 855     perm->Refresh(); | 
| 856   } | 856   } | 
| 857 } | 857 } | 
| 858 | 858 | 
| 859 TurnServerAllocation::Permission* TurnServerAllocation::FindPermission( | 859 TurnServerAllocation::Permission* TurnServerAllocation::FindPermission( | 
| 860     const rtc::IPAddress& addr) const { | 860     const rtc::IPAddress& addr) const { | 
| 861   for (PermissionList::const_iterator it = perms_.begin(); | 861   for (PermissionList::const_iterator it = perms_.begin(); | 
| 862        it != perms_.end(); ++it) { | 862        it != perms_.end(); ++it) { | 
| 863     if ((*it)->peer() == addr) | 863     if ((*it)->peer() == addr) | 
| 864       return *it; | 864       return *it; | 
| 865   } | 865   } | 
| 866   return NULL; | 866   return nullptr; | 
| 867 } | 867 } | 
| 868 | 868 | 
| 869 TurnServerAllocation::Channel* TurnServerAllocation::FindChannel( | 869 TurnServerAllocation::Channel* TurnServerAllocation::FindChannel( | 
| 870     int channel_id) const { | 870     int channel_id) const { | 
| 871   for (ChannelList::const_iterator it = channels_.begin(); | 871   for (ChannelList::const_iterator it = channels_.begin(); | 
| 872        it != channels_.end(); ++it) { | 872        it != channels_.end(); ++it) { | 
| 873     if ((*it)->id() == channel_id) | 873     if ((*it)->id() == channel_id) | 
| 874       return *it; | 874       return *it; | 
| 875   } | 875   } | 
| 876   return NULL; | 876   return nullptr; | 
| 877 } | 877 } | 
| 878 | 878 | 
| 879 TurnServerAllocation::Channel* TurnServerAllocation::FindChannel( | 879 TurnServerAllocation::Channel* TurnServerAllocation::FindChannel( | 
| 880     const rtc::SocketAddress& addr) const { | 880     const rtc::SocketAddress& addr) const { | 
| 881   for (ChannelList::const_iterator it = channels_.begin(); | 881   for (ChannelList::const_iterator it = channels_.begin(); | 
| 882        it != channels_.end(); ++it) { | 882        it != channels_.end(); ++it) { | 
| 883     if ((*it)->peer() == addr) | 883     if ((*it)->peer() == addr) | 
| 884       return *it; | 884       return *it; | 
| 885   } | 885   } | 
| 886   return NULL; | 886   return nullptr; | 
| 887 } | 887 } | 
| 888 | 888 | 
| 889 void TurnServerAllocation::SendResponse(TurnMessage* msg) { | 889 void TurnServerAllocation::SendResponse(TurnMessage* msg) { | 
| 890   // Success responses always have M-I. | 890   // Success responses always have M-I. | 
| 891   msg->AddMessageIntegrity(key_); | 891   msg->AddMessageIntegrity(key_); | 
| 892   server_->SendStun(&conn_, msg); | 892   server_->SendStun(&conn_, msg); | 
| 893 } | 893 } | 
| 894 | 894 | 
| 895 void TurnServerAllocation::SendBadRequestResponse(const TurnMessage* req) { | 895 void TurnServerAllocation::SendBadRequestResponse(const TurnMessage* req) { | 
| 896   SendErrorResponse(req, STUN_ERROR_BAD_REQUEST, STUN_ERROR_REASON_BAD_REQUEST); | 896   SendErrorResponse(req, STUN_ERROR_BAD_REQUEST, STUN_ERROR_REASON_BAD_REQUEST); | 
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 964                        MSG_ALLOCATION_TIMEOUT); | 964                        MSG_ALLOCATION_TIMEOUT); | 
| 965 } | 965 } | 
| 966 | 966 | 
| 967 void TurnServerAllocation::Channel::OnMessage(rtc::Message* msg) { | 967 void TurnServerAllocation::Channel::OnMessage(rtc::Message* msg) { | 
| 968   RTC_DCHECK(msg->message_id == MSG_ALLOCATION_TIMEOUT); | 968   RTC_DCHECK(msg->message_id == MSG_ALLOCATION_TIMEOUT); | 
| 969   SignalDestroyed(this); | 969   SignalDestroyed(this); | 
| 970   delete this; | 970   delete this; | 
| 971 } | 971 } | 
| 972 | 972 | 
| 973 }  // namespace cricket | 973 }  // namespace cricket | 
| OLD | NEW | 
|---|