summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llplugin/llpluginclassmedia.cpp60
-rw-r--r--indra/llplugin/llpluginclassmedia.h14
-rw-r--r--indra/newview/llviewermedia.cpp9
3 files changed, 82 insertions, 1 deletions
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 6d51adc685..a436452461 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -690,6 +690,66 @@ bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD
return true;
}
+// This function injects a previously stored OpenID cookie into
+// each new media instance - see SL-15867 for details. It appears
+// that the way we use the cache, shared between multiple CEF
+// instances means that sometimes the OpenID cookie cannot be read
+// even though it appears to be there. The long term solution to
+// this is to create a separate cache directory for each instance
+// but that has its own set of problems. This short term approach
+// "forces" each new media instance to have a copy of the cookie
+// so that a page that needs it - e.g. Profiles - finds it and
+// can log in successfully.
+void LLPluginClassMedia::injectOpenIDCookie()
+{
+ // can be called before we know who the user is at login
+ // and there is no OpenID cookie at that point so no
+ // need to try to set it (these values will all be empty)
+ if (sOIDcookieName.length() && sOIDcookieValue.length())
+ {
+ setCookie(sOIDcookieUrl, sOIDcookieName,
+ sOIDcookieValue, sOIDcookieHost, sOIDcookiePath, sOIDcookieHttpOnly, sOIDcookieSecure);
+ }
+}
+
+// We store each component of the OpenI cookie individuality here
+// because previously, there was some significant parsing to
+// break up the raw string into these components and we do not
+// want to have to do that again here. Stored as statics because
+// we want to share their value between all instances of this
+// class - the ones that receive it at login and any others
+// that open afterwards (e.g. the Profiles floater)
+std::string LLPluginClassMedia::sOIDcookieUrl = std::string();
+std::string LLPluginClassMedia::sOIDcookieName = std::string();
+std::string LLPluginClassMedia::sOIDcookieValue = std::string();
+std::string LLPluginClassMedia::sOIDcookieHost = std::string();
+std::string LLPluginClassMedia::sOIDcookiePath = std::string();
+bool LLPluginClassMedia::sOIDcookieHttpOnly = false;
+bool LLPluginClassMedia::sOIDcookieSecure = false;
+
+// Once we receive the OpenID cookie, it is parsed/processed
+// in llViewerMedia::parseRawCookie() and then the component
+// values are stored here so that next time a new media
+// instance is created, we can use injectOpenIDCookie()
+// to "insist" that the cookie store remember its value.
+// One might ask why we need to go via LLViewerMedia (which
+// makes this call) - this is because the raw cookie arrives
+// here in this file but undergoes non-trivial processing
+// in LLViewerMedia.
+void LLPluginClassMedia::storeOpenIDCookie(const std::string url,
+ const std::string name, const std::string value,
+ const std::string host, const std::string path,
+ bool httponly, bool secure)
+{
+ sOIDcookieUrl = url;
+ sOIDcookieName = name;
+ sOIDcookieValue = value;
+ sOIDcookieHost = host;
+ sOIDcookiePath = path;
+ sOIDcookieHttpOnly = httponly;
+ sOIDcookieSecure = secure;
+}
+
void LLPluginClassMedia::setCookie(std::string uri, std::string name, std::string value, std::string domain, std::string path, bool httponly, bool secure)
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_cookie");
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index 382f891e0c..a09145cf50 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -135,6 +135,20 @@ public:
// Text may be unicode (utf8 encoded)
bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data);
+ static std::string sOIDcookieUrl;
+ static std::string sOIDcookieName;
+ static std::string sOIDcookieValue;
+ static std::string sOIDcookieHost;
+ static std::string sOIDcookiePath;
+ static bool sOIDcookieHttpOnly;
+ static bool sOIDcookieSecure;
+ void storeOpenIDCookie(const std::string url,
+ const std::string name, const std::string value,
+ const std::string host, const std::string path,
+ bool httponly, bool secure);
+
+ void injectOpenIDCookie();
+
void setCookie(std::string uri, std::string name, std::string value, std::string domain, std::string path, bool httponly, bool secure);
void loadURI(const std::string &uri);
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index d35dbda907..d0cf8ea407 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -1290,7 +1290,13 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)
// down.
std::string cefUrl(std::string(inst->mOpenIDURL.mURI) + "://" + std::string(inst->mOpenIDURL.mAuthority));
- media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host, cookie_path, httponly, secure);
+ media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host,
+ cookie_path, httponly, secure);
+
+ // Now that we have parsed the raw cookie, we must store it so that each new media instance
+ // can also get a copy and faciliate logging into internal SL sites.
+ media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value,
+ cookie_host, cookie_path, httponly, secure);
}
}
}
@@ -1825,6 +1831,7 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)
if (media_source)
{
+ media_source->injectOpenIDCookie();
media_source->setDisableTimeout(gSavedSettings.getBOOL("DebugPluginDisableTimeout"));
media_source->setLoop(mMediaLoop);
media_source->setAutoScale(mMediaAutoScale);