From 786ff057671963f99607edce7b86488c5774ecd3 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Wed, 16 Jan 2019 14:26:48 +0100 Subject: [PATCH] RTSP authentication support improvements --- src/input/input_rtsp.cpp | 28 +++++++++++++++++----------- src/input/input_rtsp.h | 3 ++- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/input/input_rtsp.cpp b/src/input/input_rtsp.cpp index cf66472c..11ec8bcb 100755 --- a/src/input/input_rtsp.cpp +++ b/src/input/input_rtsp.cpp @@ -20,6 +20,7 @@ namespace Mist{ void InputRTSP::incomingRTP(const uint64_t track, const RTP::Packet &p){sdpState.handleIncomingRTP(track, p);} InputRTSP::InputRTSP(Util::Config *cfg) : Input(cfg){ + needAuth = false; TCPmode = true; sdpState.myMeta = &myMeta; sdpState.incomingPacketCallback = incomingPacket; @@ -80,7 +81,8 @@ namespace Mist{ void InputRTSP::sendCommand(const std::string &cmd, const std::string &cUrl, const std::string &body, - const std::map *extraHeaders){ + const std::map *extraHeaders, + bool reAuth){ ++cSeq; sndH.Clean(); sndH.protocol = "RTSP/1.0"; @@ -100,6 +102,15 @@ namespace Mist{ } } sndH.SendRequest(tcpCon, "", true); + parsePacket(); + + if (reAuth && needAuth && authRequest.size() && (username.size() || password.size()) && tcpCon){ + INFO_MSG("Authenticating %s...", cmd.c_str()); + sendCommand(cmd, cUrl, body, extraHeaders, false); + if (needAuth){ + FAIL_MSG("Authentication failed! Are the provided credentials correct?"); + } + } } bool InputRTSP::checkArguments(){ @@ -129,17 +140,11 @@ namespace Mist{ } void InputRTSP::parseStreamHeader(){ + tcpCon.setBlocking(false); std::map extraHeaders; sendCommand("OPTIONS", url.getUrl(), ""); - parsePacket(); extraHeaders["Accept"] = "application/sdp"; sendCommand("DESCRIBE", url.getUrl(), "", &extraHeaders); - parsePacket(); - if (!seenSDP && authRequest.size() && (username.size() || password.size()) && tcpCon){ - INFO_MSG("Authenticating..."); - sendCommand("DESCRIBE", url.getUrl(), "", &extraHeaders); - parsePacket(); - } if (!tcpCon || !seenSDP){ FAIL_MSG("Could not get stream description!"); return; @@ -151,7 +156,6 @@ namespace Mist{ extraHeaders.clear(); extraHeaders["Transport"] = it->second.generateTransport(it->first, url.host, TCPmode); sendCommand("SETUP", url.link(it->second.control).getUrl(), "", &extraHeaders); - parsePacket(); if (!tcpCon || !transportSet){ FAIL_MSG("Could not setup track %s!", myMeta.tracks[it->first].getIdentifier().c_str()); tcpCon.close(); @@ -164,8 +168,9 @@ namespace Mist{ extraHeaders["Range"] = "npt=0.000-"; sendCommand("PLAY", url.getUrl(), "", &extraHeaders); if (!TCPmode){ - tcpCon.setBlocking(false); connectedAt = Util::epoch() + 2208988800ll; + }else{ + tcpCon.setBlocking(true); } } @@ -210,7 +215,8 @@ namespace Mist{ if (recH.hasHeader("WWW-Authenticate")){ authRequest = recH.GetHeader("WWW-Authenticate"); } - if (recH.url == "401"){ + needAuth = (recH.url == "401"); + if (needAuth){ INFO_MSG("Requires authentication"); recH.Clean(); return true; diff --git a/src/input/input_rtsp.h b/src/input/input_rtsp.h index be792ed2..b6832c78 100755 --- a/src/input/input_rtsp.h +++ b/src/input/input_rtsp.h @@ -27,7 +27,7 @@ namespace Mist{ void parseStreamHeader(); void seek(int seekTime){} void sendCommand(const std::string &cmd, const std::string &cUrl, const std::string &body, - const std::map *extraHeaders = 0); + const std::map *extraHeaders = 0, bool reAuth=true); bool parsePacket(); bool handleUDP(); std::string streamMainLoop(); @@ -40,6 +40,7 @@ namespace Mist{ bool seenSDP; bool transportSet; bool TCPmode; + bool needAuth; std::string session; long long connectedAt; ///< The timestamp the connection was made, as reference point for RTCP /// packets.