diff options
| author | Oz Linden <oz@lindenlab.com> | 2011-08-25 09:27:34 -0400 | 
|---|---|---|
| committer | Oz Linden <oz@lindenlab.com> | 2011-08-25 09:27:34 -0400 | 
| commit | e6239b7978fb9f05d2c8c7cf42b9277f4a5f7c52 (patch) | |
| tree | 17080b4ffa8a59a5b9c158edaf9e60f9af2a67b4 /indra/newview | |
| parent | 66cac05cfb1236c3c1607dff27babf873c29a679 (diff) | |
| parent | 6484dbf28cb8b6ffa745fe9b26beae58d3c68441 (diff) | |
merge changes for storm-1571
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 55 | ||||
| -rw-r--r-- | indra/newview/llappviewer.cpp | 3 | ||||
| -rwxr-xr-x | indra/newview/llfloaterpreference.cpp | 267 | ||||
| -rw-r--r-- | indra/newview/llfloaterpreference.h | 30 | ||||
| -rw-r--r-- | indra/newview/llloginhandler.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llpanellogin.h | 3 | ||||
| -rw-r--r-- | indra/newview/llsecapi.h | 4 | ||||
| -rw-r--r-- | indra/newview/llstartup.cpp | 192 | ||||
| -rw-r--r-- | indra/newview/llstartup.h | 2 | ||||
| -rw-r--r-- | indra/newview/llviewerfloaterreg.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llxmlrpctransaction.cpp | 13 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_preferences_proxy.xml | 273 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/notifications.xml | 132 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_cof_wearables.xml | 2 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_preferences_privacy.xml | 2 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_preferences_setup.xml | 85 | 
16 files changed, 955 insertions, 115 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 7c01731282..30e0b86a5a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -798,6 +798,61 @@        <key>Value</key>        <integer>5</integer>      </map> +    <key>Socks5ProxyEnabled</key> +    <map> +      <key>Comment</key> +      <string>Use Socks5 Proxy</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>HttpProxyType</key> +    <map> +      <key>Comment</key> +      <string>Proxy type to use for HTTP operations</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>Socks</string> +    </map> +    <key>Socks5ProxyHost</key> +    <map> +      <key>Comment</key> +      <string>Socks 5 Proxy Host</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string></string> +    </map> +    <key>Socks5ProxyPort</key> +    <map> +      <key>Comment</key> +      <string>Socks 5 Proxy Port</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>1080</integer> +    </map> +    <key>Socks5AuthType</key> +    <map> +      <key>Comment</key> +      <string>Selected Auth mechanism for Socks5</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>None</string> +    </map>      <key>BuildAxisDeadZone0</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index d12b971bde..9b29d69cce 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -137,6 +137,7 @@  #include "lltoolmgr.h"  #include "llassetstorage.h"  #include "llpolymesh.h" +#include "llproxy.h"  #include "llaudioengine.h"  #include "llstreamingaudio.h"  #include "llviewermenu.h" @@ -1840,6 +1841,8 @@ bool LLAppViewer::cleanup()  		LLWeb::loadURLExternal( gLaunchFileOnQuit, false );  		llinfos << "File launched." << llendflush;  	} +	llinfos << "Cleaning up LLProxy." << llendl; +	LLProxy::cleanupClass();  	LLMainLoopRepeater::instance().stop(); diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 5fd262a720..d65928e385 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -105,6 +105,7 @@  #include "llviewermedia.h"  #include "llpluginclassmedia.h"  #include "llteleporthistorystorage.h" +#include "llproxy.h"  #include "lllogininstance.h"        // to check if logged in yet  #include "llsdserialize.h" @@ -158,7 +159,7 @@ BOOL LLVoiceSetKeyDialog::handleKeyHere(KEY key, MASK mask)  {  	BOOL result = TRUE; -	if(key == 'Q' && mask == MASK_CONTROL) +	if (key == 'Q' && mask == MASK_CONTROL)  	{  		result = FALSE;  	} @@ -333,16 +334,17 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)  	mCommitCallbackRegistrar.add("Pref.ClickEnablePopup",		boost::bind(&LLFloaterPreference::onClickEnablePopup, this));  	mCommitCallbackRegistrar.add("Pref.ClickDisablePopup",		boost::bind(&LLFloaterPreference::onClickDisablePopup, this));	  	mCommitCallbackRegistrar.add("Pref.LogPath",				boost::bind(&LLFloaterPreference::onClickLogPath, this)); -	mCommitCallbackRegistrar.add("Pref.HardwareSettings",       boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this));	 -	mCommitCallbackRegistrar.add("Pref.HardwareDefaults",       boost::bind(&LLFloaterPreference::setHardwareDefaults, this));	 -	mCommitCallbackRegistrar.add("Pref.VertexShaderEnable",     boost::bind(&LLFloaterPreference::onVertexShaderEnable, this));	 -	mCommitCallbackRegistrar.add("Pref.WindowedMod",            boost::bind(&LLFloaterPreference::onCommitWindowedMode, this));	 -	mCommitCallbackRegistrar.add("Pref.UpdateSliderText",       boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2));	 -	mCommitCallbackRegistrar.add("Pref.QualityPerformance",     boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));	 +	mCommitCallbackRegistrar.add("Pref.HardwareSettings",		boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this)); +	mCommitCallbackRegistrar.add("Pref.HardwareDefaults",		boost::bind(&LLFloaterPreference::setHardwareDefaults, this)); +	mCommitCallbackRegistrar.add("Pref.VertexShaderEnable",		boost::bind(&LLFloaterPreference::onVertexShaderEnable, this)); +	mCommitCallbackRegistrar.add("Pref.WindowedMod",			boost::bind(&LLFloaterPreference::onCommitWindowedMode, this)); +	mCommitCallbackRegistrar.add("Pref.UpdateSliderText",		boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2)); +	mCommitCallbackRegistrar.add("Pref.QualityPerformance",		boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));  	mCommitCallbackRegistrar.add("Pref.applyUIColor",			boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2));  	mCommitCallbackRegistrar.add("Pref.getUIColor",				boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2));  	mCommitCallbackRegistrar.add("Pref.MaturitySettings",		boost::bind(&LLFloaterPreference::onChangeMaturity, this));  	mCommitCallbackRegistrar.add("Pref.BlockList",				boost::bind(&LLFloaterPreference::onClickBlockList, this)); +	mCommitCallbackRegistrar.add("Pref.Proxy",					boost::bind(&LLFloaterPreference::onClickProxySettings, this));  	sSkin = gSavedSettings.getString("SkinCurrent"); @@ -457,7 +459,7 @@ BOOL LLFloaterPreference::postBuild()  void LLFloaterPreference::onBusyResponseChanged()  {  	// set "BusyResponseChanged" TRUE if user edited message differs from default, FALSE otherwise -	if(LLTrans::getString("BusyModeResponseDefault") != getChild<LLUICtrl>("busy_response")->getValue().asString()) +	if (LLTrans::getString("BusyModeResponseDefault") != getChild<LLUICtrl>("busy_response")->getValue().asString())  	{  		gSavedPerAccountSettings.setBOOL("BusyResponseChanged", TRUE );  	} @@ -539,7 +541,7 @@ void LLFloaterPreference::apply()  	LLViewerMedia::setCookiesEnabled(getChild<LLUICtrl>("cookies_enabled")->getValue()); -	if(hasChild("web_proxy_enabled") &&hasChild("web_proxy_editor") && hasChild("web_proxy_port")) +	if (hasChild("web_proxy_enabled") &&hasChild("web_proxy_editor") && hasChild("web_proxy_port"))  	{  		bool proxy_enable = getChild<LLUICtrl>("web_proxy_enabled")->getValue();  		std::string proxy_address = getChild<LLUICtrl>("web_proxy_editor")->getValue(); @@ -552,13 +554,13 @@ void LLFloaterPreference::apply()  	gSavedSettings.setBOOL("PlainTextChatHistory", getChild<LLUICtrl>("plain_text_chat_history")->getValue().asBoolean()); -	if(mGotPersonalInfo) +	if (mGotPersonalInfo)  	{   //		gSavedSettings.setString("BusyModeResponse2", std::string(wstring_to_utf8str(busy_response)));  		bool new_im_via_email = getChild<LLUICtrl>("send_im_to_email")->getValue().asBoolean();  		bool new_hide_online = getChild<LLUICtrl>("online_visibility")->getValue().asBoolean();		 -		if((new_im_via_email != mOriginalIMViaEmail) +		if ((new_im_via_email != mOriginalIMViaEmail)  			||(new_hide_online != mOriginalHideOnlineStatus))  		{  			// This hack is because we are representing several different 	  @@ -566,13 +568,13 @@ void LLFloaterPreference::apply()  			// can only select between 2 values, we represent it as a 	   			// checkbox. This breaks down a little bit for liaisons, but 	   			// works out in the end. 	  -			if(new_hide_online != mOriginalHideOnlineStatus) 	  -			{ 	  -				if(new_hide_online) mDirectoryVisibility = VISIBILITY_HIDDEN; +			if (new_hide_online != mOriginalHideOnlineStatus) +			{ +				if (new_hide_online) mDirectoryVisibility = VISIBILITY_HIDDEN;  				else mDirectoryVisibility = VISIBILITY_DEFAULT;  			 //Update showonline value, otherwise multiple applys won't work  				mOriginalHideOnlineStatus = new_hide_online; -			} 	  +			}  			gAgent.sendAgentUpdateUserInfo(new_im_via_email,mDirectoryVisibility);  		}  	} @@ -616,6 +618,11 @@ void LLFloaterPreference::cancel()  		updateDoubleClickControls();  		mDoubleClickActionDirty = false;  	} +	LLFloaterPreferenceProxy * advanced_proxy_settings = LLFloaterReg::findTypedInstance<LLFloaterPreferenceProxy>("prefs_proxy"); +	if (advanced_proxy_settings) +	{ +		advanced_proxy_settings->cancel(); +	}  }  void LLFloaterPreference::onOpen(const LLSD& key) @@ -799,7 +806,7 @@ void LLFloaterPreference::onBtnCancel()  void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_via_email, const std::string& email)  {  	LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); -	if(instance) +	if (instance)  	{  		instance->setPersonalInfo(visibility, im_via_email, email);	  	} @@ -809,7 +816,7 @@ void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_  void LLFloaterPreference::refreshEnabledGraphics()  {  	LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); -	if(instance) +	if (instance)  	{  		instance->refresh();  		//instance->refreshEnabledState(); @@ -1096,7 +1103,7 @@ void LLFloaterPreference::disableUnavailableSettings()  	LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");  	// if vertex shaders off, disable all shader related products -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable"))  	{  		ctrl_shader_enable->setEnabled(FALSE);  		ctrl_shader_enable->setValue(FALSE); @@ -1127,7 +1134,7 @@ void LLFloaterPreference::disableUnavailableSettings()  	}  	// disabled windlight -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders"))  	{  		ctrl_wind_light->setEnabled(FALSE);  		ctrl_wind_light->setValue(FALSE); @@ -1164,28 +1171,28 @@ void LLFloaterPreference::disableUnavailableSettings()  	}  	// disabled deferred SSAO -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO"))  	{  		ctrl_ssao->setEnabled(FALSE);  		ctrl_ssao->setValue(FALSE);  	}  	// disabled deferred shadows -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail"))  	{  		ctrl_shadows->setEnabled(FALSE);  		ctrl_shadows->setValue(0);  	}  	// disabled reflections -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail"))  	{  		ctrl_reflections->setEnabled(FALSE);  		ctrl_reflections->setValue(FALSE);  	}  	// disabled av -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP"))  	{  		ctrl_avatar_vp->setEnabled(FALSE);  		ctrl_avatar_vp->setValue(FALSE); @@ -1208,14 +1215,14 @@ void LLFloaterPreference::disableUnavailableSettings()  	}  	// disabled cloth -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarCloth")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarCloth"))  	{  		ctrl_avatar_cloth->setEnabled(FALSE);  		ctrl_avatar_cloth->setValue(FALSE);  	}  	// disabled impostors -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderUseImpostors")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderUseImpostors"))  	{  		ctrl_avatar_impostors->setEnabled(FALSE);  		ctrl_avatar_impostors->setValue(FALSE); @@ -1381,12 +1388,12 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im  	mOriginalIMViaEmail = im_via_email;  	mDirectoryVisibility = visibility; -	if(visibility == VISIBILITY_DEFAULT) +	if (visibility == VISIBILITY_DEFAULT)  	{  		mOriginalHideOnlineStatus = false;  		getChildView("online_visibility")->setEnabled(TRUE); 	   	} -	else if(visibility == VISIBILITY_HIDDEN) +	else if (visibility == VISIBILITY_HIDDEN)  	{  		mOriginalHideOnlineStatus = true;  		getChildView("online_visibility")->setEnabled(TRUE); 	  @@ -1434,7 +1441,7 @@ void LLFloaterPreference::onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name)  {  	std::string ctrl_name = name.asString(); -	if((ctrl_name =="" )|| !hasChild(ctrl_name, true)) +	if ((ctrl_name =="" )|| !hasChild(ctrl_name, true))  		return;  	LLTextBox* text_box = getChild<LLTextBox>(name.asString()); @@ -1444,7 +1451,7 @@ void LLFloaterPreference::onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name)  void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box)  { -	if(text_box == NULL || ctrl== NULL) +	if (text_box == NULL || ctrl== NULL)  		return;  	// get range and points when text should change @@ -1457,7 +1464,7 @@ void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_b  	F32 highPoint = min + (2.0f * range / 3.0f);  	// choose the right text -	if(value < midPoint) +	if (value < midPoint)  	{  		text_box->setText(LLTrans::getString("GraphicsQualityLow"));  	}  @@ -1541,6 +1548,11 @@ void LLFloaterPreference::updateDoubleClickSettings()  	}  } +void LLFloaterPreference::onClickProxySettings() +{ +	LLFloaterReg::showInstance("prefs_proxy"); +} +  void LLFloaterPreference::updateDoubleClickControls()  {  	// check is one of double-click actions settings enabled @@ -1637,7 +1649,7 @@ BOOL LLPanelPreference::postBuild()  {  	////////////////////// PanelVoice /////////////////// -	if(hasChild("voice_unavailable")) +	if (hasChild("voice_unavailable"))  	{  		BOOL voice_disabled = gSavedSettings.getBOOL("CmdLineDisableVoice");  		getChildView("voice_unavailable")->setVisible( voice_disabled); @@ -1659,7 +1671,7 @@ BOOL LLPanelPreference::postBuild()  	} -	if(hasChild("online_visibility") && hasChild("send_im_to_email")) +	if (hasChild("online_visibility") && hasChild("send_im_to_email"))  	{  		getChild<LLUICtrl>("email_address")->setValue(getString("log_in_to_change") );  //		getChild<LLUICtrl>("busy_response")->setValue(getString("log_in_to_change"));		 @@ -1788,7 +1800,7 @@ void LLPanelPreference::cancel()  		 iter != mSavedColors.end(); ++iter)  	{  		LLColorSwatchCtrl* color_swatch = findChild<LLColorSwatchCtrl>(iter->first); -		if(color_swatch) +		if (color_swatch)  		{  			color_swatch->set(iter->second);  			color_swatch->onCommit(); @@ -1832,7 +1844,7 @@ void LLPanelPreferenceGraphics::draw()  	LLButton* button_apply = findChild<LLButton>("Apply"); -	if(button_apply && button_apply->getVisible()) +	if (button_apply && button_apply->getVisible())  	{  		bool enable = hasDirtyChilds(); @@ -1852,7 +1864,7 @@ bool LLPanelPreferenceGraphics::hasDirtyChilds()  		LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);  		if (ctrl)  		{ -			if(ctrl->isDirty()) +			if (ctrl->isDirty())  				return true;  		}  		// Push children onto the end of the work stack @@ -1908,3 +1920,188 @@ void LLPanelPreferenceGraphics::setHardwareDefaults()  	resetDirtyChilds();  	LLPanelPreference::setHardwareDefaults();  } + +LLFloaterPreferenceProxy::LLFloaterPreferenceProxy(const LLSD& key) +	: LLFloater(key), +	  mSocksSettingsDirty(false) +{ +	mCommitCallbackRegistrar.add("Proxy.OK",                boost::bind(&LLFloaterPreferenceProxy::onBtnOk, this)); +	mCommitCallbackRegistrar.add("Proxy.Cancel",            boost::bind(&LLFloaterPreferenceProxy::onBtnCancel, this)); +	mCommitCallbackRegistrar.add("Proxy.Change",            boost::bind(&LLFloaterPreferenceProxy::onChangeSocksSettings, this)); +} + +LLFloaterPreferenceProxy::~LLFloaterPreferenceProxy() +{ +} + +BOOL LLFloaterPreferenceProxy::postBuild() +{ +	LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type"); +	if (!socksAuth) +	{ +		return FALSE; +	} +	if (socksAuth->getSelectedValue().asString() == "None") +	{ +		getChild<LLLineEditor>("socks5_username")->setEnabled(false); +		getChild<LLLineEditor>("socks5_password")->setEnabled(false); +	} +	else +	{ +		// Populate the SOCKS 5 credential fields with protected values. +		LLPointer<LLCredential> socks_cred = gSecAPIHandler->loadCredential("SOCKS5"); +		getChild<LLLineEditor>("socks5_username")->setValue(socks_cred->getIdentifier()["username"].asString()); +		getChild<LLLineEditor>("socks5_password")->setValue(socks_cred->getAuthenticator()["creds"].asString()); +	} + +	center(); +	return TRUE; +} + +void LLFloaterPreferenceProxy::onOpen(const LLSD& key) +{ +	saveSettings(); +} + +void LLFloaterPreferenceProxy::onClose(bool app_quitting) +{ +	if (mSocksSettingsDirty) +	{ + +		// If the user plays with the Socks proxy settings after login, it's only fair we let them know +		// it will not be updated until next restart. +		if (LLStartUp::getStartupState()>STATE_LOGIN_WAIT) +		{ +			LLNotifications::instance().add("ChangeProxySettings", LLSD(), LLSD()); +			mSocksSettingsDirty = false; // we have notified the user now be quiet again +		} +	} +} + +void LLFloaterPreferenceProxy::saveSettings() +{ +	// Save the value of all controls in the hierarchy +	mSavedValues.clear(); +	std::list<LLView*> view_stack; +	view_stack.push_back(this); +	while(!view_stack.empty()) +	{ +		// Process view on top of the stack +		LLView* curview = view_stack.front(); +		view_stack.pop_front(); + +		LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview); +		if (ctrl) +		{ +			LLControlVariable* control = ctrl->getControlVariable(); +			if (control) +			{ +				mSavedValues[control] = control->getValue(); +			} +		} + +		// Push children onto the end of the work stack +		for (child_list_t::const_iterator iter = curview->getChildList()->begin(); +				iter != curview->getChildList()->end(); ++iter) +		{ +			view_stack.push_back(*iter); +		} +	} +} + +void LLFloaterPreferenceProxy::onBtnOk() +{ +	// commit any outstanding text entry +	if (hasFocus()) +	{ +		LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus()); +		if (cur_focus && cur_focus->acceptsTextInput()) +		{ +			cur_focus->onCommit(); +		} +	} + +	// Save SOCKS proxy credentials securely if password auth is enabled +	LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type"); +	if (socksAuth->getSelectedValue().asString() == "UserPass") +	{ +		LLSD socks_id = LLSD::emptyMap(); +		socks_id["type"] = "SOCKS5"; +		socks_id["username"] = getChild<LLLineEditor>("socks5_username")->getValue().asString(); + +		LLSD socks_authenticator = LLSD::emptyMap(); +		socks_authenticator["type"] = "SOCKS5"; +		socks_authenticator["creds"] = getChild<LLLineEditor>("socks5_password")->getValue().asString(); + +		// Using "SOCKS5" as the "grid" argument since the same proxy +		// settings will be used for all grids and because there is no +		// way to specify the type of credential. +		LLPointer<LLCredential> socks_cred = gSecAPIHandler->createCredential("SOCKS5", socks_id, socks_authenticator); +		gSecAPIHandler->saveCredential(socks_cred, true); +	} +	else +	{ +		// Clear SOCKS5 credentials since they are no longer needed. +		LLPointer<LLCredential> socks_cred = new LLCredential("SOCKS5"); +		gSecAPIHandler->deleteCredential(socks_cred); +	} + +	closeFloater(false); +} + +void LLFloaterPreferenceProxy::onBtnCancel() +{ +	if (hasFocus()) +	{ +		LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus()); +		if (cur_focus && cur_focus->acceptsTextInput()) +		{ +			cur_focus->onCommit(); +		} +		refresh(); +	} + +	cancel(); +} + +void LLFloaterPreferenceProxy::cancel() +{ + +	for (control_values_map_t::iterator iter =  mSavedValues.begin(); +			iter !=  mSavedValues.end(); ++iter) +	{ +		LLControlVariable* control = iter->first; +		LLSD ctrl_value = iter->second; +		control->set(ctrl_value); +	} + +	closeFloater(); +} + +void LLFloaterPreferenceProxy::onChangeSocksSettings()  +{ +	mSocksSettingsDirty = true; + +	LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type"); +	if (socksAuth->getSelectedValue().asString() == "None") +	{ +		getChild<LLLineEditor>("socks5_username")->setEnabled(false); +		getChild<LLLineEditor>("socks5_password")->setEnabled(false); +	} +	else +	{ +		getChild<LLLineEditor>("socks5_username")->setEnabled(true); +		getChild<LLLineEditor>("socks5_password")->setEnabled(true); +	} + +	// Check for invalid states for the other HTTP proxy radio +	LLRadioGroup* otherHttpProxy = getChild<LLRadioGroup>("other_http_proxy_type"); +	if ((otherHttpProxy->getSelectedValue().asString() == "Socks" && +			getChild<LLCheckBoxCtrl>("socks_proxy_enabled")->get() == FALSE )||( +					otherHttpProxy->getSelectedValue().asString() == "Web" && +					getChild<LLCheckBoxCtrl>("web_proxy_enabled")->get() == FALSE ) ) +	{ +		otherHttpProxy->selectFirstItem(); +	} + +}; diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 61f2c78640..ef9bc2dd53 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -156,6 +156,7 @@ public:  	void applyResolution();  	void onChangeMaturity();  	void onClickBlockList(); +	void onClickProxySettings();  	void applyUIColor(LLUICtrl* ctrl, const LLSD& param);  	void getUIColor(LLUICtrl* ctrl, const LLSD& param); @@ -229,4 +230,33 @@ protected:  }; +class LLFloaterPreferenceProxy : public LLFloater +{ +public:  +	LLFloaterPreferenceProxy(const LLSD& key); +	~LLFloaterPreferenceProxy(); + +	/// show off our menu +	static void show(); +	void cancel(); +	 +protected: +	BOOL postBuild(); +	void onOpen(const LLSD& key); +	void onClose(bool app_quitting); +	void saveSettings(); +	void onBtnOk(); +	void onBtnCancel(); + +	void onChangeSocksSettings(); + +private: +	 +	bool mSocksSettingsDirty; +	typedef std::map<LLControlVariable*, LLSD> control_values_map_t; +	control_values_map_t mSavedValues; + +}; + +  #endif  // LL_LLPREFERENCEFLOATER_H diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp index 48be251611..9b4f146332 100644 --- a/indra/newview/llloginhandler.cpp +++ b/indra/newview/llloginhandler.cpp @@ -30,13 +30,13 @@  // viewer includes  #include "llsecapi.h" -#include "lllogininstance.h"        // to check if logged in yet -#include "llpanellogin.h"			// save_password_to_disk() +#include "lllogininstance.h"		// to check if logged in yet +#include "llpanellogin.h"  #include "llstartup.h"				// getStartupState()  #include "llslurl.h"  #include "llviewercontrol.h"		// gSavedSettings  #include "llviewernetwork.h"		// EGridInfo -#include "llviewerwindow.h"                    // getWindow() +#include "llviewerwindow.h"			// getWindow()  // library includes  #include "llmd5.h" diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index b29b3af7ca..4078eedc77 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -113,7 +113,4 @@ private:  	static BOOL		sCapslockDidNotification;  }; -std::string load_password_from_disk(void); -void save_password_to_disk(const char* hashed_password); -  #endif diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h index 8e4c2c56c6..0935a0005b 100644 --- a/indra/newview/llsecapi.h +++ b/indra/newview/llsecapi.h @@ -286,8 +286,8 @@ bool operator!=(const LLCertificateVector::iterator& _lhs, const LLCertificateVe  #define CRED_AUTHENTICATOR_TYPE_HASH   "hash"  //  // LLCredential - interface for credentials providing the following functionality: -// * persistance of credential information based on grid (for saving username/password) -// * serialization to an OGP identifier/authenticator pair +// * Persistence of credential information based on grid (for saving username/password) +// * Serialization to an OGP identifier/authenticator pair  //   class LLCredential  : public LLRefCount  { diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 880b437404..749acea6c1 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -126,6 +126,7 @@  #include "llpanelgroupnotices.h"  #include "llpreview.h"  #include "llpreviewscript.h" +#include "llproxy.h"  #include "llproductinforequest.h"  #include "llsecondlifeurls.h"  #include "llselectmgr.h" @@ -386,6 +387,14 @@ bool idle_startup()  			LLNotificationsUtil::add(gViewerWindow->getInitAlert());  		} +		//------------------------------------------------- +		// Init the SOCKS 5 proxy if the user has configured +		// one. We need to do this early in case the user +		// is using SOCKS for HTTP so we get the login +		// screen and HTTP tables via SOCKS. +		//------------------------------------------------- +		LLStartUp::startLLProxy(); +  		gSavedSettings.setS32("LastFeatureVersion", LLFeatureManager::getInstance()->getVersion());  		gSavedSettings.setS32("LastGPUClass", LLFeatureManager::getInstance()->getGPUClass()); @@ -591,7 +600,7 @@ bool idle_startup()  		}  		LL_INFOS("AppInit") << "Message System Initialized." << LL_ENDL; -		 +  		//-------------------------------------------------  		// Init audio, which may be needed for prefs dialog  		// or audio cues in connection UI. @@ -800,7 +809,21 @@ bool idle_startup()  	if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState())  	{ -		//reset the values that could have come in from a slurl +		// Post login screen, we should see if any settings have changed that may +		// require us to either start/stop or change the socks proxy. As various communications +		// past this point may require the proxy to be up. +		if (!LLStartUp::startLLProxy()) +		{ +			// Proxy start up failed, we should now bail the state machine +			// startLLProxy() will have reported an error to the user +			// already, so we just go back to the login screen. The user +			// could then change the preferences to fix the issue. + +			LLStartUp::setStartupState(STATE_LOGIN_SHOW); +			return FALSE; +		} + +		// reset the values that could have come in from a slurl  		// DEV-42215: Make sure they're not empty -- gUserCredential  		// might already have been set from gSavedSettings, and it's too bad  		// to overwrite valid values with empty strings. @@ -2768,6 +2791,171 @@ void LLStartUp::setStartSLURL(const LLSLURL& slurl)      }  } +/** + * Read all proxy configuration settings and set up both the HTTP proxy and + * SOCKS proxy as needed. + * + * Any errors that are encountered will result in showing the user a notification. + * When an error is encountered, + * + * @return Returns true if setup was successful, false if an error was encountered. + */ +bool LLStartUp::startLLProxy() +{ +	bool proxy_ok = true; +	std::string httpProxyType = gSavedSettings.getString("HttpProxyType"); + +	// Set up SOCKS proxy (if needed) +	if (gSavedSettings.getBOOL("Socks5ProxyEnabled")) +	{	 +		// Determine and update LLProxy with the saved authentication system +		std::string auth_type = gSavedSettings.getString("Socks5AuthType"); + +		if (auth_type.compare("UserPass") == 0) +		{ +			LLPointer<LLCredential> socks_cred = gSecAPIHandler->loadCredential("SOCKS5"); +			std::string socks_user = socks_cred->getIdentifier()["username"].asString(); +			std::string socks_password = socks_cred->getAuthenticator()["creds"].asString(); + +			bool ok = LLProxy::getInstance()->setAuthPassword(socks_user, socks_password); + +			if (!ok) +			{ +				LLNotificationsUtil::add("SOCKS_BAD_CREDS"); +				proxy_ok = false; +			} +		} +		else if (auth_type.compare("None") == 0) +		{ +			LLProxy::getInstance()->setAuthNone(); +		} +		else +		{ +			LL_WARNS("Proxy") << "Invalid SOCKS 5 authentication type."<< LL_ENDL; + +			// Unknown or missing setting. +			gSavedSettings.setString("Socks5AuthType", "None"); + +			// Clear the SOCKS credentials. +			LLPointer<LLCredential> socks_cred = new LLCredential("SOCKS5"); +			gSecAPIHandler->deleteCredential(socks_cred); + +			LLProxy::getInstance()->setAuthNone(); +		} + +		if (proxy_ok) +		{ +			// Start the proxy and check for errors +			// If status != SOCKS_OK, stopSOCKSProxy() will already have been called when startSOCKSProxy() returns. +			LLHost socks_host; +			socks_host.setHostByName(gSavedSettings.getString("Socks5ProxyHost")); +			socks_host.setPort(gSavedSettings.getU32("Socks5ProxyPort")); +			int status = LLProxy::getInstance()->startSOCKSProxy(socks_host); + +			if (status != SOCKS_OK) +			{ +				LLSD subs; +				subs["HOST"] = gSavedSettings.getString("Socks5ProxyHost"); +				subs["PORT"] = (S32)gSavedSettings.getU32("Socks5ProxyPort"); + +				std::string error_string; + +				switch(status) +				{ +					case SOCKS_CONNECT_ERROR: // TCP Fail +						error_string = "SOCKS_CONNECT_ERROR"; +						break; + +					case SOCKS_NOT_PERMITTED: // SOCKS 5 server rule set refused connection +						error_string = "SOCKS_NOT_PERMITTED"; +						break; + +					case SOCKS_NOT_ACCEPTABLE: // Selected authentication is not acceptable to server +						error_string = "SOCKS_NOT_ACCEPTABLE"; +						break; + +					case SOCKS_AUTH_FAIL: // Authentication failed +						error_string = "SOCKS_AUTH_FAIL"; +						break; + +					case SOCKS_UDP_FWD_NOT_GRANTED: // UDP forward request failed +						error_string = "SOCKS_UDP_FWD_NOT_GRANTED"; +						break; + +					case SOCKS_HOST_CONNECT_FAILED: // Failed to open a TCP channel to the socks server +						error_string = "SOCKS_HOST_CONNECT_FAILED"; +						break; + +					case SOCKS_INVALID_HOST: // Improperly formatted host address or port. +						error_string = "SOCKS_INVALID_HOST"; +						break; + +					default: +						error_string = "SOCKS_UNKNOWN_STATUS"; // Something strange happened, +						LL_WARNS("Proxy") << "Unknown return from LLProxy::startProxy(): " << status << LL_ENDL; +						break; +				} + +				LLNotificationsUtil::add(error_string, subs); +				proxy_ok = false; +			} +		} +	} +	else +	{ +		LLProxy::getInstance()->stopSOCKSProxy(); // ensure no UDP proxy is running and it's all cleaned up +	} + +	if (proxy_ok) +	{ +		// Determine the HTTP proxy type (if any) +		if ((httpProxyType.compare("Web") == 0) && gSavedSettings.getBOOL("BrowserProxyEnabled")) +		{ +			LLHost http_host; +			http_host.setHostByName(gSavedSettings.getString("BrowserProxyAddress")); +			http_host.setPort(gSavedSettings.getS32("BrowserProxyPort")); +			if (!LLProxy::getInstance()->enableHTTPProxy(http_host, LLPROXY_HTTP)) +			{ +				LLSD subs; +				subs["HOST"] = http_host.getIPString(); +				subs["PORT"] = (S32)http_host.getPort(); +				LLNotificationsUtil::add("PROXY_INVALID_HTTP_HOST", subs); +				proxy_ok = false; +			} +		} +		else if ((httpProxyType.compare("Socks") == 0) && gSavedSettings.getBOOL("Socks5ProxyEnabled")) +		{ +			LLHost socks_host; +			socks_host.setHostByName(gSavedSettings.getString("Socks5ProxyHost")); +			socks_host.setPort(gSavedSettings.getU32("Socks5ProxyPort")); +			if (!LLProxy::getInstance()->enableHTTPProxy(socks_host, LLPROXY_SOCKS)) +			{ +				LLSD subs; +				subs["HOST"] = socks_host.getIPString(); +				subs["PORT"] = (S32)socks_host.getPort(); +				LLNotificationsUtil::add("PROXY_INVALID_SOCKS_HOST", subs); +				proxy_ok = false; +			} +		} +		else if (httpProxyType.compare("None") == 0) +		{ +			LLProxy::getInstance()->disableHTTPProxy(); +		} +		else +		{ +			LL_WARNS("Proxy") << "Invalid other HTTP proxy configuration."<< LL_ENDL; + +			// Set the missing or wrong configuration back to something valid. +			gSavedSettings.setString("HttpProxyType", "None"); +			LLProxy::getInstance()->disableHTTPProxy(); + +			// Leave proxy_ok alone, since this isn't necessarily fatal. +		} +	} + +	return proxy_ok; +} +  bool login_alert_done(const LLSD& notification, const LLSD& response)  {  	LLPanelLogin::giveFocus(); diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h index b3d9ef1dcc..99a644eb9c 100644 --- a/indra/newview/llstartup.h +++ b/indra/newview/llstartup.h @@ -113,6 +113,8 @@ public:  	static void setStartSLURL(const LLSLURL& slurl);   	static LLSLURL& getStartSLURL() { return sStartSLURL; }  +	static bool startLLProxy(); // Initialize the SOCKS 5 proxy +  private:  	static LLSLURL sStartSLURL; diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index dd0989d608..fecc6d91bd 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -232,6 +232,7 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("postcard", "floater_postcard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostcard>);  	LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>); +	LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceProxy>);  	LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHardwareSettings>);  	LLFloaterReg::add("perm_prefs", "floater_perm_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPerms>);  	LLFloaterReg::add("pref_joystick", "floater_joystick.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterJoystick>); diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index bd1d2ed7a7..f483ba5af8 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -306,19 +306,8 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)  		mCurlRequest = new LLCurlEasyRequest();  	}  	mErrorCert = NULL; -	 -	if (gSavedSettings.getBOOL("BrowserProxyEnabled")) -	{ -		mProxyAddress = gSavedSettings.getString("BrowserProxyAddress"); -		S32 port = gSavedSettings.getS32 ( "BrowserProxyPort" ); - -		// tell curl about the settings -		mCurlRequest->setoptString(CURLOPT_PROXY, mProxyAddress); -		mCurlRequest->setopt(CURLOPT_PROXYPORT, port); -		mCurlRequest->setopt(CURLOPT_PROXYTYPE, CURLPROXY_HTTP); -	} -//	mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // usefull for debugging +//	mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // useful for debugging  	mCurlRequest->setopt(CURLOPT_NOSIGNAL, 1);  	mCurlRequest->setWriteCallback(&curlDownloadCallback, (void*)this);  	BOOL vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert"); diff --git a/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml new file mode 100644 index 0000000000..449731ab89 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml @@ -0,0 +1,273 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + height="500" + layout="topleft" + name="Proxy Settings Floater" + help_topic="proxysettings" + title="Proxy Settings" + width="500"> +	<check_box +	 control_name="BrowserProxyEnabled" +	 top="38" +	 enabled="true" +	 follows="left|top" +	 height="14" +	 initial_value="false" +	 commit_callback.function="Proxy.Change" +	 label="Use HTTP Proxy for Web pages" +	 left="22" +	 mouse_opaque="true" +	 name="web_proxy_enabled" +	 radio_style="false" +	 width="400" +	 top_pad="5" /> +	<text +	 type="string" +	 length="1" +	 follows="left|top" +	 height="10" +	 left_delta="23" +	 layout="topleft" +	 name="Proxy location" +	 top_pad="10" +	 width="300"> +	    HTTP Proxy: +	</text> +	<line_editor +	 control_name="BrowserProxyAddress" +	 enabled_control="BrowserProxyEnabled" +	 follows="left|top" +	 font="SansSerif" +	 height="23" +	 layout="topleft" +	 left_delta="0" +	 name="web_proxy_editor" +	 tool_tip="The DNS name or IP address of the HTTP proxy you would like to use." +	 top_pad="4" +	 width="200" /> +	<spinner +	 control_name="BrowserProxyPort" +	 enabled_control="BrowserProxyEnabled" +     decimal_digits="0" +	 follows="left|top" +	 height="23" +	 increment="1" +	 initial_value="80" +	 label="Port number:" +	 label_width="95" +	 layout="topleft" +	 left_delta="210" +	 max_val="12000" +	 min_val="10" +	 name="web_proxy_port" +	 top_delta="0" +	 tool_tip="The port of the HTTP proxy you would like to use." +	 width="145" /> +	<check_box +	 control_name="Socks5ProxyEnabled" +	 height="16" +	 label="Use SOCKS 5 Proxy for UDP traffic" +	 layout="topleft" +	 left="22" +	 name="socks_proxy_enabled" +	 top_pad="32" +	 width="256" +	 commit_callback.function="Proxy.Change" /> +	<text +	 type="string" +	 length="1" +	 follows="left|top" +	 height="10" +	 layout="topleft" +	 left_delta="23" +	 name="Proxy location" +	 top_pad="10" +	 width="300"> +	    SOCKS 5 Proxy: +	</text> +	<line_editor +	 control_name="Socks5ProxyHost" +	 enabled_control="Socks5ProxyEnabled" +	 follows="left|top" +	 font="SansSerif" +	 height="23" +	 layout="topleft" +	 left_delta="0" +	 name="socks_proxy_editor" +	 tool_tip="The DNS name or IP address of the SOCKS 5 proxy you would like to use." +	 top_pad="4" +	 width="200" +	 commit_callback.function="Proxy.Change" /> +	<spinner +	 control_name="Socks5ProxyPort" +	 enabled_control="Socks5ProxyEnabled" +	 decimal_digits="0" +	 follows="left|top" +	 height="23" +	 increment="1" +	 initial_value="80" +	 label="Port number:" +	 label_width="95" +	 layout="topleft" +	 left_delta="210" +	 max_val="12000" +	 min_val="10" +	 name="socks_proxy_port" +	 top_delta="0" +	 width="145" +	 tool_tip="The port of the SOCKS 5 proxy you would like to use." +	 commit_callback.function="Proxy.Change" /> +	<text +	 type="string" +	 length="1" +	 follows="left|top" +	 height="10" +	 layout="topleft" +	 left="40" +	 name="Proxy location" +	 top_pad="15" +	 width="300"> +	    SOCKS Authentication: +	</text> +	<radio_group +	 control_name="Socks5AuthType" +	 enabled_control="Socks5ProxyEnabled" +	 height="50" +	 layout="topleft" +	 name="socks5_auth_type" +	 top_pad="10" +	 width="120" +	 commit_callback.function="Proxy.Change" > +		<radio_item +		 height="16" +		 label="No Authentication" +		 layout="topleft" +		 name="Socks5NoAuth" +		 value="None" +		 tool_tip="Socks5 proxy requires no authentication." +		 width="120" /> +		<radio_item +		 height="16" +		 label="Username/Password" +		 layout="topleft" +		 name="Socks5UserPass" +		 value="UserPass" +		 tool_tip="Socks5 proxy requires username/password authentication." +		 width="120" /> +	</radio_group> +	<text +	 type="string" +	 length="1" +	 follows="left|top" +	 height="10" +	 layout="topleft" +	 left_delta="20" +	 top_delta="50" +	 width="200"> +	    Username: +	</text> +	<text +	 type="string" +	 length="1" +	 follows="left|top" +	 height="10" +	 left_pad="15" +	 layout="topleft" +	 width="200"> +	    Password: +	</text> +	<line_editor +	 follows="left|top" +	 font="SansSerif" +	 height="23" +	 layout="topleft" +	 left="60" +	 name="socks5_username" +	 tool_tip="The username used to authenticate with your SOCKS 5 server" +	 top_pad="4" +	 width="200" +	 commit_callback.function="Proxy.Change" /> +	<line_editor +	 follows="left|top" +	 font="SansSerif" +	 height="23" +	 layout="topleft" +	 left_pad="15" +	 name="socks5_password" +	 tool_tip="The password used to authenticate with your SOCKS 5 server" +	 top_delta="0" +	 width="200" +	 is_password="true" +	 commit_callback.function="Proxy.Change" /> +	<text +	 type="string" +	 length="1" +	 follows="left|top" +	 height="10" +	 layout="topleft" +	 left="25" +	 name="Proxy location" +	 top_pad="18" +	 width="300"> +	   Other HTTP traffic proxy: +	</text> +	<radio_group +	 control_name="HttpProxyType" +	 name="other_http_proxy_type" +	 height="60" +	 layout="topleft" +	 top_pad="9" +	 width="120" +	 left_delta="15"  +	 commit_callback.function="Proxy.Change" > +		<radio_item +		 height="16" +		 label="Do not proxy" +		 layout="topleft" +		 name="OtherNoProxy" +		 value="None" +		 width="120" +		 tool_tip="Non-web HTTP traffic will NOT be sent to any proxy."/> +		<radio_item +		 height="16" +		 label="Use HTTP Proxy" +		 layout="topleft" +		 name="OtherHTTPProxy" +		 value="Web" +		 width="120" +		 enabled_control="BrowserProxyEnabled" +		 tool_tip="Non-web HTTP will be sent through the configured Web proxy." /> +		<radio_item +		 height="16" +		 label="Use SOCKS 5 Proxy" +		 layout="topleft" +		 name="OtherSocksProxy" +		 value="Socks" +		 width="120" +		 enabled_control="Socks5ProxyEnabled" +		 tool_tip="Non-web HTTP traffic will be sent through the configured Socks 5 proxy."/> +	</radio_group> +	<button +	 follows="left|top" +	 height="22" +	 label="OK" +	 label_selected="OK" +	 layout="topleft" +	 left="282" +	 name="OK" +	 top_pad="36" +	 width="90" +	 commit_callback.function="Proxy.OK" /> +	<button +	 follows="left|top" +	 height="22" +	 label="Cancel" +	 label_selected="Cancel" +	 layout="topleft" +	 left_pad="10" +	 name="Cancel" +	 top_delta="0" +	 width="90" +	 commit_callback.function="Proxy.Cancel" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index c9ccd44b83..104bcaf7d0 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -7157,6 +7157,138 @@ Click and drag anywhere on the world to rotate your view    </notification>    <notification +   icon="alertmodal.tga" +   name="SOCKS_NOT_PERMITTED" +   type="alertmodal"> +	The SOCKS 5 proxy "[HOST]:[PORT]" refused the connection, not allowed by rule set. +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SOCKS_CONNECT_ERROR" +   type="alertmodal"> +	The SOCKS 5 proxy "[HOST]:[PORT]" refused the connection, could not open TCP channel. +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/>	  +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SOCKS_NOT_ACCEPTABLE" +   type="alertmodal"> +	The SOCKS 5 proxy "[HOST]:[PORT]" refused the selected authentication system. +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SOCKS_AUTH_FAIL" +   type="alertmodal"> +	The SOCKS 5 proxy "[HOST]:[PORT]" reported your credentials are invalid. +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SOCKS_UDP_FWD_NOT_GRANTED" +   type="alertmodal"> +	The SOCKS 5 proxy "[HOST]:[PORT]" refused the UDP associate request. +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SOCKS_HOST_CONNECT_FAILED" +   type="alertmodal"> +	Could not connect to SOCKS 5 proxy server "[HOST]:[PORT]". +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> +   +  <notification +   icon="alertmodal.tga" +   name="SOCKS_UNKNOWN_STATUS" +   type="alertmodal"> +	Unknown proxy error with server "[HOST]:[PORT]". +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> +   +  <notification +   icon="alertmodal.tga" +   name="SOCKS_INVALID_HOST" +   type="alertmodal"> +	Invalid SOCKS proxy address or port "[HOST]:[PORT]". +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> +   +  <notification +   icon="alertmodal.tga" +   name="SOCKS_BAD_CREDS" +   type="alertmodal"> +	Invalid SOCKS 5 username or password. +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> +   +  <notification +   icon="alertmodal.tga" +   name="PROXY_INVALID_HTTP_HOST" +   type="alertmodal"> +    Invalid HTTP proxy address or port "[HOST]:[PORT]". +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="PROXY_INVALID_SOCKS_HOST" +   type="alertmodal"> +	Invalid SOCKS proxy address or port "[HOST]:[PORT]". +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="ChangeProxySettings" +   type="alert"> +	Proxy settings take effect after you restart [APP_NAME]. +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification    name="AuthRequest"    type="browser">  The site at '<nolink>[HOST_NAME]</nolink>' in realm '[REALM]' requires a user name and password. diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml index 9e70706603..beea53437a 100644 --- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml +++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml @@ -52,7 +52,7 @@               multi_select="true"               name="list_attachments"               top="0" -             width="311"/> +			 width="311" />          </accordion_tab>          <accordion_tab           layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index 30be5bc853..47236c1a48 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -139,7 +139,7 @@       height="16"       label="Add datestamp to log file name."       layout="topleft" -     left_detla="5" +     left_delta="5"       name="logfile_name_datestamp"       top_pad="10"       width="350"/> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index e639f0dc9d..a7078ce2e1 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -70,7 +70,7 @@     layout="topleft"     left="77"     name="connection_port_enabled" -   top_pad="20" +   top_pad="10"     width="256">      <check_box.commit_callback       function="Notification.Show" @@ -79,7 +79,7 @@    <spinner     control_name="ConnectionPort"     enabled_control="ConnectionPortEnabled" - decimal_digits="0" +   decimal_digits="0"     follows="left|top"     height="23"     increment="1" @@ -195,60 +195,6 @@      name="media_popup_enabled"      width="400"                 top_pad="5"/> -  <check_box -    top_delta="4" -    enabled="true" -    follows="left|top" -    height="14" -    initial_value="false" -    control_name="BrowserProxyEnabled" -    label="Enable Web Proxy" -    left_delta="0" -    mouse_opaque="true" -    name="web_proxy_enabled" -    radio_style="false" -    width="400"           top_pad="5"/> -  <text -   type="string" -   length="1" -   follows="left|top" -   height="10" -   layout="topleft" -   left_delta="20" -   name="Proxy location" -   top_delta="16" -   width="300"> -    Proxy location: -  </text> -  <line_editor -   control_name="BrowserProxyAddress" -   enabled_control="BrowserProxyEnabled" - follows="left|top" -   font="SansSerif" -   height="23" -   layout="topleft" -   left_delta="0" -   name="web_proxy_editor" -   tool_tip="The name or IP address of the proxy you would like to use" -   top_pad="4" -   width="200" /> -  <spinner -   control_name="BrowserProxyPort" -   enabled_control="BrowserProxyEnabled" - decimal_digits="0" -   follows="left|top" -   height="23" -   increment="1" -   initial_value="80" -   label="Port number:" -   label_width="95" -   layout="topleft" -   left_delta="210" -   max_val="12000" -   min_val="10" -   name="web_proxy_port" -   top_delta="0" -   width="145" />    <text       type="string"       length="1" @@ -286,4 +232,31 @@           name="Install_manual"           value="0" />    </combo_box> +  <text +     type="string" +     length="1" +     follows="left|top" +     height="10" +     layout="topleft" +     left="30" +     name="Proxy Settings:" +     mouse_opaque="false" +     top_pad="5" +     width="300"> +		Proxy Settings: +  </text> +  <button +	label="Adjust proxy settings" +    follows="left|top" +    height="23" +	width="140"  +    label_selected="Browse" +    layout="topleft" +    left_delta="50" +    name="set_proxy" +    top_pad="5" +    > +		<button.commit_callback +		  function="Pref.Proxy" /> +  </button>  </panel> | 
