void LLGridManager::setGridChoice(const std::string& grid) { // 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()) { // the grid was not in the list of grids. LLSD grid_data = LLSD::emptyMap(); grid_data[GRID_VALUE] = grid; addGrid(grid_data); } mGrid = grid; gSavedSettings.setString("CurrentGrid", grid); updateIsInProductionGrid(); }
void LLGridManager::setGridChoice(const std::string& grid) { if(grid.empty()) return; // 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 mReadyToLogin = false; std::string grid_name = grid; if(mGridList.has(grid_name)) { LL_DEBUGS("GridManager")<< "got grid from grid list: " << grid << LL_ENDL; } else { // case insensitive grid_name = getGridByLabel(grid); if (!grid_name.empty()) LL_DEBUGS("GridManager")<< "got grid by label: " << grid << LL_ENDL; } if(grid_name.empty()) { // case insensitive grid_name = getGridByGridNick(grid); if (!grid_name.empty()) LL_DEBUGS("GridManager")<< "got grid by gridnick: " << grid << LL_ENDL; } if(grid_name.empty()) { LL_DEBUGS("GridManager")<< "trying to fetch grid: " << grid << LL_ENDL; // the grid was not in the list of grids. GridEntry* grid_entry = new GridEntry; grid_entry->grid = LLSD::emptyMap(); grid_entry->grid[GRID_VALUE] = grid; grid_entry->set_current = true; addGrid(grid_entry, FETCH); } else { LL_DEBUGS("GridManager")<< "setting grid choice: " << grid << LL_ENDL; mGrid = grid; gSavedSettings.setString("CurrentGrid", grid); updateIsInProductionGrid(); mReadyToLogin = true; } }
std::string LLGridManager::getGridByProbing( const std::string &probe_for, bool case_sensitive) { std::string ret; ret = getGridByHostName(probe_for, case_sensitive); if (ret.empty()) { getGridByGridNick(probe_for, case_sensitive); } if (ret.empty()) { getGridByLabel(probe_for, case_sensitive); } return ret; }
// // 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(); // 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("Second Life", MAINGRID, "https://login.agni.lindenlab.com/cgi-bin/login.cgi", "https://secondlife.com/helpers/", DEFAULT_LOGIN_PAGE); addSystemGrid("Second Life Beta", "util.aditi.lindenlab.com", "https://login.aditi.lindenlab.com/cgi-bin/login.cgi", "http://aditi-secondlife.webdev.lindenlab.com/helpers/", DEFAULT_LOGIN_PAGE); LLSD other_grids; llifstream llsd_xml; // load the systemwide grids file from std::string globalGridFile = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "grids.xml"); LL_INFOS("Grid Manager") << globalGridFile << LL_ENDL; if (!globalGridFile.empty()) { llsd_xml.open( globalGridFile.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()) { 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 the user grid file mGridFile = grid_file; LL_INFOS("Grid Manager") << mGridFile << LL_ENDL; if (!grid_file.empty()) { 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()) { 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()) { // 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); } LLControlVariablePtr grid_control = gSavedSettings.getControl("CurrentGrid"); if (grid_control.notNull()) { grid_control->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 LLGridManager::initCmdLineGrids() { mCommandLineDone = true; // load a grid from the command line. // if the actual grid name is specified from the command line, // set it as the 'selected' grid. LLSD cmd_line_login_uri = gSavedSettings.getLLSD("CmdLineLoginURI"); if (cmd_line_login_uri.isString() && !cmd_line_login_uri.asString().empty()) { mGrid = cmd_line_login_uri.asString(); gSavedSettings.setLLSD("CmdLineLoginURI", LLSD::emptyArray()); //in case setGridChoice tries to addGrid //and addGrid recurses here. setGridChoice(mGrid); return; } 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 = getGridByGridNick(cmd_line_grid); gSavedSettings.setString("CmdLineGridChoice",std::string()); if(mGrid.empty()) { mGrid = getGridByLabel(cmd_line_grid); } if(mGrid.empty()) { // 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. if(mGridList.has(mGrid)) { // grid_entry->grid = mGridList[mGrid]; LL_DEBUGS("GridManager") << "Setting commandline grid " << mGrid << LL_ENDL; setGridChoice(mGrid); } else { LL_DEBUGS("GridManager") << "Trying to fetch commandline grid " << mGrid << LL_ENDL; GridEntry* grid_entry = new GridEntry; grid_entry->set_current = true; grid_entry->grid = LLSD::emptyMap(); grid_entry->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_entry, FETCH); } }