diff options
| author | callum_linden <none@none> | 2018-01-17 16:13:19 -0800 | 
|---|---|---|
| committer | callum_linden <none@none> | 2018-01-17 16:13:19 -0800 | 
| commit | d3f544d39d204c60c6112f0ba4abd906ac28481a (patch) | |
| tree | 97a2c7c1685dae832e2be76891332abbae5293ae | |
| parent | e84e4a1adf29b3a807c9d0c0e4841b5f12ea9756 (diff) | |
Fixes for 'MAINT-8196 Remove LLPluginCookieStore from the viewer' and 'MAINT-8194 Remove per-frame calls to updateJavascriptObject()'
| -rw-r--r-- | indra/llplugin/CMakeLists.txt | 19 | ||||
| -rw-r--r-- | indra/llplugin/llpluginclassmedia.cpp | 18 | ||||
| -rw-r--r-- | indra/llplugin/llpluginclassmedia.h | 2 | ||||
| -rw-r--r-- | indra/llplugin/llpluginclassmediaowner.h | 28 | ||||
| -rw-r--r-- | indra/llplugin/llplugincookiestore.cpp | 689 | ||||
| -rw-r--r-- | indra/llplugin/llplugincookiestore.h | 123 | ||||
| -rw-r--r-- | indra/llplugin/tests/llplugincookiestore_test.cpp | 207 | ||||
| -rw-r--r-- | indra/media_plugins/cef/media_plugin_cef.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llappviewer.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llfloaterfacebook.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llfloaterflickr.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llfloatertwitter.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llstartup.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llviewermedia.cpp | 237 | ||||
| -rw-r--r-- | indra/newview/llviewermedia.h | 10 | ||||
| -rw-r--r-- | indra/newview/llwebprofile.cpp | 1 | 
16 files changed, 29 insertions, 1336 deletions
| diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt index 129efeb529..5cc129a267 100644 --- a/indra/llplugin/CMakeLists.txt +++ b/indra/llplugin/CMakeLists.txt @@ -29,7 +29,6 @@ include_directories(SYSTEM  set(llplugin_SOURCE_FILES      llpluginclassmedia.cpp -    llplugincookiestore.cpp      llplugininstance.cpp      llpluginmessage.cpp      llpluginmessagepipe.cpp @@ -43,7 +42,6 @@ set(llplugin_HEADER_FILES      llpluginclassmedia.h      llpluginclassmediaowner.h -    llplugincookiestore.h      llplugininstance.h      llpluginmessage.h      llpluginmessageclasses.h @@ -70,20 +68,3 @@ add_library (llplugin ${llplugin_SOURCE_FILES})  add_subdirectory(slplugin) -# Add tests -if (LL_TESTS) -    include(LLAddBuildTest) -    # UNIT TESTS -    SET(llplugin_TEST_SOURCE_FILES -      llplugincookiestore.cpp -      ) - -    # llplugincookiestore has a dependency on curl, so we need to link the curl library into the test. -    set_source_files_properties( -      llplugincookiestore.cpp -      PROPERTIES -        LL_TEST_ADDITIONAL_LIBRARIES "${CURL_LIBRARIES};${NGHTTP2_LIBRARIES}" -      ) - -    LL_ADD_PROJECT_UNIT_TESTS(llplugin "${llplugin_TEST_SOURCE_FILES}") -endif (LL_TESTS) diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 9d275c5eeb..a857ff0153 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -1179,13 +1179,6 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  			mStatusCode = message.getValueS32("status_code");  			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_ERROR_PAGE);  		} -		else if(message_name == "cookie_set") -		{ -			if(mOwner) -			{ -				mOwner->handleCookieSet(this, message.getValue("cookie")); -			} -		}  		else if(message_name == "close_request")  		{  			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLOSE_REQUEST); @@ -1300,16 +1293,9 @@ void LLPluginClassMedia::clear_cookies()  	sendMessage(message);  } -void LLPluginClassMedia::set_cookies(const std::string &cookies) -{ -	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_cookies"); -	message.setValue("cookies", cookies); -	sendMessage(message); -} - -void LLPluginClassMedia::enable_cookies(bool enable) +void LLPluginClassMedia::cookies_enabled(bool enable)  { -	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "enable_cookies"); +	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "cookies_enabled");  	message.setValueBoolean("enable", enable);  	sendMessage(message);  } diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index 98c48cd987..dcd8af4e06 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -210,7 +210,7 @@ public:  	void clear_cache();  	void clear_cookies();  	void set_cookies(const std::string &cookies); -	void enable_cookies(bool enable); +	void cookies_enabled(bool enable);  	void proxy_setup(bool enable, const std::string &host = LLStringUtil::null, int port = 0);  	void browse_stop();  	void browse_reload(bool ignore_cache = false); diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h index 391c23d883..89f55eaf71 100644 --- a/indra/llplugin/llpluginclassmediaowner.h +++ b/indra/llplugin/llpluginclassmediaowner.h @@ -1,4 +1,4 @@ -/**  +/**   * @file llpluginclassmediaowner.h   * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.   * @@ -6,21 +6,21 @@   * $LicenseInfo:firstyear=2008&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2010, Linden Research, Inc. - *  + *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public   * License as published by the Free Software Foundation;   * version 2.1 of the License only. - *  + *   * This library is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   * Lesser General Public License for more details. - *  + *   * You should have received a copy of the GNU Lesser General Public   * License along with this library; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  + *   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   * @endcond @@ -34,18 +34,17 @@  #include <queue>  class LLPluginClassMedia; -class LLPluginCookieStore;  class LLPluginClassMediaOwner  {  public:  	typedef enum  	{ -		MEDIA_EVENT_CONTENT_UPDATED,		// contents/dirty rect have updated  +		MEDIA_EVENT_CONTENT_UPDATED,		// contents/dirty rect have updated  		MEDIA_EVENT_TIME_DURATION_UPDATED,	// current time and/or duration have updated  		MEDIA_EVENT_SIZE_CHANGED,			// media size has changed  		MEDIA_EVENT_CURSOR_CHANGED,			// plugin has requested a cursor change -		 +  		MEDIA_EVENT_NAVIGATE_BEGIN,			// browser has begun navigation  		MEDIA_EVENT_NAVIGATE_COMPLETE,		// browser has finished navigation  		MEDIA_EVENT_PROGRESS_UPDATED,		// browser has updated loading progress @@ -58,8 +57,8 @@ public:  		MEDIA_EVENT_CLOSE_REQUEST,			// The plugin requested its window be closed (currently hooked up to javascript window.close in webkit)  		MEDIA_EVENT_PICK_FILE_REQUEST,		// The plugin wants the user to pick a file  		MEDIA_EVENT_GEOMETRY_CHANGE,		// The plugin requested its window geometry be changed (per the javascript window interface) -	 -		MEDIA_EVENT_PLUGIN_FAILED_LAUNCH,	// The plugin failed to launch  + +		MEDIA_EVENT_PLUGIN_FAILED_LAUNCH,	// The plugin failed to launch  		MEDIA_EVENT_PLUGIN_FAILED,			// The plugin died unexpectedly  		MEDIA_EVENT_AUTH_REQUEST,			// The plugin wants to display an auth dialog @@ -69,9 +68,9 @@ public:  		MEDIA_EVENT_DEBUG_MESSAGE,			// plugin sending back debug information for host to process  		MEDIA_EVENT_LINK_HOVERED			// Got a "link hovered" event from the plugin -		 +  	} EMediaEvent; -	 +  	typedef enum  	{  		MEDIA_NONE,			// Uninitialized -- no useful state @@ -81,12 +80,11 @@ public:  		MEDIA_PLAYING,		// playing (only for time-based media)  		MEDIA_PAUSED,		// paused (only for time-based media)  		MEDIA_DONE			// finished playing (only for time-based media) -	 +  	} EMediaStatus; -	 +  	virtual ~LLPluginClassMediaOwner() {};  	virtual void handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent /*event*/) {}; -	virtual void handleCookieSet(LLPluginClassMedia* /*self*/, const std::string &/*cookie*/) {};  };  #endif // LL_LLPLUGINCLASSMEDIAOWNER_H diff --git a/indra/llplugin/llplugincookiestore.cpp b/indra/llplugin/llplugincookiestore.cpp deleted file mode 100644 index a5d717389d..0000000000 --- a/indra/llplugin/llplugincookiestore.cpp +++ /dev/null @@ -1,689 +0,0 @@ -/**  - * @file llplugincookiestore.cpp - * @brief LLPluginCookieStore provides central storage for http cookies used by plugins - * - * @cond - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - * @endcond - */ - -#include "linden_common.h" -#include "llstl.h" -#include "indra_constants.h" - -#include "llplugincookiestore.h" -#include <iostream> - -// for curl_getdate() (apparently parsing RFC 1123 dates is hard) -#include <curl/curl.h> - -LLPluginCookieStore::LLPluginCookieStore(): -	mHasChangedCookies(false) -{ -} - - -LLPluginCookieStore::~LLPluginCookieStore() -{ -	clearCookies(); -} - - -LLPluginCookieStore::Cookie::Cookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end): -	mCookie(s, cookie_start, cookie_end - cookie_start), -	mNameStart(0), mNameEnd(0), -	mValueStart(0), mValueEnd(0), -	mDomainStart(0), mDomainEnd(0), -	mPathStart(0), mPathEnd(0), -	mDead(false), mChanged(true) -{ -} - -LLPluginCookieStore::Cookie *LLPluginCookieStore::Cookie::createFromString(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, const std::string &host) -{ -	Cookie *result = new Cookie(s, cookie_start, cookie_end); - -	if(!result->parse(host)) -	{ -		delete result; -		result = NULL; -	} -	 -	return result; -} - -std::string LLPluginCookieStore::Cookie::getKey() const -{ -	std::string result; -	if(mDomainEnd > mDomainStart) -	{ -		result += mCookie.substr(mDomainStart, mDomainEnd - mDomainStart); -	} -	result += ';'; -	if(mPathEnd > mPathStart) -	{ -		result += mCookie.substr(mPathStart, mPathEnd - mPathStart); -	} -	result += ';'; -	result += mCookie.substr(mNameStart, mNameEnd - mNameStart); -	return result; -} - -std::string LLPluginCookieStore::Cookie::getDomain() const -{ -	std::string result; -	if(mDomainEnd > mDomainStart) -	{ -		result += mCookie.substr(mDomainStart, mDomainEnd - mDomainStart); -	} -	return result; -} - -bool LLPluginCookieStore::Cookie::parse(const std::string &host) -{ -	bool first_field = true; - -	std::string::size_type cookie_end = mCookie.size(); -	std::string::size_type field_start = 0; - -	LL_DEBUGS("CookieStoreParse") << "parsing cookie: " << mCookie << LL_ENDL; -	while(field_start < cookie_end) -	{ -		// Finding the start of the next field requires honoring special quoting rules -		// see the definition of 'quoted-string' in rfc2616 for details -		std::string::size_type next_field_start = findFieldEnd(field_start); - -		// The end of this field should not include the terminating ';' or any trailing whitespace -		std::string::size_type field_end = mCookie.find_last_not_of("; ", next_field_start); -		if(field_end == std::string::npos || field_end < field_start) -		{ -			// This field was empty or all whitespace.  Set end = start so it shows as empty. -			field_end = field_start; -		} -		else if (field_end < next_field_start) -		{ -			// we actually want the index of the char _after_ what 'last not of' found -			++field_end; -		} -		 -		// find the start of the actual name (skip separator and possible whitespace) -		std::string::size_type name_start = mCookie.find_first_not_of("; ", field_start); -		if(name_start == std::string::npos || name_start > next_field_start) -		{ -			// Again, nothing but whitespace. -			name_start = field_start; -		} -		 -		// the name and value are separated by the first equals sign -		std::string::size_type name_value_sep = mCookie.find_first_of("=", name_start); -		if(name_value_sep == std::string::npos || name_value_sep > field_end) -		{ -			// No separator found, so this is a field without an =  -			name_value_sep = field_end; -		} -		 -		// the name end is before the name-value separator -		std::string::size_type name_end = mCookie.find_last_not_of("= ", name_value_sep); -		if(name_end == std::string::npos || name_end < name_start) -		{ -			// I'm not sure how we'd hit this case... it seems like it would have to be an empty name. -			name_end = name_start; -		} -		else if (name_end < name_value_sep) -		{ -			// we actually want the index of the char _after_ what 'last not of' found -			++name_end; -		} -		 -		// Value is between the name-value sep and the end of the field. -		std::string::size_type value_start = mCookie.find_first_not_of("= ", name_value_sep); -		if(value_start == std::string::npos || value_start > field_end) -		{ -			// All whitespace or empty value -			value_start = field_end; -		} -		std::string::size_type value_end = mCookie.find_last_not_of("; ", field_end); -		if(value_end == std::string::npos || value_end < value_start) -		{ -			// All whitespace or empty value -			value_end = value_start; -		} -		else if (value_end < field_end) -		{ -			// we actually want the index of the char _after_ what 'last not of' found -			++value_end; -		} - -		LL_DEBUGS("CookieStoreParse")  -			<< "    field name: \"" << mCookie.substr(name_start, name_end - name_start)  -			<< "\", value: \"" << mCookie.substr(value_start, value_end - value_start) << "\"" -			<< LL_ENDL; -				 -		// See whether this field is one we know -		if(first_field) -		{ -			// The first field is the name=value pair -			mNameStart = name_start; -			mNameEnd = name_end; -			mValueStart = value_start; -			mValueEnd = value_end; -			first_field = false; -		} -		else -		{ -			// Subsequent fields must come from the set in rfc2109 -			if(matchName(name_start, name_end, "expires")) -			{ -				std::string date_string(mCookie, value_start, value_end - value_start);  -				// If the cookie contains an "expires" field, it MUST contain a parsable date. -				 -				// HACK: LLDate apparently can't PARSE an rfc1123-format date, even though it can GENERATE one. -				//  The curl function curl_getdate can do this, but I'm hesitant to unilaterally introduce a curl dependency in LLDate. -#if 1 -				time_t date = curl_getdate(date_string.c_str(), NULL ); -				mDate.secondsSinceEpoch((F64)date); -				LL_DEBUGS("CookieStoreParse") << "        expire date parsed to: " << mDate.asRFC1123() << LL_ENDL; -#else -				// This doesn't work (rfc1123-format dates cause it to fail) -				if(!mDate.fromString(date_string)) -				{ -					// Date failed to parse. -					LL_WARNS("CookieStoreParse") << "failed to parse cookie's expire date: " << date << LL_ENDL; -					return false; -				} -#endif -			} -			else if(matchName(name_start, name_end, "domain")) -			{ -				mDomainStart = value_start; -				mDomainEnd = value_end; -			} -			else if(matchName(name_start, name_end, "path")) -			{ -				mPathStart = value_start; -				mPathEnd = value_end; -			} -			else if(matchName(name_start, name_end, "max-age")) -			{ -				// TODO: how should we handle this? -			} -			else if(matchName(name_start, name_end, "secure")) -			{ -				// We don't care about the value of this field (yet) -			} -			else if(matchName(name_start, name_end, "version")) -			{ -				// We don't care about the value of this field (yet) -			} -			else if(matchName(name_start, name_end, "comment")) -			{ -				// We don't care about the value of this field (yet) -			} -			else if(matchName(name_start, name_end, "httponly")) -			{ -				// We don't care about the value of this field (yet) -			} -			else -			{ -				// An unknown field is a parse failure -				LL_WARNS("CookieStoreParse") << "unexpected field name: " << mCookie.substr(name_start, name_end - name_start) << LL_ENDL; -				return false; -			} -			 -		} - -		 -		// move on to the next field, skipping this field's separator and any leading whitespace -		field_start = mCookie.find_first_not_of("; ", next_field_start); -	} -		 -	// The cookie MUST have a name -	if(mNameEnd <= mNameStart) -		return false; -	 -	// If the cookie doesn't have a domain, add the current host as the domain. -	if(mDomainEnd <= mDomainStart) -	{ -		if(host.empty()) -		{ -			// no domain and no current host -- this is a parse failure. -			return false; -		} -		 -		// Figure out whether this cookie ended with a ";" or not... -		std::string::size_type last_char = mCookie.find_last_not_of(" "); -		if((last_char != std::string::npos) && (mCookie[last_char] != ';')) -		{ -			mCookie += ";"; -		} -		 -		mCookie += " domain="; -		mDomainStart = mCookie.size(); -		mCookie += host; -		mDomainEnd = mCookie.size(); -		 -		LL_DEBUGS("CookieStoreParse") << "added domain (" << mDomainStart << " to " << mDomainEnd << "), new cookie is: " << mCookie << LL_ENDL; -	} - -	// If the cookie doesn't have a path, add "/". -	if(mPathEnd <= mPathStart) -	{ -		// Figure out whether this cookie ended with a ";" or not... -		std::string::size_type last_char = mCookie.find_last_not_of(" "); -		if((last_char != std::string::npos) && (mCookie[last_char] != ';')) -		{ -			mCookie += ";"; -		} -		 -		mCookie += " path="; -		mPathStart = mCookie.size(); -		mCookie += "/"; -		mPathEnd = mCookie.size(); -		 -		LL_DEBUGS("CookieStoreParse") << "added path (" << mPathStart << " to " << mPathEnd << "), new cookie is: " << mCookie << LL_ENDL; -	} -	 -	 -	return true; -} - -std::string::size_type LLPluginCookieStore::Cookie::findFieldEnd(std::string::size_type start, std::string::size_type end) -{ -	std::string::size_type result = start; -	 -	if(end == std::string::npos) -		end = mCookie.size(); -	 -	bool in_quotes = false; -	for(; (result < end); result++) -	{ -		switch(mCookie[result]) -		{ -			case '\\': -				if(in_quotes) -					result++; // The next character is backslash-quoted.  Skip over it. -			break; -			case '"': -				in_quotes = !in_quotes; -			break; -			case ';': -				if(!in_quotes) -					return result; -			break; -		}		 -	} -	 -	// If we got here, no ';' was found. -	return end; -} - -bool LLPluginCookieStore::Cookie::matchName(std::string::size_type start, std::string::size_type end, const char *name) -{ -	// NOTE: this assumes 'name' is already in lowercase.  The code which uses it should be able to arrange this... -	 -	while((start < end) && (*name != '\0')) -	{ -		if(tolower(mCookie[start]) != *name) -			return false; -			 -		start++; -		name++; -	} -	 -	// iff both strings hit the end at the same time, they're equal. -	return ((start == end) && (*name == '\0')); -} - -std::string LLPluginCookieStore::getAllCookies() -{ -	std::stringstream result; -	writeAllCookies(result); -	return result.str(); -} - -void LLPluginCookieStore::writeAllCookies(std::ostream& s) -{ -	cookie_map_t::iterator iter; -	for(iter = mCookies.begin(); iter != mCookies.end(); iter++) -	{ -		// Don't return expired cookies -		if(!iter->second->isDead()) -		{ -			s << (iter->second->getCookie()) << "\n"; -		} -	} - -} - -std::string LLPluginCookieStore::getPersistentCookies() -{ -	std::stringstream result; -	writePersistentCookies(result); -	return result.str(); -} - -void LLPluginCookieStore::writePersistentCookies(std::ostream& s) -{ -	cookie_map_t::iterator iter; -	for(iter = mCookies.begin(); iter != mCookies.end(); iter++) -	{ -		// Don't return expired cookies or session cookies -		if(!iter->second->isDead() && !iter->second->isSessionCookie()) -		{ -			s << iter->second->getCookie() << "\n"; -		} -	} -} - -std::string LLPluginCookieStore::getChangedCookies(bool clear_changed) -{ -	std::stringstream result; -	writeChangedCookies(result, clear_changed); -	 -	return result.str(); -} - -void LLPluginCookieStore::writeChangedCookies(std::ostream& s, bool clear_changed) -{ -	if(mHasChangedCookies) -	{ -		LL_DEBUGS() << "returning changed cookies: " << LL_ENDL; -		cookie_map_t::iterator iter; -		for(iter = mCookies.begin(); iter != mCookies.end(); ) -		{ -			cookie_map_t::iterator next = iter; -			next++; -			 -			// Only return cookies marked as "changed" -			if(iter->second->isChanged()) -			{ -				s << iter->second->getCookie() << "\n"; - -				LL_DEBUGS() << "    " << iter->second->getCookie() << LL_ENDL; - -				// If requested, clear the changed mark -				if(clear_changed) -				{ -					if(iter->second->isDead()) -					{ -						// If this cookie was previously marked dead, it needs to be removed entirely.	 -						delete iter->second; -						mCookies.erase(iter); -					} -					else -					{ -						// Not dead, just mark as not changed. -						iter->second->setChanged(false); -					} -				} -			} -			 -			iter = next; -		} -	} -	 -	if(clear_changed) -		mHasChangedCookies = false; -} - -void LLPluginCookieStore::setAllCookies(const std::string &cookies, bool mark_changed) -{ -	clearCookies(); -	setCookies(cookies, mark_changed); -} - -void LLPluginCookieStore::readAllCookies(std::istream& s, bool mark_changed) -{ -	clearCookies(); -	readCookies(s, mark_changed); -} -	 -void LLPluginCookieStore::setCookies(const std::string &cookies, bool mark_changed) -{ -	std::string::size_type start = 0; - -	while(start != std::string::npos) -	{ -		std::string::size_type end = cookies.find_first_of("\r\n", start); -		if(end > start) -		{ -			// The line is non-empty.  Try to create a cookie from it. -			setOneCookie(cookies, start, end, mark_changed); -		} -		start = cookies.find_first_not_of("\r\n ", end); -	} -} - -void LLPluginCookieStore::setCookiesFromHost(const std::string &cookies, const std::string &host, bool mark_changed) -{ -	std::string::size_type start = 0; - -	while(start != std::string::npos) -	{ -		std::string::size_type end = cookies.find_first_of("\r\n", start); -		if(end > start) -		{ -			// The line is non-empty.  Try to create a cookie from it. -			setOneCookie(cookies, start, end, mark_changed, host); -		} -		start = cookies.find_first_not_of("\r\n ", end); -	} -} -			 -void LLPluginCookieStore::readCookies(std::istream& s, bool mark_changed) -{ -	std::string line; -	while(s.good() && !s.eof()) -	{ -		std::getline(s, line); -		if(!line.empty()) -		{ -			// Try to create a cookie from this line. -			setOneCookie(line, 0, std::string::npos, mark_changed); -		} -	} -} - -std::string LLPluginCookieStore::quoteString(const std::string &s) -{ -	std::stringstream result; -	 -	result << '"'; -	 -	for(std::string::size_type i = 0; i < s.size(); ++i) -	{ -		char c = s[i]; -		switch(c) -		{ -			// All these separators need to be quoted in HTTP headers, according to section 2.2 of rfc 2616: -			case '(': case ')': case '<': case '>': case '@': -			case ',': case ';': case ':': case '\\': case '"': -			case '/': case '[': case ']': case '?': case '=': -			case '{': case '}':	case ' ': case '\t': -				result << '\\'; -			break; -		} -		 -		result << c; -	} -	 -	result << '"'; -	 -	return result.str(); -} - -std::string LLPluginCookieStore::unquoteString(const std::string &s) -{ -	std::stringstream result; -	 -	bool in_quotes = false; -	 -	for(std::string::size_type i = 0; i < s.size(); ++i) -	{ -		char c = s[i]; -		switch(c) -		{ -			case '\\': -				if(in_quotes) -				{ -					// The next character is backslash-quoted.  Pass it through untouched. -					++i;  -					if(i < s.size()) -					{ -						result << s[i]; -					} -					continue; -				} -			break; -			case '"': -				in_quotes = !in_quotes; -				continue; -			break; -		} -		 -		result << c; -	} -	 -	return result.str(); -} - -// The flow for deleting a cookie is non-obvious enough that I should call it out here... -// Deleting a cookie is done by setting a cookie with the same name, path, and domain, but with an expire timestamp in the past. -// (This is exactly how a web server tells a browser to delete a cookie.) -// When deleting with mark_changed set to true, this replaces the existing cookie in the list with an entry that's marked both dead and changed. -// Some time later when writeChangedCookies() is called with clear_changed set to true, the dead cookie is deleted from the list after being returned, so that the -// delete operation (in the form of the expired cookie) is passed along. -void LLPluginCookieStore::setOneCookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, bool mark_changed, const std::string &host) -{ -	Cookie *cookie = Cookie::createFromString(s, cookie_start, cookie_end, host); -	if(cookie) -	{ -		LL_DEBUGS("CookieStoreUpdate") << "setting cookie: " << cookie->getCookie() << LL_ENDL; -		 -		// Create a key for this cookie -		std::string key = cookie->getKey(); -		 -		// Check to see whether this cookie should have expired -		if(!cookie->isSessionCookie() && (cookie->getDate() < LLDate::now())) -		{ -			// This cookie has expired. -			if(mark_changed) -			{ -				// If we're marking cookies as changed, we should keep it anyway since we'll need to send it out with deltas. -				cookie->setDead(true); -				LL_DEBUGS("CookieStoreUpdate") << "    marking dead" << LL_ENDL; -			} -			else -			{ -				// If we're not marking cookies as changed, we don't need to keep this cookie at all. -				// If the cookie was already in the list, delete it. -				removeCookie(key); - -				delete cookie; -				cookie = NULL; - -				LL_DEBUGS("CookieStoreUpdate") << "    removing" << LL_ENDL; -			} -		} -		 -		if(cookie) -		{ -			// If it already exists in the map, replace it. -			cookie_map_t::iterator iter = mCookies.find(key); -			if(iter != mCookies.end()) -			{ -				if(iter->second->getCookie() == cookie->getCookie()) -				{ -					// The new cookie is identical to the old -- don't mark as changed. -					// Just leave the old one in the map. -					delete cookie; -					cookie = NULL; - -					LL_DEBUGS("CookieStoreUpdate") << "    unchanged" << LL_ENDL; -				} -				else -				{ -					// A matching cookie was already in the map.  Replace it. -					delete iter->second; -					iter->second = cookie; -					 -					cookie->setChanged(mark_changed); -					if(mark_changed) -						mHasChangedCookies = true; - -					LL_DEBUGS("CookieStoreUpdate") << "    replacing" << LL_ENDL; -				} -			} -			else -			{ -				// The cookie wasn't in the map.  Insert it. -				mCookies.insert(std::make_pair(key, cookie)); -				 -				cookie->setChanged(mark_changed); -				if(mark_changed) -					mHasChangedCookies = true; - -				LL_DEBUGS("CookieStoreUpdate") << "    adding" << LL_ENDL; -			} -		} -	} -	else -	{ -		LL_WARNS("CookieStoreUpdate") << "failed to parse cookie: " << s.substr(cookie_start, cookie_end - cookie_start) << LL_ENDL; -	} - -} - -void LLPluginCookieStore::clearCookies() -{ -	std::for_each(mCookies.begin(), mCookies.end(), DeletePairedPointer()); -	mCookies.clear(); -} - -void LLPluginCookieStore::removeCookie(const std::string &key) -{ -	cookie_map_t::iterator iter = mCookies.find(key); -	if(iter != mCookies.end()) -	{ -		delete iter->second; -		mCookies.erase(iter); -	} -} - -void LLPluginCookieStore::removeCookiesByDomain(const std::string &domain) -{ -	cookie_map_t::iterator iter = mCookies.begin(); -	while(iter != mCookies.end()) -	{  -		if(iter->second->getDomain() == domain) -		{ -            cookie_map_t::iterator doErase = iter; -            iter++; -			delete doErase->second; -			mCookies.erase(doErase); -		} -        else -        { -            iter++; -        } -	} -} diff --git a/indra/llplugin/llplugincookiestore.h b/indra/llplugin/llplugincookiestore.h deleted file mode 100644 index a2fdeab647..0000000000 --- a/indra/llplugin/llplugincookiestore.h +++ /dev/null @@ -1,123 +0,0 @@ -/**  - * @file llplugincookiestore.h - * @brief LLPluginCookieStore provides central storage for http cookies used by plugins - * - * @cond - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - * @endcond - */ - -#ifndef LL_LLPLUGINCOOKIESTORE_H -#define LL_LLPLUGINCOOKIESTORE_H - -#include "lldate.h" -#include <map> -#include <string> -#include <iostream> - -class LLPluginCookieStore -{ -	LOG_CLASS(LLPluginCookieStore); -public: -	LLPluginCookieStore(); -	~LLPluginCookieStore(); - -	// gets all cookies currently in storage -- use when initializing a plugin -	std::string getAllCookies(); -	void writeAllCookies(std::ostream& s); -	 -	// gets only persistent cookies (i.e. not session cookies) -- use when writing cookies to a file -	std::string getPersistentCookies(); -	void writePersistentCookies(std::ostream& s); -	 -	// gets cookies which are marked as "changed" -- use when sending periodic updates to plugins -	std::string getChangedCookies(bool clear_changed = true); -	void writeChangedCookies(std::ostream& s, bool clear_changed = true); -	 -	// (re)initializes internal data structures and bulk-sets cookies -- use when reading cookies from a file -	void setAllCookies(const std::string &cookies, bool mark_changed = false); -	void readAllCookies(std::istream& s, bool mark_changed = false); -	 -	// sets one or more cookies (without reinitializing anything) -- use when receiving cookies from a plugin -	void setCookies(const std::string &cookies, bool mark_changed = true); -	void readCookies(std::istream& s, bool mark_changed = true); - -	// sets one or more cookies (without reinitializing anything), supplying a hostname the cookies came from -- use when setting a cookie manually -	void setCookiesFromHost(const std::string &cookies, const std::string &host, bool mark_changed = true); - -	// quote or unquote a string as per the definition of 'quoted-string' in rfc2616 -	static std::string quoteString(const std::string &s); -	static std::string unquoteString(const std::string &s); - -	void removeCookiesByDomain(const std::string &domain); -	 -private: - -	void setOneCookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, bool mark_changed, const std::string &host = LLStringUtil::null); - -	class Cookie -	{ -	public: -		static Cookie *createFromString(const std::string &s, std::string::size_type cookie_start = 0, std::string::size_type cookie_end = std::string::npos, const std::string &host = LLStringUtil::null); -		 -		// Construct a string from the cookie that uniquely represents it, to be used as a key in a std::map. -		std::string getKey() const; -		std::string getDomain() const; -		 -		const std::string &getCookie() const { return mCookie; }; -		bool isSessionCookie() const { return mDate.isNull(); }; - -		bool isDead() const { return mDead; }; -		void setDead(bool dead) { mDead = dead; }; -		 -		bool isChanged() const { return mChanged; }; -		void setChanged(bool changed) { mChanged = changed; }; - -		const LLDate &getDate() const { return mDate; }; -		 -	private: -		Cookie(const std::string &s, std::string::size_type cookie_start = 0, std::string::size_type cookie_end = std::string::npos); -		bool parse(const std::string &host); -		std::string::size_type findFieldEnd(std::string::size_type start = 0, std::string::size_type end = std::string::npos); -		bool matchName(std::string::size_type start, std::string::size_type end, const char *name); -		 -		std::string mCookie;	// The full cookie, in RFC 2109 string format -		LLDate mDate;			// The expiration date of the cookie.  For session cookies, this will be a null date (mDate.isNull() is true). -		// Start/end indices of various parts of the cookie string.  Stored as indices into the string to save space and time. -		std::string::size_type mNameStart, mNameEnd; -		std::string::size_type mValueStart, mValueEnd; -		std::string::size_type mDomainStart, mDomainEnd; -		std::string::size_type mPathStart, mPathEnd; -		bool mDead; -		bool mChanged; -	}; -	 -	typedef std::map<std::string, Cookie*> cookie_map_t; -	 -	cookie_map_t mCookies; -	bool mHasChangedCookies; -	 -	void clearCookies(); -	void removeCookie(const std::string &key); -}; - -#endif // LL_LLPLUGINCOOKIESTORE_H diff --git a/indra/llplugin/tests/llplugincookiestore_test.cpp b/indra/llplugin/tests/llplugincookiestore_test.cpp deleted file mode 100644 index c2cb236cba..0000000000 --- a/indra/llplugin/tests/llplugincookiestore_test.cpp +++ /dev/null @@ -1,207 +0,0 @@ -/**  - * @file llplugincookiestore_test.cpp - * @brief Unit tests for LLPluginCookieStore. - * - * @cond - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - * @endcond - */ - -#include "linden_common.h" -#include <list> -#include "../test/lltut.h" - -#include "../llplugincookiestore.h" - - -namespace tut -{ -	// Main Setup -	struct LLPluginCookieStoreFixture -	{ -		LLPluginCookieStoreFixture() -		{ -			// We need dates definitively in the past and the future to properly test cookie expiration. -			LLDate now = LLDate::now();  -			LLDate past(now.secondsSinceEpoch() - (60.0 * 60.0 * 24.0));	// 1 day in the past -			LLDate future(now.secondsSinceEpoch() + (60.0 * 60.0 * 24.0));	// 1 day in the future -			 -			mPastString = past.asRFC1123(); -			mFutureString = future.asRFC1123(); -		} -		 -		std::string mPastString; -		std::string mFutureString; -		LLPluginCookieStore mCookieStore; -		 -		// List of cookies used for validation -		std::list<std::string> mCookies; -		 -		// This sets up mCookies from a string returned by one of the functions in LLPluginCookieStore -		void setCookies(const std::string &cookies) -		{ -			mCookies.clear(); -			std::string::size_type start = 0; - -			while(start != std::string::npos) -			{ -				std::string::size_type end = cookies.find_first_of("\r\n", start); -				if(end > start) -				{ -					std::string line(cookies, start, end - start); -					if(line.find_first_not_of("\r\n\t ") != std::string::npos) -					{ -						// The line has some non-whitespace characters.  Save it to the list. -						mCookies.push_back(std::string(cookies, start, end - start)); -					} -				} -				start = cookies.find_first_not_of("\r\n ", end); -			} -		} -		 -		// This ensures that a cookie matching the one passed is in the list. -		void ensureCookie(const std::string &cookie) -		{ -			std::list<std::string>::iterator iter; -			for(iter = mCookies.begin(); iter != mCookies.end(); iter++) -			{ -				if(*iter == cookie) -				{ -					// Found the cookie -					// TODO: this should do a smarter equality comparison on the two cookies, instead of just a string compare. -					return; -				} -			} -			 -			// Didn't find this cookie -			std::string message = "cookie not found: "; -			message += cookie; -			ensure(message, false); -		} -		 -		// This ensures that the number of cookies in the list matches what's expected. -		void ensureSize(const std::string &message, size_t size) -		{ -			if(mCookies.size() != size) -			{ -				std::stringstream full_message; -				 -				full_message << message << " (expected " << size << ", actual " << mCookies.size() << ")"; -				ensure(full_message.str(), false); -			} -		} -	}; -	 -	typedef test_group<LLPluginCookieStoreFixture> factory; -	typedef factory::object object; -	factory tf("LLPluginCookieStore"); - -	// Tests -	template<> template<> -	void object::test<1>() -	{ -		// Test 1: cookie uniqueness and update lists. -		// Valid, distinct cookies: -		 -		std::string cookie01 = "cookieA=value; domain=example.com; path=/"; -		std::string cookie02 = "cookieB=value; Domain=example.com; Path=/; Max-Age=10; Secure; Version=1; Comment=foo!; HTTPOnly"; // cookie with every supported field, in different cases. -		std::string cookie03 = "cookieA=value; domain=foo.example.com; path=/"; // different domain -		std::string cookie04 = "cookieA=value; domain=example.com; path=/bar/"; // different path -		std::string cookie05 = "cookieC; domain=example.com; path=/"; // empty value -		std::string cookie06 = "cookieD=value; domain=example.com; path=/; expires="; // different name, persistent cookie -		cookie06 += mFutureString; -		 -		mCookieStore.setCookies(cookie01); -		mCookieStore.setCookies(cookie02); -		mCookieStore.setCookies(cookie03); -		mCookieStore.setCookies(cookie04); -		mCookieStore.setCookies(cookie05); -		mCookieStore.setCookies(cookie06); -		 -		// Invalid cookies (these will get parse errors and not be added to the store) - -		std::string badcookie01 = "cookieD=value; domain=example.com; path=/; foo=bar"; // invalid field name -		std::string badcookie02 = "cookieE=value; path=/"; // no domain - -		mCookieStore.setCookies(badcookie01); -		mCookieStore.setCookies(badcookie02); -		 -		// All cookies added so far should have been marked as "changed" -		setCookies(mCookieStore.getChangedCookies()); -		ensureSize("count of changed cookies", 6); -		ensureCookie(cookie01); -		ensureCookie(cookie02); -		ensureCookie(cookie03); -		ensureCookie(cookie04); -		ensureCookie(cookie05); -		ensureCookie(cookie06); -		 -		// Save off the current state of the cookie store (we'll restore it later) -		std::string savedCookies = mCookieStore.getAllCookies(); -		 -		// Test replacing cookies -		std::string cookie01a = "cookieA=newvalue; domain=example.com; path=/";	// updated value -		std::string cookie02a = "cookieB=newvalue; domain=example.com; path=/; expires="; // remove cookie (by setting an expire date in the past) -		cookie02a += mPastString; -		 -		mCookieStore.setCookies(cookie01a); -		mCookieStore.setCookies(cookie02a); - -		// test for getting changed cookies -		setCookies(mCookieStore.getChangedCookies()); -		ensureSize("count of updated cookies", 2); -		ensureCookie(cookie01a); -		ensureCookie(cookie02a); -		 -		// and for the state of the store after getting changed cookies -		setCookies(mCookieStore.getAllCookies()); -		ensureSize("count of valid cookies", 5); -		ensureCookie(cookie01a); -		ensureCookie(cookie03); -		ensureCookie(cookie04); -		ensureCookie(cookie05); -		ensureCookie(cookie06); - -		// Check that only the persistent cookie is returned here -		setCookies(mCookieStore.getPersistentCookies()); -		ensureSize("count of persistent cookies", 1); -		ensureCookie(cookie06); - -		// Restore the cookie store to a previous state and verify -		mCookieStore.setAllCookies(savedCookies); -		 -		// Since setAllCookies defaults to not marking cookies as changed, this list should be empty. -		setCookies(mCookieStore.getChangedCookies()); -		ensureSize("count of changed cookies after restore", 0); - -		// Verify that the restore worked as it should have. -		setCookies(mCookieStore.getAllCookies()); -		ensureSize("count of restored cookies", 6); -		ensureCookie(cookie01); -		ensureCookie(cookie02); -		ensureCookie(cookie03); -		ensureCookie(cookie04); -		ensureCookie(cookie05); -		ensureCookie(cookie06); -	} - -} diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp index b8901e4d5c..67164ca0af 100644 --- a/indra/media_plugins/cef/media_plugin_cef.cpp +++ b/indra/media_plugins/cef/media_plugin_cef.cpp @@ -747,6 +747,10 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  			{  				mCookiesEnabled = message_in.getValueBoolean("enable");  			} +			else if (message_name == "clear_cookies") +			{ +				mCEFLib->deleteAllCookies(); +			}  			else if (message_name == "set_user_agent")  			{  				mUserAgentSubtring = message_in.getValue("user_agent"); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index e827a728ae..d22d0dcf59 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1940,8 +1940,6 @@ bool LLAppViewer::cleanup()  	LLAvatarIconIDCache::getInstance()->save(); -	LLViewerMedia::saveCookieFile(); -  	// Stop the plugin read thread if it's running.  	LLPluginProcessParent::setUseReadThread(false); diff --git a/indra/newview/llfloaterfacebook.cpp b/indra/newview/llfloaterfacebook.cpp index b1d6d8be82..e84cbc289f 100644 --- a/indra/newview/llfloaterfacebook.cpp +++ b/indra/newview/llfloaterfacebook.cpp @@ -1,4 +1,4 @@ -/**  +/**  * @file llfloaterfacebook.cpp  * @brief Implementation of llfloaterfacebook  * @author Gilbert@lindenlab.com @@ -41,7 +41,6 @@  #include "llresmgr.h"		// LLLocale  #include "llsdserialize.h"  #include "llloadingindicator.h" -#include "llplugincookiestore.h"  #include "llslurl.h"  #include "lltrans.h"  #include "llsnapshotlivepreview.h" @@ -296,16 +295,11 @@ void LLFacebookStatusPanel::showConnectedLayout()  void LLFacebookStatusPanel::onConnect()  {      LLFacebookConnect::instance().checkConnectionToFacebook(true); - -    //Clear only the facebook browser cookies so that the facebook login screen appears -    LLViewerMedia::getCookieStore()->removeCookiesByDomain(".facebook.com");  }  void LLFacebookStatusPanel::onDisconnect()  {      LLFacebookConnect::instance().disconnectFromFacebook(); - -    LLViewerMedia::getCookieStore()->removeCookiesByDomain(".facebook.com");  }  void LLFacebookStatusPanel::clearAndClose() @@ -810,7 +804,7 @@ void LLFacebookCheckinPanel::sendCheckin()      LLAgentUI::buildSLURL(slurl);      std::string slurl_string = slurl.getSLURLString(); -    // Use a valid http:// URL if the scheme is secondlife://  +    // Use a valid http:// URL if the scheme is secondlife://      LLURI slurl_uri(slurl_string);      if (slurl_uri.scheme() == LLSLURL::SLURL_SECONDLIFE_SCHEME)      { diff --git a/indra/newview/llfloaterflickr.cpp b/indra/newview/llfloaterflickr.cpp index 15b7c7fafa..69a92b2b54 100644 --- a/indra/newview/llfloaterflickr.cpp +++ b/indra/newview/llfloaterflickr.cpp @@ -40,7 +40,6 @@  #include "llresmgr.h"		// LLLocale  #include "llsdserialize.h"  #include "llloadingindicator.h" -#include "llplugincookiestore.h"  #include "llslurl.h"  #include "lltrans.h"  #include "llsnapshotlivepreview.h" @@ -660,16 +659,11 @@ void LLFlickrAccountPanel::showConnectedLayout()  void LLFlickrAccountPanel::onConnect()  {  	LLFlickrConnect::instance().checkConnectionToFlickr(true); - -	//Clear only the flickr browser cookies so that the flickr login screen appears -	LLViewerMedia::getCookieStore()->removeCookiesByDomain(".flickr.com");   }  void LLFlickrAccountPanel::onDisconnect()  {  	LLFlickrConnect::instance().disconnectFromFlickr(); - -	LLViewerMedia::getCookieStore()->removeCookiesByDomain(".flickr.com");   }  //////////////////////// diff --git a/indra/newview/llfloatertwitter.cpp b/indra/newview/llfloatertwitter.cpp index 4bab89ace2..a351921d8d 100644 --- a/indra/newview/llfloatertwitter.cpp +++ b/indra/newview/llfloatertwitter.cpp @@ -41,7 +41,6 @@  #include "llresmgr.h"		// LLLocale  #include "llsdserialize.h"  #include "llloadingindicator.h" -#include "llplugincookiestore.h"  #include "llslurl.h"  #include "lltrans.h"  #include "llsnapshotlivepreview.h" @@ -684,16 +683,11 @@ void LLTwitterAccountPanel::showConnectedLayout()  void LLTwitterAccountPanel::onConnect()  {  	LLTwitterConnect::instance().checkConnectionToTwitter(true); - -	//Clear only the twitter browser cookies so that the twitter login screen appears -	LLViewerMedia::getCookieStore()->removeCookiesByDomain(".twitter.com");   }  void LLTwitterAccountPanel::onDisconnect()  {  	LLTwitterConnect::instance().disconnectFromTwitter(); - -	LLViewerMedia::getCookieStore()->removeCookiesByDomain(".twitter.com");   }  //////////////////////// diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index ad9a554ef5..358fb80af7 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -965,9 +965,6 @@ bool idle_startup()  		// Load Avatars icons cache  		LLAvatarIconIDCache::getInstance()->load(); -		// Load media plugin cookies -		LLViewerMedia::loadCookieFile(); -  		LLRenderMuteList::getInstance()->loadFromFile();  		//------------------------------------------------- diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 9dd8b00ef6..1d4079289a 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -50,7 +50,6 @@  #include "llpanelprofile.h"  #include "llparcel.h"  #include "llpluginclassmedia.h" -#include "llplugincookiestore.h"  #include "llurldispatcher.h"  #include "lluuid.h"  #include "llversioninfo.h" @@ -154,7 +153,6 @@ LLViewerMediaObserver::~LLViewerMediaObserver()  } -LLPluginCookieStore *LLViewerMedia::sCookieStore = NULL;  LLURL LLViewerMedia::sOpenIDURL;  std::string LLViewerMedia::sOpenIDCookie;  LLPluginClassMedia* LLViewerMedia::sSpareBrowserMediaSource = NULL; @@ -169,8 +167,6 @@ static F64 sLowestLoadableImplInterest = 0.0f;  static bool sAnyMediaShowing = false;  static bool sAnyMediaPlaying = false;  static boost::signals2::connection sTeleportFinishConnection; -static std::string sUpdatedCookies; -static const char *PLUGIN_COOKIE_FILE_NAME = "plugin_cookies.txt";  //////////////////////////////////////////////////////////////////////////////////////////  static void add_media_impl(LLViewerMediaImpl* media) @@ -610,12 +606,6 @@ void LLViewerMedia::updateMedia(void *dummy_arg)  	sAnyMediaShowing = false;  	sAnyMediaPlaying = false; -	sUpdatedCookies = getCookieStore()->getChangedCookies(); -	if(!sUpdatedCookies.empty()) -	{ -		LL_DEBUGS() << "updated cookies will be sent to all loaded plugins: " << LL_ENDL; -		LL_DEBUGS() << sUpdatedCookies << LL_ENDL; -	}  	impl_list::iterator iter = sViewerMediaImplList.begin();  	impl_list::iterator end = sViewerMediaImplList.end(); @@ -1048,64 +1038,6 @@ void LLViewerMedia::clearAllCookies()  			pimpl->mMediaSource->clear_cookies();  		}  	} - -	// Clear all cookies from the cookie store -	getCookieStore()->setAllCookies(""); - -	// FIXME: this may not be sufficient, since the on-disk cookie file won't get written until some browser instance exits cleanly. -	// It also won't clear cookies for other accounts, or for any account if we're not logged in, and won't do anything at all if there are no webkit plugins loaded. -	// Until such time as we can centralize cookie storage, the following hack should cover these cases: - -	// HACK: Look for cookie files in all possible places and delete them. -	// NOTE: this assumes knowledge of what happens inside the webkit plugin (it's what adds 'browser_profile' to the path and names the cookie file) - -	// Places that cookie files can be: -	// <getOSUserAppDir>/browser_profile/cookies -	// <getOSUserAppDir>/first_last/browser_profile/cookies  (note that there may be any number of these!) -	// <getOSUserAppDir>/first_last/plugin_cookies.txt  (note that there may be any number of these!) - -	std::string base_dir = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter(); -	std::string target; -	std::string filename; - -	LL_DEBUGS() << "base dir = " << base_dir << LL_ENDL; - -	// The non-logged-in version is easy -	target = base_dir; -	target += "browser_profile"; -	target += gDirUtilp->getDirDelimiter(); -	target += "cookies"; -	LL_DEBUGS() << "target = " << target << LL_ENDL; -	if(LLFile::isfile(target)) -	{ -		LLFile::remove(target); -	} - -	// the hard part: iterate over all user directories and delete the cookie file from each one -	LLDirIterator dir_iter(base_dir, "*_*"); -	while (dir_iter.next(filename)) -	{ -		target = gDirUtilp->add(base_dir, filename); -		gDirUtilp->append(target, "browser_profile"); -		gDirUtilp->append(target, "cookies"); -		LL_DEBUGS() << "target = " << target << LL_ENDL; -		if(LLFile::isfile(target)) -		{ -			LLFile::remove(target); -		} - -		// Other accounts may have new-style cookie files too -- delete them as well -		target = gDirUtilp->add(base_dir, filename); -		gDirUtilp->append(target, PLUGIN_COOKIE_FILE_NAME); -		LL_DEBUGS() << "target = " << target << LL_ENDL; -		if(LLFile::isfile(target)) -		{ -			LLFile::remove(target); -		} -	} - -	// If we have an OpenID cookie, re-add it to the cookie store. -	setOpenIDCookie(std::string());  }  ///////////////////////////////////////////////////////////////////////////////////////// @@ -1134,7 +1066,7 @@ void LLViewerMedia::setCookiesEnabled(bool enabled)  		LLViewerMediaImpl* pimpl = *iter;  		if(pimpl->mMediaSource)  		{ -			pimpl->mMediaSource->enable_cookies(enabled); +			pimpl->mMediaSource->cookies_enabled(enabled);  		}  	}  } @@ -1159,127 +1091,7 @@ void LLViewerMedia::setProxyConfig(bool enable, const std::string &host, int por  /////////////////////////////////////////////////////////////////////////////////////////  // static  ///////////////////////////////////////////////////////////////////////////////////////// -// static -LLPluginCookieStore *LLViewerMedia::getCookieStore() -{ -	if(sCookieStore == NULL) -	{ -		sCookieStore = new LLPluginCookieStore; -	} - -	return sCookieStore; -} - -///////////////////////////////////////////////////////////////////////////////////////// -// static -void LLViewerMedia::loadCookieFile() -{ -	// build filename for each user -	std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PLUGIN_COOKIE_FILE_NAME); - -	if (resolved_filename.empty()) -	{ -		LL_INFOS() << "can't get path to plugin cookie file - probably not logged in yet." << LL_ENDL; -		return; -	} - -	// open the file for reading -	llifstream file(resolved_filename.c_str()); -	if (!file.is_open()) -	{ -		LL_WARNS() << "can't load plugin cookies from file \"" << PLUGIN_COOKIE_FILE_NAME << "\"" << LL_ENDL; -		return; -	} - -	getCookieStore()->readAllCookies(file, true); - -	file.close(); - -	// send the clear_cookies message to all loaded plugins -	impl_list::iterator iter = sViewerMediaImplList.begin(); -	impl_list::iterator end = sViewerMediaImplList.end(); -	for (; iter != end; iter++) -	{ -		LLViewerMediaImpl* pimpl = *iter; -		if(pimpl->mMediaSource) -		{ -			pimpl->mMediaSource->clear_cookies(); -		} -	} - -	// If we have an OpenID cookie, re-add it to the cookie store. -	setOpenIDCookie(std::string()); -} - - -///////////////////////////////////////////////////////////////////////////////////////// -// static -void LLViewerMedia::saveCookieFile() -{ -	// build filename for each user -	std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PLUGIN_COOKIE_FILE_NAME); - -	if (resolved_filename.empty()) -	{ -		LL_INFOS() << "can't get path to plugin cookie file - probably not logged in yet." << LL_ENDL; -		return; -	} - -	// open a file for writing -	llofstream file(resolved_filename.c_str()); -	if (!file.is_open()) -	{ -		LL_WARNS() << "can't open plugin cookie file \"" << PLUGIN_COOKIE_FILE_NAME << "\" for writing" << LL_ENDL; -		return; -	} - -	getCookieStore()->writePersistentCookies(file); - -	file.close(); -} - -///////////////////////////////////////////////////////////////////////////////////////// -// static -void LLViewerMedia::addCookie(const std::string &name, const std::string &value, const std::string &domain, const LLDate &expires, const std::string &path, bool secure) -{ -	std::stringstream cookie; - -	cookie << name << "=" << LLPluginCookieStore::quoteString(value); - -	if(expires.notNull()) -	{ -		cookie << "; expires=" << expires.asRFC1123(); -	} - -	cookie << "; domain=" << domain; - -	cookie << "; path=" << path; - -	if(secure) -	{ -		cookie << "; secure"; -	} - -	getCookieStore()->setCookies(cookie.str()); -} - -///////////////////////////////////////////////////////////////////////////////////////// -// static -void LLViewerMedia::addSessionCookie(const std::string &name, const std::string &value, const std::string &domain, const std::string &path, bool secure) -{ -	// A session cookie just has a NULL date. -	addCookie(name, value, domain, LLDate(), path, secure); -} - -///////////////////////////////////////////////////////////////////////////////////////// -// static -void LLViewerMedia::removeCookie(const std::string &name, const std::string &domain, const std::string &path ) -{ -	// To remove a cookie, add one with the same name, domain, and path that expires in the past. - -	addCookie(name, "", domain, LLDate(LLDate::now().secondsSinceEpoch() - 1.0), path); -} - +//// static  LLSD LLViewerMedia::getHeaders()  { @@ -1384,8 +1196,6 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)          hostEnd = authority.size();      } -    getCookieStore()->setCookiesFromHost(sOpenIDCookie, authority.substr(hostStart, hostEnd - hostStart)); -  	if (url.length())  	{  		LLMediaCtrl* media_instance = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents"); @@ -1423,7 +1233,6 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)      httpHeaders->append(HTTP_OUT_HEADER_COOKIE, sOpenIDCookie);      httpHeaders->append(HTTP_OUT_HEADER_USER_AGENT, getCurrentUserAgent()); -      LL_DEBUGS("MediaAuth") << "Requesting " << url << LL_ENDL;      LL_DEBUGS("MediaAuth") << "sOpenIDCookie = [" << sOpenIDCookie << "]" << LL_ENDL; @@ -1448,13 +1257,9 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)      const std::string& cookie = resultHeaders[HTTP_IN_HEADER_SET_COOKIE].asStringRef();      LL_DEBUGS("MediaAuth") << "cookie = " << cookie << LL_ENDL; -    // *TODO: What about bad status codes?  Does this destroy previous cookies? -    LLViewerMedia::getCookieStore()->setCookiesFromHost(cookie, hostAuth); -      // Set cookie for snapshot publishing.      std::string authCookie = cookie.substr(0, cookie.find(";")); // strip path      LLWebProfile::setAuthCookie(authCookie); -  }  ///////////////////////////////////////////////////////////////////////////////////////// @@ -1649,12 +1454,6 @@ void LLViewerMedia::cleanupClass()  		delete sSpareBrowserMediaSource;  		sSpareBrowserMediaSource = NULL;  	} - -	if (sCookieStore != NULL) -	{ -		delete sCookieStore; -		sCookieStore = NULL; -	}  }  ////////////////////////////////////////////////////////////////////////////////////////// @@ -1922,7 +1721,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_  			// collect 'cookies enabled' setting from prefs and send to embedded browser  			bool cookies_enabled = gSavedSettings.getBOOL( "CookiesEnabled" ); -			media_source->enable_cookies( cookies_enabled || clean_browser); +			media_source->cookies_enabled( cookies_enabled || clean_browser);  			// collect 'plugins enabled' setting from prefs and send to embedded browser  			bool plugins_enabled = gSavedSettings.getBOOL( "BrowserPluginsEnabled" ); @@ -2031,17 +1830,6 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)  			media_source->clear_cache();  		} -		// TODO: Only send cookies to plugins that need them -		//  Ideally, the plugin should tell us whether it handles cookies or not -- either via the init response or through a separate message. -		//  Due to the ordering of messages, it's possible we wouldn't get that information back in time to send cookies before sending a navigate message, -		//  which could cause odd race conditions. -		std::string all_cookies = LLViewerMedia::getCookieStore()->getAllCookies(); -		LL_DEBUGS() << "setting cookies: " << all_cookies << LL_ENDL; -		if(!all_cookies.empty()) -		{ -			media_source->set_cookies(all_cookies); -		} -  		mMediaSource = media_source;  		mMediaSource->setDeleteOK(false) ;  		updateVolume(); @@ -2983,14 +2771,10 @@ void LLViewerMediaImpl::update()  		updateVolume();  		// TODO: this is updated every frame - is this bad? -		updateJavascriptObject(); - -		// If we didn't just create the impl, it may need to get cookie updates. -		if(!sUpdatedCookies.empty()) -		{ -			// TODO: Only send cookies to plugins that need them -			mMediaSource->set_cookies(sUpdatedCookies); -		} +		// Removing this as part of the post viewer64 media update +		// Removed as not implemented in CEF embedded browser +		// See MAINT-8194 for a more fuller description +		// updateJavascriptObject();  	} @@ -3583,13 +3367,6 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla  ////////////////////////////////////////////////////////////////////////////////  // virtual -void LLViewerMediaImpl::handleCookieSet(LLPluginClassMedia* self, const std::string &cookie) -{ -	LLViewerMedia::getCookieStore()->setCookies(cookie); -} - -//////////////////////////////////////////////////////////////////////////////// -// virtual  void  LLViewerMediaImpl::cut()  { diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 0212bf88bf..6e18c4fecb 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -50,7 +50,6 @@ class LLViewerMediaTexture;  class LLMediaEntry;  class LLVOVolume;  class LLMimeDiscoveryResponder; -class LLPluginCookieStore;  typedef LLPointer<LLViewerMediaImpl> viewer_media_t;  /////////////////////////////////////////////////////////////////////////////// @@ -149,13 +148,6 @@ public:  	// Set the proxy config for all loaded plugins  	static void setProxyConfig(bool enable, const std::string &host, int port); -	static LLPluginCookieStore *getCookieStore(); -	static void loadCookieFile(); -	static void saveCookieFile(); -	static void addCookie(const std::string &name, const std::string &value, const std::string &domain, const LLDate &expires, const std::string &path = std::string("/"), bool secure = false ); -	static void addSessionCookie(const std::string &name, const std::string &value, const std::string &domain, const std::string &path = std::string("/"), bool secure = false ); -	static void removeCookie(const std::string &name, const std::string &domain, const std::string &path = std::string("/") ); -  	static void openIDSetup(const std::string &openid_url, const std::string &openid_token);  	static void openIDCookieResponse(const std::string& url, const std::string &cookie); @@ -178,7 +170,6 @@ private:      static void openIDSetupCoro(std::string openidUrl, std::string openidToken);      static void getOpenIDCookieCoro(std::string url); -	static LLPluginCookieStore *sCookieStore;  	static LLURL sOpenIDURL;  	static std::string sOpenIDCookie;  	static LLPluginClassMedia* sSpareBrowserMediaSource; @@ -337,7 +328,6 @@ public:  	// Inherited from LLPluginClassMediaOwner  	/*virtual*/ void handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent); -	/*virtual*/ void handleCookieSet(LLPluginClassMedia* self, const std::string &cookie);  	// LLEditMenuHandler overrides  	/*virtual*/ void	cut(); diff --git a/indra/newview/llwebprofile.cpp b/indra/newview/llwebprofile.cpp index 06ce497510..81d4e30a7a 100644 --- a/indra/newview/llwebprofile.cpp +++ b/indra/newview/llwebprofile.cpp @@ -31,7 +31,6 @@  // libs  #include "llbufferstream.h"  #include "llimagepng.h" -#include "llplugincookiestore.h"  #include "llsdserialize.h" | 
