llpanelmediasettingssecurity.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:12k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file llpanelmediasettingssecurity.cpp
  3.  * @brief LLPanelMediaSettingsSecurity class implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2009-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "llpanelmediasettingssecurity.h"
  34. #include "llfloaterreg.h"
  35. #include "llpanelcontents.h"
  36. #include "llcheckboxctrl.h"
  37. #include "llnotificationsutil.h"
  38. #include "llscrolllistctrl.h"
  39. #include "llscrolllistitem.h"
  40. #include "lluictrlfactory.h"
  41. #include "llwindow.h"
  42. #include "llviewerwindow.h"
  43. #include "llsdutil.h"
  44. #include "llselectmgr.h"
  45. #include "llmediaentry.h"
  46. #include "lltextbox.h"
  47. #include "llfloaterwhitelistentry.h"
  48. #include "llfloatermediasettings.h"
  49. ////////////////////////////////////////////////////////////////////////////////
  50. //
  51. LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() :
  52. mParent( NULL )
  53. {
  54. mCommitCallbackRegistrar.add("Media.whitelistAdd", boost::bind(&LLPanelMediaSettingsSecurity::onBtnAdd, this));
  55. mCommitCallbackRegistrar.add("Media.whitelistDelete", boost::bind(&LLPanelMediaSettingsSecurity::onBtnDel, this));
  56. // build dialog from XML
  57. LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml");
  58. }
  59. ////////////////////////////////////////////////////////////////////////////////
  60. //
  61. BOOL LLPanelMediaSettingsSecurity::postBuild()
  62. {
  63. mEnableWhiteList = getChild< LLCheckBoxCtrl >( LLMediaEntry::WHITELIST_ENABLE_KEY );
  64. mWhiteListList = getChild< LLScrollListCtrl >( LLMediaEntry::WHITELIST_KEY );
  65. mHomeUrlFailsWhiteListText = getChild<LLTextBox>( "home_url_fails_whitelist" );
  66. setDefaultBtn("whitelist_add");
  67. return true;
  68. }
  69. ////////////////////////////////////////////////////////////////////////////////
  70. // virtual
  71. LLPanelMediaSettingsSecurity::~LLPanelMediaSettingsSecurity()
  72. {
  73. }
  74. ////////////////////////////////////////////////////////////////////////////////
  75. // 
  76. void LLPanelMediaSettingsSecurity::draw()
  77. {
  78. // housekeeping
  79. LLPanel::draw();
  80. }
  81. ////////////////////////////////////////////////////////////////////////////////
  82. // static 
  83. void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media_settings , bool editable)
  84. {
  85. LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
  86. std::string base_key( "" );
  87. std::string tentative_key( "" );
  88. struct 
  89. {
  90. std::string key_name;
  91. LLUICtrl* ctrl_ptr;
  92. std::string ctrl_type;
  93. } data_set [] = 
  94. {
  95. { LLMediaEntry::WHITELIST_ENABLE_KEY, self->mEnableWhiteList, "LLCheckBoxCtrl" },
  96. { LLMediaEntry::WHITELIST_KEY, self->mWhiteListList, "LLScrollListCtrl" },
  97. { "", NULL , "" }
  98. };
  99. for( int i = 0; data_set[ i ].key_name.length() > 0; ++i )
  100. {
  101. base_key = std::string( data_set[ i ].key_name );
  102.         tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX );
  103. bool enabled_overridden = false;
  104. // TODO: CP - I bet there is a better way to do this using Boost
  105. if ( media_settings[ base_key ].isDefined() )
  106. {
  107. if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" )
  108. {
  109. static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )->
  110. setValue( media_settings[ base_key ].asBoolean() );
  111. }
  112. else
  113. if ( data_set[ i ].ctrl_type == "LLScrollListCtrl" )
  114. {
  115. // get control 
  116. LLScrollListCtrl* list = static_cast< LLScrollListCtrl* >( data_set[ i ].ctrl_ptr );
  117. list->deleteAllItems();
  118. // points to list of white list URLs
  119. LLSD url_list = media_settings[ base_key ];
  120. // better be the whitelist
  121. llassert(data_set[ i ].ctrl_ptr == self->mWhiteListList);
  122. // If tentative, don't add entries
  123. if (media_settings[ tentative_key ].asBoolean())
  124. {
  125. self->mWhiteListList->setEnabled(false);
  126. enabled_overridden = true;
  127. }
  128. else {
  129. // iterate over them and add to scroll list
  130. LLSD::array_iterator iter = url_list.beginArray();
  131. while( iter != url_list.endArray() )
  132. {
  133. std::string entry = *iter;
  134. self->addWhiteListEntry( entry );
  135. ++iter;
  136. }
  137. }
  138. };
  139. if ( ! enabled_overridden) data_set[ i ].ctrl_ptr->setEnabled(editable);
  140. data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
  141. };
  142. };
  143. // initial update - hides/shows status messages etc.
  144. self->updateWhitelistEnableStatus();
  145. }
  146. ////////////////////////////////////////////////////////////////////////////////
  147. // static 
  148. void LLPanelMediaSettingsSecurity::clearValues( void* userdata , bool editable)
  149. {
  150. LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
  151. self->mEnableWhiteList->clear();
  152. self->mWhiteListList->deleteAllItems();
  153. self->mEnableWhiteList->setEnabled(editable);
  154. self->mWhiteListList->setEnabled(editable);
  155. }
  156. ////////////////////////////////////////////////////////////////////////////////
  157. // 
  158. void LLPanelMediaSettingsSecurity::preApply()
  159. {
  160. // no-op
  161. }
  162. ////////////////////////////////////////////////////////////////////////////////
  163. //
  164. void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in, bool include_tentative )
  165. {
  166.     if (include_tentative || !mEnableWhiteList->getTentative()) 
  167. fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = (LLSD::Boolean)mEnableWhiteList->getValue();
  168. if (include_tentative || !mWhiteListList->getTentative())
  169. {
  170. // iterate over white list and extract items
  171. std::vector< LLScrollListItem* > whitelist_items = mWhiteListList->getAllData();
  172. std::vector< LLScrollListItem* >::iterator iter = whitelist_items.begin();
  173. // *NOTE: need actually set the key to be an emptyArray(), or the merge
  174. // we do with this LLSD will think there's nothing to change.
  175. fill_me_in[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray();
  176. while( iter != whitelist_items.end() )
  177. {
  178. LLScrollListCell* cell = (*iter)->getColumn( ENTRY_COLUMN );
  179. std::string whitelist_url = cell->getValue().asString();
  180. fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( whitelist_url );
  181. ++iter;
  182. };
  183. }
  184. }
  185. ////////////////////////////////////////////////////////////////////////////////
  186. // 
  187. void LLPanelMediaSettingsSecurity::postApply()
  188. {
  189. // no-op
  190. }
  191. ///////////////////////////////////////////////////////////////////////////////
  192. // Try to make a valid URL if a fragment (
  193. // white list list box widget and build a list to test against. Can also
  194. const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string& src_url )
  195. {
  196. // use LLURI to determine if we have a valid scheme
  197. LLURI candidate_url( src_url );
  198. if ( candidate_url.scheme().empty() )
  199. {
  200. // build a URL comprised of default scheme and the original fragment 
  201. const std::string default_scheme( "http://" );
  202. return default_scheme + src_url;
  203. };
  204. // we *could* test the "default scheme" + "original fragment" URL again
  205. // using LLURI to see if it's valid but I think the outcome is the same
  206. // in either case - our only option is to return the original URL
  207. // we *think* the original url passed in was valid
  208. return src_url;
  209. }
  210. ///////////////////////////////////////////////////////////////////////////////
  211. // wrapper for testing a URL against the whitelist. We grab entries from
  212. // white list list box widget and build a list to test against. 
  213. bool LLPanelMediaSettingsSecurity::urlPassesWhiteList( const std::string& test_url )
  214. {
  215. // If the whitlelist list is tentative, it means we have multiple settings.
  216. // In that case, we have no choice but to return true
  217. if ( mWhiteListList->getTentative() ) return true;
  218. // the checkUrlAgainstWhitelist(..) function works on a vector
  219. // of strings for the white list entries - in this panel, the white list
  220. // is stored in the widgets themselves so we need to build something compatible.
  221. std::vector< std::string > whitelist_strings;
  222. whitelist_strings.clear(); // may not be required - I forget what the spec says.
  223. // step through whitelist widget entries and grab them as strings
  224.     std::vector< LLScrollListItem* > whitelist_items = mWhiteListList->getAllData();
  225.     std::vector< LLScrollListItem* >::iterator iter = whitelist_items.begin(); 
  226. while( iter != whitelist_items.end()  )
  227.     {
  228. LLScrollListCell* cell = (*iter)->getColumn( ENTRY_COLUMN );
  229. std::string whitelist_url = cell->getValue().asString();
  230. whitelist_strings.push_back( whitelist_url );
  231. ++iter;
  232.     };
  233. // possible the URL is just a fragment so we validize it
  234. const std::string valid_url = makeValidUrl( test_url );
  235. // indicate if the URL passes whitelist
  236. return LLMediaEntry::checkUrlAgainstWhitelist( valid_url, whitelist_strings );
  237. }
  238. ///////////////////////////////////////////////////////////////////////////////
  239. //
  240. void LLPanelMediaSettingsSecurity::updateWhitelistEnableStatus()
  241. {
  242. // get the value for home URL and make it a valid URL
  243. const std::string valid_url = makeValidUrl( mParent->getHomeUrl() );
  244. // now check to see if the home url passes the whitelist in its entirity 
  245. if ( urlPassesWhiteList( valid_url ) )
  246. {
  247. mEnableWhiteList->setEnabled( true );
  248. mHomeUrlFailsWhiteListText->setVisible( false );
  249. }
  250. else
  251. {
  252. mEnableWhiteList->set( false );
  253. mEnableWhiteList->setEnabled( false );
  254. mHomeUrlFailsWhiteListText->setVisible( true );
  255. };
  256. }
  257. ///////////////////////////////////////////////////////////////////////////////
  258. // Add an entry to the whitelist scrollbox and indicate if the current
  259. // home URL passes this entry or not using an icon
  260. void LLPanelMediaSettingsSecurity::addWhiteListEntry( const std::string& entry )
  261. {
  262. // grab the home url
  263. std::string home_url( "" );
  264. if ( mParent )
  265. home_url = mParent->getHomeUrl();
  266. // try to make a valid URL based on what the user entered - missing scheme for example
  267. const std::string valid_url = makeValidUrl( home_url );
  268. // check the home url against this single whitelist entry
  269. std::vector< std::string > whitelist_entries;
  270. whitelist_entries.push_back( entry );
  271. bool home_url_passes_entry = LLMediaEntry::checkUrlAgainstWhitelist( valid_url, whitelist_entries );
  272. // build an icon cell based on whether or not the home url pases it or not
  273. LLSD row;
  274. if ( home_url_passes_entry || home_url.empty() )
  275. {
  276. row[ "columns" ][ ICON_COLUMN ][ "type" ] = "icon";
  277. row[ "columns" ][ ICON_COLUMN ][ "value" ] = "";
  278. row[ "columns" ][ ICON_COLUMN ][ "width" ] = 20;
  279. }
  280. else
  281. {
  282. row[ "columns" ][ ICON_COLUMN ][ "type" ] = "icon";
  283. row[ "columns" ][ ICON_COLUMN ][ "value" ] = "Parcel_Exp_Color";
  284. row[ "columns" ][ ICON_COLUMN ][ "width" ] = 20;
  285. };
  286. // always add in the entry itself
  287. row[ "columns" ][ ENTRY_COLUMN ][ "type" ] = "text";
  288. row[ "columns" ][ ENTRY_COLUMN ][ "value" ] = entry;
  289. // add to the white list scroll box
  290. mWhiteListList->addElement( row );
  291. };
  292. ///////////////////////////////////////////////////////////////////////////////
  293. // static
  294. void LLPanelMediaSettingsSecurity::onBtnAdd( void* userdata )
  295. {
  296. LLFloaterReg::showInstance("whitelist_entry");
  297. }
  298. ///////////////////////////////////////////////////////////////////////////////
  299. // static
  300. void LLPanelMediaSettingsSecurity::onBtnDel( void* userdata )
  301. {
  302. LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
  303. self->mWhiteListList->deleteSelectedItems();
  304. // contents of whitelist changed so recheck it against home url
  305. self->updateWhitelistEnableStatus();
  306. }
  307. ////////////////////////////////////////////////////////////////////////////////
  308. //
  309. void LLPanelMediaSettingsSecurity::setParent( LLFloaterMediaSettings* parent )
  310. {
  311. mParent = parent;
  312. };