From 0a1cb4f03ee1aeb0cfc9d9bdb837043d0f46f292 Mon Sep 17 00:00:00 2001
From: Leslie Linden <leslie@lindenlab.com>
Date: Wed, 11 Jan 2012 11:26:56 -0800
Subject: [PATCH] EXP-1791 FIX -- Handle case where initialization with SLM
 fails in the Merchant Outbox floater in the viewer

* Updated marketplace import to properly handle failed cases of authentications
  and invalid cookies.  The import will reset to an uninitialized state and then
  trigger and initialization followed immediately by an import when appropriate.
---
 indra/newview/llfloateroutbox.cpp             |  1 -
 indra/newview/llmarketplacefunctions.cpp      | 67 +++++++++++--------
 indra/newview/llmarketplacefunctions.h        |  5 +-
 .../skins/default/xui/en/notifications.xml    |  7 +-
 4 files changed, 45 insertions(+), 35 deletions(-)

diff --git a/indra/newview/llfloateroutbox.cpp b/indra/newview/llfloateroutbox.cpp
index 28589f5e9a4..130c26acdc2 100644
--- a/indra/newview/llfloateroutbox.cpp
+++ b/indra/newview/llfloateroutbox.cpp
@@ -438,7 +438,6 @@ void LLFloaterOutbox::importReportResults(U32 status, const LLSD& content)
 		LLSD subs;
 		subs["[ERROR_CODE]"] = status_string;
 		
-		//llassert(status == MarketplaceErrorCodes::IMPORT_JOB_FAILED);
 		LLNotificationsUtil::add("OutboxImportFailed", subs);
 	}
 	
diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp
index ea6634a39ef..84cbe3cac22 100644
--- a/indra/newview/llmarketplacefunctions.cpp
+++ b/indra/newview/llmarketplacefunctions.cpp
@@ -133,6 +133,17 @@ namespace LLMarketplaceImport
 				llinfos << " SLM POST content: " << content.asString() << llendl;
 			}
 
+			if ((status == MarketplaceErrorCodes::IMPORT_REDIRECT) ||
+				(status == MarketplaceErrorCodes::IMPORT_AUTHENTICATION_ERROR))
+			{
+				if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+				{
+					llinfos << " SLM POST clearing marketplace cookie due to authentication failure" << llendl;
+				}
+
+				sMarketplaceCookie.clear();
+			}
+
 			sImportInProgress = (status == MarketplaceErrorCodes::IMPORT_DONE);
 			sImportPostPending = false;
 			sImportResultStatus = status;
@@ -330,16 +341,6 @@ LLMarketplaceInventoryImporter::LLMarketplaceInventoryImporter()
 {
 }
 
-void LLMarketplaceInventoryImporter::initialize()
-{
-	llassert(!mInitialized);
-	
-	if (!LLMarketplaceImport::hasSessionCookie())
-	{
-		LLMarketplaceImport::establishMarketplaceSessionCookie();
-	}
-}
-
 boost::signals2::connection LLMarketplaceInventoryImporter::setInitializationErrorCallback(const status_report_signal_t::slot_type& cb)
 {
 	if (mErrorInitSignal == NULL)
@@ -370,17 +371,32 @@ boost::signals2::connection LLMarketplaceInventoryImporter::setStatusReportCallb
 	return mStatusReportSignal->connect(cb);
 }
 
