diff options
| author | Oz Linden <oz@lindenlab.com> | 2016-03-22 06:29:02 -0400 | 
|---|---|---|
| committer | Oz Linden <oz@lindenlab.com> | 2016-03-22 06:29:02 -0400 | 
| commit | 12c93702a71a76997eeaca3ef2f1a76d9446b8c6 (patch) | |
| tree | 8a29efc4569d8b60deff5c3af7843fa423144330 | |
| parent | fdba6253fb8f27632664d28630bfee05b291823b (diff) | |
VOICE-36: generate and expect random connection and account handles
| -rwxr-xr-x | indra/newview/llvoicevivox.cpp | 121 | ||||
| -rwxr-xr-x | indra/newview/llvoicevivox.h | 22 | 
2 files changed, 101 insertions, 42 deletions
| diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 660ca9e5b7..60f9122056 100755 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -183,6 +183,7 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :  	mNextAudioSession(),  	mCurrentParcelLocalID(0), +    mConnectorEstablished(false),  	mNumberOfAliases(0),  	mCommandCookie(0),  	mLoginRetryCount(0), @@ -400,6 +401,7 @@ void LLVivoxVoiceClient::connectorCreate()  		<< "<ClientName>V2 SDK</ClientName>"  		<< "<AccountManagementServer>" << mVoiceAccountServerURI << "</AccountManagementServer>"  		<< "<Mode>Normal</Mode>" +        << "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>"  		<< "<Logging>"  		<< "<Folder>" << logpath << "</Folder>"  		<< "<FileNamePrefix>Connector</FileNamePrefix>" @@ -416,17 +418,17 @@ void LLVivoxVoiceClient::connectorCreate()  void LLVivoxVoiceClient::connectorShutdown()  { -	if(!mConnectorHandle.empty()) +	if(!mConnectorEstablished)  	{  		std::ostringstream stream;  		stream  		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.InitiateShutdown.1\">" -			<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" +			<< "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>"  		<< "</Request>"  		<< "\n\n\n";  		mShutdownComplete = false; -		mConnectorHandle.clear(); +		mConnectorEstablished = false;  		writeString(stream.str());  	} @@ -451,7 +453,7 @@ void LLVivoxVoiceClient::setLoginInfo(  	mVoiceSIPURIHostName = voice_sip_uri_hostname;  	mVoiceAccountServerURI = voice_account_server_uri; -	if(!mAccountHandle.empty()) +	if(mAccountLoggedIn)  	{  		// Already logged in.  		LL_WARNS("Voice") << "Called while already logged in." << LL_ENDL; @@ -650,6 +652,15 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()                  params.args.add(shutdown_timeout);              }              params.cwd = gDirUtilp->getAppRODataDir(); + +#           ifdef VIVOX_HANDLE_ARGS +            params.args.add("-ah"); +            params.args.add(LLVivoxSecurity::getInstance()->accountHandle()); + +            params.args.add("-ch"); +            params.args.add(LLVivoxSecurity::getInstance()->connectorHandle()); +#           endif // VIVOX_HANDLE_ARGS +              sGatewayPtr = LLProcess::create(params);              mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost").c_str(), gSavedSettings.getU32("VivoxVoicePort")); @@ -1722,7 +1733,7 @@ bool LLVivoxVoiceClient::performMicTuning()          std::ostringstream stream;          stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" -            << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" +            << "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>"              << "<Value>false</Value>"              << "</Request>\n\n\n"; @@ -1793,8 +1804,8 @@ void LLVivoxVoiceClient::closeSocket(void)  {  	mSocket.reset();  	mConnected = false; -	mConnectorHandle.clear(); -	mAccountHandle.clear(); +	mConnectorEstablished = false; +	mAccountLoggedIn = false;  }  void LLVivoxVoiceClient::loginSendMessage() @@ -1805,9 +1816,10 @@ void LLVivoxVoiceClient::loginSendMessage()  	stream  	<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.Login.1\">" -		<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" +		<< "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>"  		<< "<AccountName>" << mAccountName << "</AccountName>" -		<< "<AccountPassword>" << mAccountPassword << "</AccountPassword>" +        << "<AccountPassword>" << mAccountPassword << "</AccountPassword>" +        << "<AccountHandle>" << LLVivoxSecurity::getInstance()->accountHandle() << "</AccountHandle>"  		<< "<AudioSessionAnswerMode>VerifyAnswer</AudioSessionAnswerMode>"  		<< "<EnableBuddiesAndPresence>false</EnableBuddiesAndPresence>"  		<< "<EnablePresencePersistence>0</EnablePresencePersistence>" @@ -1830,16 +1842,16 @@ void LLVivoxVoiceClient::logout()  void LLVivoxVoiceClient::logoutSendMessage()  { -	if(!mAccountHandle.empty()) +	if(mAccountLoggedIn)  	{  		std::ostringstream stream;  		stream  		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.Logout.1\">" -			<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" +			<< "<AccountHandle>" << LLVivoxSecurity::getInstance()->accountHandle() << "</AccountHandle>"  		<< "</Request>"  		<< "\n\n\n"; -		mAccountHandle.clear(); +		mAccountLoggedIn = false;  		writeString(stream.str());  	} @@ -1847,7 +1859,7 @@ void LLVivoxVoiceClient::logoutSendMessage()  void LLVivoxVoiceClient::sessionGroupCreateSendMessage()  { -	if(!mAccountHandle.empty()) +	if(mAccountLoggedIn)  	{		  		std::ostringstream stream; @@ -1855,7 +1867,7 @@ void LLVivoxVoiceClient::sessionGroupCreateSendMessage()  		stream  		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.Create.1\">" -			<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" +			<< "<AccountHandle>" << LLVivoxSecurity::getInstance()->accountHandle() << "</AccountHandle>"  			<< "<Type>Normal</Type>"  		<< "</Request>"  		<< "\n\n\n"; @@ -1880,7 +1892,7 @@ void LLVivoxVoiceClient::sessionCreateSendMessage(const sessionStatePtr_t &sessi  	std::ostringstream stream;  	stream  	<< "<Request requestId=\"" << session->mSIPURI << "\" action=\"Session.Create.1\">" -		<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" +		<< "<AccountHandle>" << LLVivoxSecurity::getInstance()->accountHandle() << "</AccountHandle>"  		<< "<URI>" << session->mSIPURI << "</URI>";  	static const std::string allowed_chars = @@ -2736,7 +2748,7 @@ void LLVivoxVoiceClient::sendLocalAudioUpdates()  		LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mMuteMic ? "true" : "false") << LL_ENDL;  		stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" -			<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" +			<< "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>"  			<< "<Value>" << (mMuteMic ? "true" : "false") << "</Value>"  			<< "</Request>\n\n\n"; @@ -2751,7 +2763,7 @@ void LLVivoxVoiceClient::sendLocalAudioUpdates()  		LL_INFOS("Voice") << "Setting speaker mute to " << muteval << LL_ENDL;  		stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalSpeaker.1\">" -			<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" +			<< "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>"  			<< "<Value>" << muteval << "</Value>"  			<< "</Request>\n\n\n"; @@ -2764,7 +2776,7 @@ void LLVivoxVoiceClient::sendLocalAudioUpdates()  		LL_INFOS("Voice") << "Setting speaker volume to " << mSpeakerVolume << LL_ENDL;  		stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.SetLocalSpeakerVolume.1\">" -			<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" +			<< "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>"  			<< "<Value>" << mSpeakerVolume << "</Value>"  			<< "</Request>\n\n\n"; @@ -2777,7 +2789,7 @@ void LLVivoxVoiceClient::sendLocalAudioUpdates()  		LL_INFOS("Voice") << "Setting mic volume to " << mMicVolume << LL_ENDL;  		stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.SetLocalMicVolume.1\">" -			<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" +			<< "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>"  			<< "<Value>" << mMicVolume << "</Value>"  			<< "</Request>\n\n\n";  	} @@ -2818,12 +2830,23 @@ void LLVivoxVoiceClient::connectorCreateResponse(int statusCode, std::string &st  	else  	{  		// Connector created, move forward. -		LL_INFOS("Voice") << "Connector.Create succeeded, Vivox SDK version is " << versionID << LL_ENDL; -		mVoiceVersion.serverVersion = versionID; -		mConnectorHandle = connectorHandle; -		mTerminateDaemon = false; +        if (connectorHandle == LLVivoxSecurity::getInstance()->connectorHandle()) +        { +            LL_INFOS("Voice") << "Connector.Create succeeded, Vivox SDK version is " << versionID << " connector handle " << connectorHandle << LL_ENDL; +            mVoiceVersion.serverVersion = versionID; +            mConnectorEstablished = true; +            mTerminateDaemon = false; -        result["connector"] = LLSD::Boolean(true); +            result["connector"] = LLSD::Boolean(true); +        } +        else +        { +            LL_WARNS("Voice") << "Connector.Create returned wrong handle " +                              << "(" << connectorHandle << ")" +                              << " expected (" << LLVivoxSecurity::getInstance()->connectorHandle() << ")" +                              << LL_ENDL; +            result["connector"] = LLSD::Boolean(false); +        }  	}      LLEventPumps::instance().post("vivoxClientPump", result); @@ -2851,7 +2874,7 @@ void LLVivoxVoiceClient::loginResponse(int statusCode, std::string &statusString  	else  	{  		// Login succeeded, move forward. -		mAccountHandle = accountHandle; +		mAccountLoggedIn = true;  		mNumberOfAliases = numberOfAliases;          result["login"] = LLSD::String("response_ok");  	} @@ -6070,7 +6093,7 @@ S32 LLVivoxVoiceClient::getVoiceFontTemplateIndex(const LLUUID& id) const  void LLVivoxVoiceClient::accountGetSessionFontsSendMessage()  { -	if(!mAccountHandle.empty()) +	if(mAccountLoggedIn)  	{  		std::ostringstream stream; @@ -6078,7 +6101,7 @@ void LLVivoxVoiceClient::accountGetSessionFontsSendMessage()  		stream  		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.GetSessionFonts.1\">" -		<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" +		<< "<AccountHandle>" << LLVivoxSecurity::getInstance()->accountHandle() << "</AccountHandle>"  		<< "</Request>"  		<< "\n\n\n"; @@ -6088,7 +6111,7 @@ void LLVivoxVoiceClient::accountGetSessionFontsSendMessage()  void LLVivoxVoiceClient::accountGetTemplateFontsSendMessage()  { -	if(!mAccountHandle.empty()) +	if(mAccountLoggedIn)  	{  		std::ostringstream stream; @@ -6096,7 +6119,7 @@ void LLVivoxVoiceClient::accountGetTemplateFontsSendMessage()  		stream  		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.GetTemplateFonts.1\">" -		<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" +		<< "<AccountHandle>" << LLVivoxSecurity::getInstance()->accountHandle() << "</AccountHandle>"  		<< "</Request>"  		<< "\n\n\n"; @@ -6351,7 +6374,7 @@ bool LLVivoxVoiceClient::isPreviewPlaying()  }  void LLVivoxVoiceClient::captureBufferRecordStartSendMessage() -{	if(!mAccountHandle.empty()) +{	if(mAccountLoggedIn)  	{  		std::ostringstream stream; @@ -6365,7 +6388,7 @@ void LLVivoxVoiceClient::captureBufferRecordStartSendMessage()  		// Unmute the mic  		stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" -			<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" +			<< "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>"  			<< "<Value>false</Value>"  		<< "</Request>\n\n\n"; @@ -6378,7 +6401,7 @@ void LLVivoxVoiceClient::captureBufferRecordStartSendMessage()  void LLVivoxVoiceClient::captureBufferRecordStopSendMessage()  { -	if(!mAccountHandle.empty()) +	if(mAccountLoggedIn)  	{  		std::ostringstream stream; @@ -6386,14 +6409,14 @@ void LLVivoxVoiceClient::captureBufferRecordStopSendMessage()  		// Mute the mic. Mic mute state was dirtied at recording start, so will be reset when finished previewing.  		stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" -			<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" +			<< "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>"  			<< "<Value>true</Value>"  		<< "</Request>\n\n\n";  		// Stop capture  		stream  		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.CaptureAudioStop.1\">" -			<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" +			<< "<AccountHandle>" << LLVivoxSecurity::getInstance()->accountHandle() << "</AccountHandle>"  		<< "</Request>"  		<< "\n\n\n"; @@ -6403,7 +6426,7 @@ void LLVivoxVoiceClient::captureBufferRecordStopSendMessage()  void LLVivoxVoiceClient::captureBufferPlayStartSendMessage(const LLUUID& voice_font_id)  { -	if(!mAccountHandle.empty()) +	if(mAccountLoggedIn)  	{  		// Track how may play requests are sent, so we know how many stop events to  		// expect before play actually stops. @@ -6418,7 +6441,7 @@ void LLVivoxVoiceClient::captureBufferPlayStartSendMessage(const LLUUID& voice_f  		stream  		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.PlayAudioBuffer.1\">" -			<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" +			<< "<AccountHandle>" << LLVivoxSecurity::getInstance()->accountHandle() << "</AccountHandle>"  			<< "<TemplateFontID>" << font_index << "</TemplateFontID>"  			<< "<FontDelta />"  		<< "</Request>" @@ -6430,7 +6453,7 @@ void LLVivoxVoiceClient::captureBufferPlayStartSendMessage(const LLUUID& voice_f  void LLVivoxVoiceClient::captureBufferPlayStopSendMessage()  { -	if(!mAccountHandle.empty()) +	if(mAccountLoggedIn)  	{  		std::ostringstream stream; @@ -6438,7 +6461,7 @@ void LLVivoxVoiceClient::captureBufferPlayStopSendMessage()  		stream  		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.RenderAudioStop.1\">" -			<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" +			<< "<AccountHandle>" << LLVivoxSecurity::getInstance()->accountHandle() << "</AccountHandle>"  		<< "</Request>"  		<< "\n\n\n"; @@ -7188,3 +7211,25 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  	}  } +LLVivoxSecurity::LLVivoxSecurity() +{ +    // this size is an arbitrary choice; Vivox does not care +    #define VIVOX_TOKEN_BYTES 8 +    U8  random_value[VIVOX_TOKEN_BYTES]; + +    for (int b = 0; b < VIVOX_TOKEN_BYTES; b++) +    { +        random_value[b] = random() & 0xff; +    } +    mConnectorHandle = LLBase64::encode(random_value, VIVOX_TOKEN_BYTES); +     +    for (int b = 0; b < VIVOX_TOKEN_BYTES; b++) +    { +        random_value[b] = random() & 0xff; +    } +    mAccountHandle = LLBase64::encode(random_value, VIVOX_TOKEN_BYTES); +} + +LLVivoxSecurity::~LLVivoxSecurity() +{ +} diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index c75e1bf39b..f32c7c975f 100755 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -697,10 +697,10 @@ private:  	S32 mCurrentParcelLocalID;			// Used to detect parcel boundary crossings  	std::string mCurrentRegionName;		// Used to detect parcel boundary crossings -	std::string mConnectorHandle;	// returned by "Create Connector" message -	std::string mAccountHandle;		// returned by login message		 -	int 		mNumberOfAliases; -	U32 mCommandCookie; +    bool mConnectorEstablished; // set by "Create Connector" response +    bool mAccountLoggedIn;		// set by login message		 +	int  mNumberOfAliases; +	U32  mCommandCookie;  	std::string mVoiceAccountServerURI;  	std::string mVoiceSIPURIHostName; @@ -913,6 +913,7 @@ private:      LLEventMailDrop mVivoxPump;  }; +  /**    * @class LLVivoxProtocolParser   * @brief This class helps construct new LLIOPipe specializations @@ -1024,6 +1025,19 @@ protected:  }; +class LLVivoxSecurity :	public LLSingleton<LLVivoxSecurity> +{ +  public: +	LLVivoxSecurity();	 +	virtual ~LLVivoxSecurity(); + +    std::string     connectorHandle() { return mConnectorHandle; }; +    std::string     accountHandle()    { return mAccountHandle;    }; + +  private: +    std::string     mConnectorHandle; +    std::string     mAccountHandle; +};  #endif //LL_VIVOX_VOICE_CLIENT_H | 
