summaryrefslogtreecommitdiff
path: root/indra/newview/llviewernetwork.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llviewernetwork.cpp')
-rw-r--r--indra/newview/llviewernetwork.cpp780
1 files changed, 539 insertions, 241 deletions
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index 987d23630a..1fac4d003d 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -5,7 +5,7 @@
*
* $LicenseInfo:firstyear=2006&license=viewergpl$
*
- * Copyright (c) 2006-2009, Linden Research, Inc.
+ * Copyright (c) 2006-2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -13,13 +13,12 @@
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * online at http://secondlife.com/developers/opensource/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * online at http://secondlife.com/developers/opensource/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
@@ -34,308 +33,607 @@
#include "llviewerprecompiledheaders.h"
#include "llviewernetwork.h"
+#include "llviewercontrol.h"
+#include "llsdserialize.h"
+#include "llsecapi.h"
+#include "llweb.h"
-#include "llevents.h"
-#include "net.h"
+
+const char* DEFAULT_LOGIN_PAGE = "http://secondlife.com/app/login/";
-#include "llviewercontrol.h"
-#include "lllogin.h"
+const char* SYSTEM_GRID_SLURL_BASE = "secondlife://%s/secondlife/";
+const char* MAIN_GRID_SLURL_BASE = "http://maps.secondlife.com/secondlife/";
+const char* SYSTEM_GRID_APP_SLURL_BASE = "secondlife:///app";
-struct LLGridData
-{
- const char* mLabel;
- const char* mName;
- const char* mLoginURI;
- const char* mHelperURI;
-};
+const char* DEFAULT_SLURL_BASE = "https://%s/region/";
+const char* DEFAULT_APP_SLURL_BASE = "x-grid-location-info://%s/app";
-static LLGridData gGridInfo[GRID_INFO_COUNT] =
+LLGridManager::LLGridManager()
+: mIsInProductionGrid(false)
{
- { "None", "", "", ""},
- { "Aditi",
- "util.aditi.lindenlab.com",
- "https://login.aditi.lindenlab.com/cgi-bin/login.cgi",
- "http://aditi-secondlife.webdev.lindenlab.com/helpers/" },
- { "Agni",
- "util.agni.lindenlab.com",
- "https://login.agni.lindenlab.com/cgi-bin/login.cgi",
- "https://secondlife.com/helpers/" },
- { "Aruna",
- "util.aruna.lindenlab.com",
- "https://login.aruna.lindenlab.com/cgi-bin/login.cgi",
- "http://aruna-secondlife.webdev.lindenlab.com/helpers/" },
- { "Bharati",
- "util.bharati.lindenlab.com",
- "https://login.bharati.lindenlab.com/cgi-bin/login.cgi",
- "http://bharati-secondlife.webdev.lindenlab.com/helpers/" },
- { "Chandra",
- "util.chandra.lindenlab.com",
- "https://login.chandra.lindenlab.com/cgi-bin/login.cgi",
- "http://chandra-secondlife.webdev.lindenlab.com/helpers/" },
- { "Damballah",
- "util.damballah.lindenlab.com",
- "https://login.damballah.lindenlab.com/cgi-bin/login.cgi",
- "http://damballah-secondlife.webdev.lindenlab.com/helpers/" },
- { "Danu",
- "util.danu.lindenlab.com",
- "https://login.danu.lindenlab.com/cgi-bin/login.cgi",
- "http://danu-secondlife.webdev.lindenlab.com/helpers/" },
- { "Durga",
- "util.durga.lindenlab.com",
- "https://login.durga.lindenlab.com/cgi-bin/login.cgi",
- "http://durga-secondlife.webdev.lindenlab.com/helpers/" },
- { "Ganga",
- "util.ganga.lindenlab.com",
- "https://login.ganga.lindenlab.com/cgi-bin/login.cgi",
- "http://ganga-secondlife.webdev.lindenlab.com/helpers/" },
- { "Mitra",
- "util.mitra.lindenlab.com",
- "https://login.mitra.lindenlab.com/cgi-bin/login.cgi",
- "http://mitra-secondlife.webdev.lindenlab.com/helpers/" },
- { "Mohini",
- "util.mohini.lindenlab.com",
- "https://login.mohini.lindenlab.com/cgi-bin/login.cgi",
- "http://mohini-secondlife.webdev.lindenlab.com/helpers/" },
- { "Nandi",
- "util.nandi.lindenlab.com",
- "https://login.nandi.lindenlab.com/cgi-bin/login.cgi",
- "http://nandi-secondlife.webdev.lindenlab.com/helpers/" },
- { "Parvati",
- "util.parvati.lindenlab.com",
- "https://login.parvati.lindenlab.com/cgi-bin/login.cgi",
- "http://parvati-secondlife.webdev.lindenlab.com/helpers/" },
- { "Radha",
- "util.radha.lindenlab.com",
- "https://login.radha.lindenlab.com/cgi-bin/login.cgi",
- "http://radha-secondlife.webdev.lindenlab.com/helpers/" },
- { "Ravi",
- "util.ravi.lindenlab.com",
- "https://login.ravi.lindenlab.com/cgi-bin/login.cgi",
- "http://ravi-secondlife.webdev.lindenlab.com/helpers/" },
- { "Siva",
- "util.siva.lindenlab.com",
- "https://login.siva.lindenlab.com/cgi-bin/login.cgi",
- "http://siva-secondlife.webdev.lindenlab.com/helpers/" },
- { "Shakti",
- "util.shakti.lindenlab.com",
- "https://login.shakti.lindenlab.com/cgi-bin/login.cgi",
- "http://shakti-secondlife.webdev.lindenlab.com/helpers/" },
- { "Skanda",
- "util.skanda.lindenlab.com",
- "https://login.skanda.lindenlab.com/cgi-bin/login.cgi",
- "http://skanda-secondlife.webdev.lindenlab.com/helpers/" },
- { "Soma",
- "util.soma.lindenlab.com",
- "https://login.soma.lindenlab.com/cgi-bin/login.cgi",
- "http://soma-secondlife.webdev.lindenlab.com/helpers/" },
- { "Uma",
- "util.uma.lindenlab.com",
- "https://login.uma.lindenlab.com/cgi-bin/login.cgi",
- "http://uma-secondlife.webdev.lindenlab.com/helpers/" },
- { "Vaak",
- "util.vaak.lindenlab.com",
- "https://login.vaak.lindenlab.com/cgi-bin/login.cgi",
- "http://vaak-secondlife.webdev.lindenlab.com/helpers/" },
- { "Yami",
- "util.yami.lindenlab.com",
- "https://login.yami.lindenlab.com/cgi-bin/login.cgi",
- "http://yami-secondlife.webdev.lindenlab.com/helpers/" },
- { "Local",
- "localhost",
- "https://login.dmz.lindenlab.com/cgi-bin/login.cgi",
- "" },
- { "Other",
- "",
- "https://login.dmz.lindenlab.com/cgi-bin/login.cgi",
- "" }
-};
-
-const EGridInfo DEFAULT_GRID_CHOICE = GRID_INFO_AGNI;
-
-
-unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */
-
-LLViewerLogin::LLViewerLogin() :
- mGridChoice(DEFAULT_GRID_CHOICE)
+ // by default, we use the 'grids.xml' file in the user settings directory
+ // this file is an LLSD file containing multiple grid definitions.
+ // This file does not contain definitions for secondlife.com grids,
+ // as that would be a security issue when they are overwritten by
+ // an attacker. Don't want someone snagging a password.
+ std::string grid_file = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
+ "grids.xml");
+ initialize(grid_file);
+
+}
+
+
+LLGridManager::LLGridManager(const std::string& grid_file)
{
+ // initialize with an explicity grid file for testing.
+ initialize(grid_file);
}
- LLViewerLogin::~LLViewerLogin()
- {
- }
+//
+// LLGridManager - class for managing the list of known grids, and the current
+// selection
+//
-void LLViewerLogin::setGridChoice(EGridInfo grid)
-{
- if(grid < 0 || grid >= GRID_INFO_COUNT)
- {
- llerrs << "Invalid grid index specified." << llendl;
- return;
- }
- if(mGridChoice != grid || gSavedSettings.getS32("ServerChoice") != grid)
+//
+// LLGridManager::initialze - initialize the list of known grids based
+// on the fixed list of linden grids (fixed for security reasons)
+// the grids.xml file
+// and the command line.
+void LLGridManager::initialize(const std::string& grid_file)
+{
+ // default grid list.
+ // Don't move to a modifiable file for security reasons,
+ mGrid.clear() ;
+ // set to undefined
+ mGridList = LLSD();
+ mGridFile = grid_file;
+ // as we don't want an attacker to override our grid list
+ // to point the default grid to an invalid grid
+ addSystemGrid("None", "", "", "", DEFAULT_LOGIN_PAGE);
+
+
+
+ addSystemGrid("Agni",
+ MAINGRID,
+ "https://login.agni.lindenlab.com/cgi-bin/login.cgi",
+ "https://secondlife.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Aditi",
+ "util.aditi.lindenlab.com",
+ "https://login.aditi.lindenlab.com/cgi-bin/login.cgi",
+ "http://aditi-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Aruna",
+ "util.aruna.lindenlab.com",
+ "https://login.aruna.lindenlab.com/cgi-bin/login.cgi",
+ "http://aruna-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Bharati",
+ "util.bharati.lindenlab.com",
+ "https://login.bharati.lindenlab.com/cgi-bin/login.cgi",
+ "http://bharati-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Chandra",
+ "util.chandra.lindenlab.com",
+ "https://login.chandra.lindenlab.com/cgi-bin/login.cgi",
+ "http://chandra-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Damballah",
+ "util.damballah.lindenlab.com",
+ "https://login.damballah.lindenlab.com/cgi-bin/login.cgi",
+ "http://damballah-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Danu",
+ "util.danu.lindenlab.com",
+ "https://login.danu.lindenlab.com/cgi-bin/login.cgi",
+ "http://danu-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Durga",
+ "util.durga.lindenlab.com",
+ "https://login.durga.lindenlab.com/cgi-bin/login.cgi",
+ "http://durga-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Ganga",
+ "util.ganga.lindenlab.com",
+ "https://login.ganga.lindenlab.com/cgi-bin/login.cgi",
+ "http://ganga-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Mitra",
+ "util.mitra.lindenlab.com",
+ "https://login.mitra.lindenlab.com/cgi-bin/login.cgi",
+ "http://mitra-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Mohini",
+ "util.mohini.lindenlab.com",
+ "https://login.mohini.lindenlab.com/cgi-bin/login.cgi",
+ "http://mohini-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Nandi",
+ "util.nandi.lindenlab.com",
+ "https://login.nandi.lindenlab.com/cgi-bin/login.cgi",
+ "http://nandi-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Parvati",
+ "util.parvati.lindenlab.com",
+ "https://login.parvati.lindenlab.com/cgi-bin/login.cgi",
+ "http://parvati-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Radha",
+ "util.radha.lindenlab.com",
+ "https://login.radha.lindenlab.com/cgi-bin/login.cgi",
+ "http://radha-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Ravi",
+ "util.ravi.lindenlab.com",
+ "https://login.ravi.lindenlab.com/cgi-bin/login.cgi",
+ "http://ravi-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Siva",
+ "util.siva.lindenlab.com",
+ "https://login.siva.lindenlab.com/cgi-bin/login.cgi",
+ "http://siva-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Shakti",
+ "util.shakti.lindenlab.com",
+ "https://login.shakti.lindenlab.com/cgi-bin/login.cgi",
+ "http://shakti-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Soma",
+ "util.soma.lindenlab.com",
+ "https://login.soma.lindenlab.com/cgi-bin/login.cgi",
+ "http://soma-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Uma",
+ "util.uma.lindenlab.com",
+ "https://login.uma.lindenlab.com/cgi-bin/login.cgi",
+ "http://uma-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Vaak",
+ "util.vaak.lindenlab.com",
+ "https://login.vaak.lindenlab.com/cgi-bin/login.cgi",
+ "http://vaak-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Yami",
+ "util.yami.lindenlab.com",
+ "https://login.yami.lindenlab.com/cgi-bin/login.cgi",
+ "http://yami-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Local (Linden)",
+ "localhost",
+ "https://login.dmz.lindenlab.com/cgi-bin/login.cgi",
+ "",
+ DEFAULT_LOGIN_PAGE);
+
+
+ LLSD other_grids;
+ llifstream llsd_xml;
+ if (!grid_file.empty())
{
- mGridChoice = grid;
- if(GRID_INFO_LOCAL == mGridChoice)
- {
- mGridName = LOOPBACK_ADDRESS_STRING;
- }
- else if(GRID_INFO_OTHER == mGridChoice)
+ llsd_xml.open( grid_file.c_str(), std::ios::in | std::ios::binary );
+
+ // parse through the gridfile, inserting grids into the list unless
+ // they overwrite a linden grid.
+ if( llsd_xml.is_open())
{
- // *FIX:Mani - could this possibly be valid?
- mGridName = "other";
- }
- else
+ LLSDSerialize::fromXMLDocument( other_grids, llsd_xml );
+ if(other_grids.isMap())
+ {
+ for(LLSD::map_iterator grid_itr = other_grids.beginMap();
+ grid_itr != other_grids.endMap();
+ ++grid_itr)
+ {
+ LLSD::String key_name = grid_itr->first;
+ LLSD grid = grid_itr->second;
+ // TODO: Make sure gridfile specified label is not
+ // a system grid label
+ LL_DEBUGS("GridManager") << "reading: " << key_name << LL_ENDL;
+ if (mGridList.has(key_name) &&
+ mGridList[key_name].has(GRID_IS_SYSTEM_GRID_VALUE))
+ {
+ LL_DEBUGS("GridManager") << "Cannot override grid " << key_name << " as it's a system grid" << LL_ENDL;
+ // If the system grid does exist in the grids file, and it's marked as a favorite, set it as a favorite.
+ if(grid_itr->second.has(GRID_IS_FAVORITE_VALUE) && grid_itr->second[GRID_IS_FAVORITE_VALUE].asBoolean() )
+ {
+ mGridList[key_name][GRID_IS_FAVORITE_VALUE] = TRUE;
+ }
+ }
+ else
+ {
+ try
+ {
+ addGrid(grid);
+ LL_DEBUGS("GridManager") << "Added grid: " << key_name << LL_ENDL;
+ }
+ catch (...)
+ {
+ }
+ }
+ }
+ llsd_xml.close();
+ }
+ }
+ }
+
+ // load a grid from the command line.
+ // if the actual grid name is specified from the command line,
+ // set it as the 'selected' grid.
+ std::string cmd_line_grid = gSavedSettings.getString("CmdLineGridChoice");
+ if(!cmd_line_grid.empty())
+ {
+ // try to find the grid assuming the command line parameter is
+ // the case-insensitive 'label' of the grid. ie 'Agni'
+ mGrid = getGridByLabel(cmd_line_grid);
+ if(mGrid.empty())
{
- mGridName = gGridInfo[mGridChoice].mLabel;
+ // if we couldn't find it, assume the
+ // requested grid is the actual grid 'name' or index,
+ // which would be the dns name of the grid (for non
+ // linden hosted grids)
+ // If the grid isn't there, that's ok, as it will be
+ // automatically added later.
+ mGrid = cmd_line_grid;
}
+
+ }
+ else
+ {
+ // if a grid was not passed in via the command line, grab it from the CurrentGrid setting.
+ // if there's no current grid, that's ok as it'll be either set by the value passed
+ // in via the login uri if that's specified, or will default to maingrid
+ mGrid = gSavedSettings.getString("CurrentGrid");
+ }
+
+ if(mGrid.empty())
+ {
+ // no grid was specified so default to maingrid
+ LL_DEBUGS("GridManager") << "Setting grid to MAINGRID as no grid has been specified " << LL_ENDL;
+ mGrid = MAINGRID;
+
+ }
+
+ // generate a 'grid list' entry for any command line parameter overrides
+ // or setting overides that we'll add to the grid list or override
+ // any grid list entries with.
+ LLSD grid = LLSD::emptyMap();
+
+ if(mGridList.has(mGrid))
+ {
+ grid = mGridList[mGrid];
+ }
+ else
+ {
+ grid[GRID_VALUE] = mGrid;
+ // add the grid with the additional values, or update the
+ // existing grid if it exists with the given values
+ addGrid(grid);
+ }
- gSavedSettings.setS32("ServerChoice", mGridChoice);
- gSavedSettings.setString("CustomServer", "");
+ gSavedSettings.getControl("CurrentGrid")->getSignal()->connect(boost::bind(&LLGridManager::updateIsInProductionGrid, this));
+ // since above only triggers on changes, trigger the callback manually to initialize state
+ updateIsInProductionGrid();
+
+ LL_DEBUGS("GridManager") << "Selected grid is " << mGrid << LL_ENDL;
+ setGridChoice(mGrid);
+ if(mGridList[mGrid][GRID_LOGIN_URI_VALUE].isArray())
+ {
+ llinfos << "is array" << llendl;
}
}
-void LLViewerLogin::setGridChoice(const std::string& grid_name)
+LLGridManager::~LLGridManager()
{
- // Set the grid choice based on a string.
- // The string can be:
- // - a grid label from the gGridInfo table
- // - an ip address
- if(!grid_name.empty())
- {
- // find the grid choice from the user setting.
- int grid_index = GRID_INFO_NONE;
- for(;grid_index < GRID_INFO_OTHER; ++grid_index)
- {
- if(0 == LLStringUtil::compareInsensitive(gGridInfo[grid_index].mLabel, grid_name))
- {
- // Founding a matching label in the list...
- setGridChoice((EGridInfo)grid_index);
- break;
- }
- }
-
- if(GRID_INFO_OTHER == grid_index)
- {
- // *FIX:MEP Can and should we validate that this is an IP address?
- mGridChoice = GRID_INFO_OTHER;
- mGridName = grid_name;
- gSavedSettings.setS32("ServerChoice", mGridChoice);
- gSavedSettings.setString("CustomServer", mGridName);
- }
- }
+ saveFavorites();
}
-void LLViewerLogin::resetURIs()
+void LLGridManager::getGridInfo(const std::string &grid, LLSD& grid_info)
{
- // Clear URIs when picking a new server
- gSavedSettings.setLLSD("CmdLineLoginURI", LLSD::emptyArray());
- gSavedSettings.setString("CmdLineHelperURI", "");
+
+ grid_info = mGridList[grid];
+
+ // override any grid data with the command line info.
+
+ LLSD cmd_line_login_uri = gSavedSettings.getLLSD("CmdLineLoginURI");
+ if (cmd_line_login_uri.isString())
+ {
+ grid_info[GRID_LOGIN_URI_VALUE] = LLSD::emptyArray();
+ grid_info[GRID_LOGIN_URI_VALUE].append(cmd_line_login_uri);
+ }
+
+ // override the helper uri if it was passed in
+ std::string cmd_line_helper_uri = gSavedSettings.getString("CmdLineHelperURI");
+ if(!cmd_line_helper_uri.empty())
+ {
+ grid_info[GRID_HELPER_URI_VALUE] = cmd_line_helper_uri;
+ }
+
+ // override the login page if it was passed in
+ std::string cmd_line_login_page = gSavedSettings.getString("LoginPage");
+ if(!cmd_line_login_page.empty())
+ {
+ grid_info[GRID_LOGIN_PAGE_VALUE] = cmd_line_login_page;
+ }
}
-EGridInfo LLViewerLogin::getGridChoice() const
+
+//
+// LLGridManager::addGrid - add a grid to the grid list, populating the needed values
+// if they're not populated yet.
+//
+
+void LLGridManager::addGrid(LLSD& grid_data)
{
- return mGridChoice;
+ if (grid_data.isMap() && grid_data.has(GRID_VALUE))
+ {
+ std::string grid = utf8str_tolower(grid_data[GRID_VALUE]);
+
+ // grid should be in the form of a dns address
+ if (!grid.empty() &&
+ grid.find_first_not_of("abcdefghijklmnopqrstuvwxyz1234567890-_. ") != std::string::npos)
+ {
+ printf("grid name: %s", grid.c_str());
+ throw LLInvalidGridName(grid);
+ }
+
+ // populate the other values if they don't exist
+ if (!grid_data.has(GRID_LABEL_VALUE))
+ {
+ grid_data[GRID_LABEL_VALUE] = grid;
+ }
+ if (!grid_data.has(GRID_ID_VALUE))
+ {
+ grid_data[GRID_ID_VALUE] = grid;
+ }
+
+ // if the grid data doesn't include any of the URIs, then
+ // generate them from the grid, which should be a dns address
+ if (!grid_data.has(GRID_LOGIN_URI_VALUE))
+ {
+ grid_data[GRID_LOGIN_URI_VALUE] = LLSD::emptyArray();
+ grid_data[GRID_LOGIN_URI_VALUE].append(std::string("https://") +
+ grid + "/cgi-bin/login.cgi");
+ }
+ // Populate to the default values
+ if (!grid_data.has(GRID_LOGIN_PAGE_VALUE))
+ {
+ grid_data[GRID_LOGIN_PAGE_VALUE] = std::string("http://") + grid + "/app/login/";
+ }
+ if (!grid_data.has(GRID_HELPER_URI_VALUE))
+ {
+ grid_data[GRID_HELPER_URI_VALUE] = std::string("https://") + grid + "/helpers/";
+ }
+
+ if (!grid_data.has(GRID_LOGIN_IDENTIFIER_TYPES))
+ {
+ // non system grids and grids that haven't already been configured with values
+ // get both types of credentials.
+ grid_data[GRID_LOGIN_IDENTIFIER_TYPES] = LLSD::emptyArray();
+ grid_data[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_AGENT);
+ grid_data[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_ACCOUNT);
+ }
+
+ LL_DEBUGS("GridManager") << "ADDING: " << grid << LL_ENDL;
+ mGridList[grid] = grid_data;
+ }
}
-std::string LLViewerLogin::getGridLabel() const
+//
+// LLGridManager::addSystemGrid - helper for adding a system grid.
+void LLGridManager::addSystemGrid(const std::string& label,
+ const std::string& name,
+ const std::string& login,
+ const std::string& helper,
+ const std::string& login_page,
+ const std::string& login_id)
{
- if(mGridChoice == GRID_INFO_NONE)
+ LLSD grid = LLSD::emptyMap();
+ grid[GRID_VALUE] = name;
+ grid[GRID_LABEL_VALUE] = label;
+ grid[GRID_HELPER_URI_VALUE] = helper;
+ grid[GRID_LOGIN_URI_VALUE] = LLSD::emptyArray();
+ grid[GRID_LOGIN_URI_VALUE].append(login);
+ grid[GRID_LOGIN_PAGE_VALUE] = login_page;
+ grid[GRID_IS_SYSTEM_GRID_VALUE] = TRUE;
+ grid[GRID_LOGIN_IDENTIFIER_TYPES] = LLSD::emptyArray();
+ grid[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_AGENT);
+
+ grid[GRID_APP_SLURL_BASE] = SYSTEM_GRID_APP_SLURL_BASE;
+ if (login_id.empty())
+ {
+ grid[GRID_ID_VALUE] = name;
+ }
+ else
{
- return "None";
+ grid[GRID_ID_VALUE] = login_id;
}
- else if(mGridChoice < GRID_INFO_OTHER)
+
+ // only add the system grids beyond agni to the visible list
+ // if we're building a debug version.
+ if (name == std::string(MAINGRID))
{
- return gGridInfo[mGridChoice].mLabel;
+ grid[GRID_SLURL_BASE] = MAIN_GRID_SLURL_BASE;
+ grid[GRID_IS_FAVORITE_VALUE] = TRUE;
}
+ else
+ {
+ grid[GRID_SLURL_BASE] = llformat(SYSTEM_GRID_SLURL_BASE, label.c_str());
+ }
+ addGrid(grid);
+}
- return mGridName;
+// return a list of grid name -> grid label mappings for UI purposes
+std::map<std::string, std::string> LLGridManager::getKnownGrids(bool favorite_only)
+{
+ std::map<std::string, std::string> result;
+ for(LLSD::map_iterator grid_iter = mGridList.beginMap();
+ grid_iter != mGridList.endMap();
+ grid_iter++)
+ {
+ if(!favorite_only || grid_iter->second.has(GRID_IS_FAVORITE_VALUE))
+ {
+ result[grid_iter->first] = grid_iter->second[GRID_LABEL_VALUE].asString();
+ }
+ }
+
+ return result;
}
-std::string LLViewerLogin::getKnownGridLabel(EGridInfo grid_index) const
+
+void LLGridManager::setGridChoice(const std::string& grid)
{
- if(grid_index > GRID_INFO_NONE && grid_index < GRID_INFO_OTHER)
+ // Set the grid choice based on a string.
+ // The string can be:
+ // - a grid label from the gGridInfo table
+ // - a hostname
+ // - an ip address
+
+ // loop through. We could do just a hash lookup but we also want to match
+ // on label
+ std::string grid_name = grid;
+ if(!mGridList.has(grid_name))
+ {
+ // case insensitive
+ grid_name = getGridByLabel(grid);
+ }
+
+ if(grid_name.empty())
{
- return gGridInfo[grid_index].mLabel;
+ // the grid was not in the list of grids.
+ LLSD grid_data = LLSD::emptyMap();
+ grid_data[GRID_VALUE] = grid;
+ addGrid(grid_data);
}
- return gGridInfo[GRID_INFO_NONE].mLabel;
+ mGrid = grid;
+ gSavedSettings.setString("CurrentGrid", grid);
}
-void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const
+std::string LLGridManager::getGridByLabel( const std::string &grid_label, bool case_sensitive)
{
- // return the login uri set on the command line.
- LLControlVariable* c = gSavedSettings.getControl("CmdLineLoginURI");
- if(c)
+ for(LLSD::map_iterator grid_iter = mGridList.beginMap();
+ grid_iter != mGridList.endMap();
+ grid_iter++)
{
- LLSD v = c->getValue();
- if(v.isArray())
- {
- for(LLSD::array_const_iterator itr = v.beginArray();
- itr != v.endArray(); ++itr)
- {
- std::string uri = itr->asString();
- if(!uri.empty())
- {
- uris.push_back(uri);
- }
- }
- }
- else
+ if (grid_iter->second.has(GRID_LABEL_VALUE))
{
- std::string uri = v.asString();
- if(!uri.empty())
+ if (0 == (case_sensitive?LLStringUtil::compareStrings(grid_label, grid_iter->second[GRID_LABEL_VALUE].asString()):
+ LLStringUtil::compareInsensitive(grid_label, grid_iter->second[GRID_LABEL_VALUE].asString())))
{
- uris.push_back(uri);
+ return grid_iter->first;
}
}
}
+ return std::string();
+}
- // If there was no command line uri...
- if(uris.empty())
+void LLGridManager::getLoginURIs(std::vector<std::string>& uris)
+{
+ uris.clear();
+ LLSD cmd_line_login_uri = gSavedSettings.getLLSD("CmdLineLoginURI");
+ if (cmd_line_login_uri.isString())
+ {
+ uris.push_back(cmd_line_login_uri);
+ return;
+ }
+ for (LLSD::array_iterator llsd_uri = mGridList[mGrid][GRID_LOGIN_URI_VALUE].beginArray();
+ llsd_uri != mGridList[mGrid][GRID_LOGIN_URI_VALUE].endArray();
+ llsd_uri++)
{
- // If its a known grid choice, get the uri from the table,
- // else try the grid name.
- if(mGridChoice > GRID_INFO_NONE && mGridChoice < GRID_INFO_OTHER)
- {
- uris.push_back(gGridInfo[mGridChoice].mLoginURI);
- }
- else
- {
- uris.push_back(mGridName);
- }
+ uris.push_back(llsd_uri->asString());
}
}
-std::string LLViewerLogin::getHelperURI() const
+std::string LLGridManager::getHelperURI()
{
- std::string helper_uri = gSavedSettings.getString("CmdLineHelperURI");
- if (helper_uri.empty())
+ std::string cmd_line_helper_uri = gSavedSettings.getString("CmdLineHelperURI");
+ if(!cmd_line_helper_uri.empty())
{
- // grab URI from selected grid
- if(mGridChoice > GRID_INFO_NONE && mGridChoice < GRID_INFO_OTHER)
- {
- helper_uri = gGridInfo[mGridChoice].mHelperURI;
- }
-
- if (helper_uri.empty())
- {
- // what do we do with unnamed/miscellaneous grids?
- // for now, operations that rely on the helper URI (currency/land purchasing) will fail
- }
+ return cmd_line_helper_uri;
}
- return helper_uri;
+ return mGridList[mGrid][GRID_HELPER_URI_VALUE];
}
-bool LLViewerLogin::isInProductionGrid()
+std::string LLGridManager::getLoginPage()
{
+ // override the login page if it was passed in
+ std::string cmd_line_login_page = gSavedSettings.getString("LoginPage");
+ if(!cmd_line_login_page.empty())
+ {
+ return cmd_line_login_page;
+ }
+
+ return mGridList[mGrid][GRID_LOGIN_PAGE_VALUE];
+}
+
+void LLGridManager::updateIsInProductionGrid()
+{
+ mIsInProductionGrid = false;
+
// *NOTE:Mani This used to compare GRID_INFO_AGNI to gGridChoice,
// but it seems that loginURI trumps that.
std::vector<std::string> uris;
getLoginURIs(uris);
+ if (uris.empty())
+ {
+ mIsInProductionGrid = true;
+ return;
+ }
LLStringUtil::toLower(uris[0]);
if((uris[0].find("agni") != std::string::npos))
{
- return true;
+ mIsInProductionGrid = true;
+ return;
+ }
+}
+
+bool LLGridManager::isInProductionGrid()
+{
+ return mIsInProductionGrid;
+}
+
+void LLGridManager::saveFavorites()
+{
+ // filter out just those marked as favorites
+ LLSD output_grid_list = LLSD::emptyMap();
+ for(LLSD::map_iterator grid_iter = mGridList.beginMap();
+ grid_iter != mGridList.endMap();
+ grid_iter++)
+ {
+ if(grid_iter->second.has(GRID_IS_FAVORITE_VALUE))
+ {
+ output_grid_list[grid_iter->first] = grid_iter->second;
+ }
+ }
+ llofstream llsd_xml;
+ llsd_xml.open( mGridFile.c_str(), std::ios::out | std::ios::binary);
+ LLSDSerialize::toPrettyXML(output_grid_list, llsd_xml);
+ llsd_xml.close();
+}
+
+
+// build a slurl for the given region within the selected grid
+std::string LLGridManager::getSLURLBase(const std::string& grid)
+{
+ std::string grid_base;
+ if(mGridList.has(grid) && mGridList[grid].has(GRID_SLURL_BASE))
+ {
+ return mGridList[grid][GRID_SLURL_BASE].asString();
}
+ else
+ {
+ return llformat(DEFAULT_SLURL_BASE, grid.c_str());
+ }
+}
- return false;
+// build a slurl for the given region within the selected grid
+std::string LLGridManager::getAppSLURLBase(const std::string& grid)
+{
+ std::string grid_base;
+ if(mGridList.has(grid) && mGridList[grid].has(GRID_APP_SLURL_BASE))
+ {
+ return mGridList[grid][GRID_APP_SLURL_BASE].asString();
+ }
+ else
+ {
+ return llformat(DEFAULT_APP_SLURL_BASE, grid.c_str());
+ }
}