+void LLMarketplaceInventoryImporter::initialize()
+{
+	llassert(!mInitialized);
+
+	if (!LLMarketplaceImport::hasSessionCookie())
+	{
+		LLMarketplaceImport::establishMarketplaceSessionCookie();
+	}
+}
+
+void LLMarketplaceInventoryImporter::reinitializeAndTriggerImport()
+{
+	mInitialized = false;
+
+	initialize();
+
+	mAutoTriggerImport = true;
+}
+
 bool LLMarketplaceInventoryImporter::triggerImport()
 {
 	const bool import_triggered = LLMarketplaceImport::triggerImport();
 	
 	if (!import_triggered)
 	{
-		mInitialized = false;
-
-		initialize();
-		
-		mAutoTriggerImport = true;
+		reinitializeAndTriggerImport();
 	}
 	
 	return import_triggered;
@@ -396,23 +412,14 @@ void LLMarketplaceInventoryImporter::updateImport()
 		
 		if (!polling_status)
 		{
-			mInitialized = false;
-			
-			initialize();
-			
-			mAutoTriggerImport = true;
+			reinitializeAndTriggerImport();
 		}
 	}	
 	
 	if (mImportInProgress != in_progress)
 	{
 		mImportInProgress = in_progress;
-		
-		if (mStatusChangedSignal)
-		{
-			(*mStatusChangedSignal)(mImportInProgress);
-		}
-		
+
 		// If we are no longer in progress
 		if (!mImportInProgress)
 		{
@@ -436,7 +443,7 @@ void LLMarketplaceInventoryImporter::updateImport()
 					{
 						mAutoTriggerImport = false;
 
-						triggerImport();
+						mImportInProgress = triggerImport();
 					}
 				}
 				else if (mErrorInitSignal)
@@ -445,6 +452,12 @@ void LLMarketplaceInventoryImporter::updateImport()
 				}
 			}
 		}
+
+		// Make sure we trigger the status change with the final state (in case of auto trigger after initialize)
+		if (mStatusChangedSignal)
+		{
+			(*mStatusChangedSignal)(mImportInProgress);
+		}
 	}
 }
 
diff --git a/indra/newview/llmarketplacefunctions.h b/indra/newview/llmarketplacefunctions.h
index b2f6cb7521d..78df86ef3e7 100644
--- a/indra/newview/llmarketplacefunctions.h
+++ b/indra/newview/llmarketplacefunctions.h
@@ -46,6 +46,7 @@ namespace MarketplaceErrorCodes
 	{
 		IMPORT_DONE = 200,
 		IMPORT_PROCESSING = 202,
+		IMPORT_REDIRECT = 302,
 		IMPORT_AUTHENTICATION_ERROR = 401,
 		IMPORT_DONE_WITH_ERRORS = 409,
 		IMPORT_JOB_FAILED = 410,
@@ -61,8 +62,6 @@ class LLMarketplaceInventoryImporter
 	
 	LLMarketplaceInventoryImporter();
 	
-	void initialize();
-
 	typedef boost::signals2::signal<void (bool)> status_changed_signal_t;
 	typedef boost::signals2::signal<void (U32, const LLSD&)> status_report_signal_t;
 
@@ -70,10 +69,12 @@ class LLMarketplaceInventoryImporter
 	boost::signals2::connection setStatusChangedCallback(const status_changed_signal_t::slot_type& cb);
 	boost::signals2::connection setStatusReportCallback(const status_report_signal_t::slot_type& cb);
 	
+	void initialize();
 	bool triggerImport();
 	bool isImportInProgress() const { return mImportInProgress; }
 	
 protected:
+	void reinitializeAndTriggerImport();
 	void updateImport();
 	
 private:
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 2269703cb66..61346bf3d65 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -230,8 +230,9 @@ All folders were successfully sent to the Marketplace.
    type="outbox">
 Some folders did not transfer
 
-Errors occurred when some folders were sent to the Marketplace.  Those folders are still in your Merchant Outbox.  See the error log for more information.
+Errors occurred when some folders were sent to the Marketplace.  Those folders are still in your Merchant Outbox.
 
+See the error log for more information.
         <usetemplate
          name="okbutton"
          yestext="OK"/>
@@ -245,8 +246,6 @@ Transfer failed
 
 No folders were sent to the Marketplace because of a system or network error.  Try again later.
 
-Error [ERROR_CODE]
-
         <usetemplate
          name="okbutton"
          yestext="OK"/>
@@ -260,8 +259,6 @@ Marketplace initialization failed
 
 Initialization with the Marketplace failed because of a system or network error.  Try again later.
 
-Error [ERROR_CODE]
-
         <usetemplate
          name="okbutton"
          yestext="OK"/>
-- 
GitLab