svn merge -r73880:73879 svn+ssh://svn/svn/linden/release. backing out viewer auth merge

master
Tess Chu 2007-11-15 22:39:12 +00:00
parent 291d99bc66
commit 813b140d07
21 changed files with 653 additions and 581 deletions

View File

@ -38,7 +38,6 @@ import re
import shutil
import sys
import tarfile
import errno
def path_ancestors(path):
path = os.path.normpath(path)
@ -464,12 +463,6 @@ class LLManifest(object):
return
# only copy if it's not excluded
if(self.includes(src, dst)):
try:
os.unlink(dst)
except OSError, err:
if err.errno != errno.ENOENT:
raise
shutil.copy2(src, dst)
def ccopytree(self, src, dst):

View File

@ -40,8 +40,6 @@
#include "../llmath/lluuid.h"
// system includes
#include <boost/tokenizer.hpp>
// static
std::string LLURI::escape(const std::string& str, const std::string & allowed)
@ -132,7 +130,7 @@ LLURI::LLURI()
LLURI::LLURI(const std::string& escaped_str)
{
std::string::size_type delim_pos;
std::string::size_type delim_pos, delim_pos2;
delim_pos = escaped_str.find(':');
std::string temp;
if (delim_pos == std::string::npos)
@ -146,39 +144,13 @@ LLURI::LLURI(const std::string& escaped_str)
mEscapedOpaque = escaped_str.substr(delim_pos+1);
}
parseAuthorityAndPathUsingOpaque();
delim_pos = mEscapedPath.find('?');
if (delim_pos != std::string::npos)
{
mEscapedQuery = mEscapedPath.substr(delim_pos+1);
mEscapedPath = mEscapedPath.substr(0,delim_pos);
}
}
static BOOL isDefault(const std::string& scheme, U16 port)
{
if (scheme == "http")
return port == 80;
if (scheme == "https")
return port == 443;
if (scheme == "ftp")
return port == 21;
return FALSE;
}
void LLURI::parseAuthorityAndPathUsingOpaque()
{
if (mScheme == "http" || mScheme == "https" ||
mScheme == "ftp" || mScheme == "secondlife" )
if (mScheme == "http" || mScheme == "https" || mScheme == "ftp")
{
if (mEscapedOpaque.substr(0,2) != "//")
{
return;
}
std::string::size_type delim_pos, delim_pos2;
delim_pos = mEscapedOpaque.find('/', 2);
delim_pos2 = mEscapedOpaque.find('?', 2);
// no path, no query
@ -210,12 +182,27 @@ void LLURI::parseAuthorityAndPathUsingOpaque()
mEscapedPath = mEscapedOpaque.substr(delim_pos);
}
}
else if (mScheme == "about")
delim_pos = mEscapedPath.find('?');
if (delim_pos != std::string::npos)
{
mEscapedPath = mEscapedOpaque;
mEscapedQuery = mEscapedPath.substr(delim_pos+1);
mEscapedPath = mEscapedPath.substr(0,delim_pos);
}
}
static BOOL isDefault(const std::string& scheme, U16 port)
{
if (scheme == "http")
return port == 80;
if (scheme == "https")
return port == 443;
if (scheme == "ftp")
return port == 21;
return FALSE;
}
LLURI::LLURI(const std::string& scheme,
const std::string& userName,
const std::string& password,
@ -453,22 +440,6 @@ std::string LLURI::path() const
return unescape(mEscapedPath);
}
LLSD LLURI::pathArray() const
{
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
boost::char_separator<char> sep("/", "", boost::drop_empty_tokens);
tokenizer tokens(mEscapedPath, sep);
tokenizer::iterator it = tokens.begin();
tokenizer::iterator end = tokens.end();
LLSD params;
for ( ; it != end; ++it)
{
params.append(*it);
}
return params;
}
std::string LLURI::query() const
{
return unescape(mEscapedQuery);

View File

@ -107,7 +107,7 @@ public:
BOOL defaultPort() const; // true if port is default for scheme
const std::string& escapedPath() const { return mEscapedPath; }
std::string path() const; // ex.: "/abc/def", includes leading slash
LLSD pathArray() const; // above decoded into an array of strings
// LLSD pathArray() const; // above decoded into an array of strings
std::string query() const; // ex.: "x=34", section after "?"
const std::string& escapedQuery() const { return mEscapedQuery; }
LLSD queryMap() const; // above decoded into a map
@ -135,11 +135,6 @@ public:
//@}
private:
// only "http", "https", "ftp", and "secondlife" schemes are parsed
// secondlife scheme parses authority as "" and includes it as part of
// the path. See lluri_tut.cpp
// i.e. secondlife://app/login has mAuthority = "" and mPath = "/app/login"
void parseAuthorityAndPathUsingOpaque();
std::string mScheme;
std::string mEscapedOpaque;
std::string mEscapedAuthority;

View File

@ -1,17 +0,0 @@
#!/bin/bash
# Send a URL of the form secondlife://... to Second Life.
#
URL="$1"
if [ -z "$URL" ]; then
echo Usage: $0 secondlife://...
exit
fi
RUN_PATH=`dirname "$0" || echo .`
cd "${RUN_PATH}"
exec ./secondlife -url \'"${URL}"\'

View File

@ -1,46 +0,0 @@
#!/bin/bash
# Register a protocol handler (default: handle_secondlifeprotocol.sh) for
# URLs of the form secondlife://...
#
HANDLER="$1"
RUN_PATH=`dirname "$0" || echo .`
cd "${RUN_PATH}"
if [ -z "$HANDLER" ]; then
HANDLER=`pwd`/handle_secondlifeprotocol.sh
fi
# Register handler for GNOME-aware apps
LLGCONFTOOL2=gconftool-2
if which ${LLGCONFTOOL2} >/dev/null; then
(${LLGCONFTOOL2} -s -t string /desktop/gnome/url-handlers/secondlife/command "${HANDLER} \"%s\"" && ${LLGCONFTOOL2} -s -t bool /desktop/gnome/url-handlers/secondlife/enabled true) || echo Warning: Did not register secondlife:// handler with GNOME: ${LLGCONFTOOL2} failed.
else
echo Warning: Did not register secondlife:// handler with GNOME: ${LLGCONFTOOL2} not found.
fi
# Register handler for KDE-aware apps
if [ -z "$KDEHOME" ]; then
KDEHOME=~/.kde
fi
LLKDEPROTDIR=${KDEHOME}/share/services
if [ -d "$LLKDEPROTDIR" ]; then
LLKDEPROTFILE=${LLKDEPROTDIR}/secondlife.protocol
cat > ${LLKDEPROTFILE} <<EOF || echo Warning: Did not register secondlife:// handler with KDE: Could not write ${LLKDEPROTFILE}
[Protocol]
exec=${HANDLER} '%u'
protocol=secondlife
input=none
output=none
helper=true
listing=
reading=false
writing=false
makedir=false
deleting=false
EOF
else
echo Warning: Did not register secondlife:// handler with KDE: Directory $LLKDEPROTDIR does not exist.
fi

View File

@ -61,10 +61,6 @@ fi
RUN_PATH=`dirname "$0" || echo .`
cd "${RUN_PATH}"
# Re-register the secondlife:// protocol handler every launch, for now.
./register_secondlifeprotocol.sh
if [ -n "$LL_TCMALLOC" ]; then
tcmalloc_libs='/usr/lib/libtcmalloc.so.0 /usr/lib/libstacktrace.so.0 /lib/libpthread.so.0'
all=1

View File

@ -46,7 +46,7 @@ class LLCommandHandlerRegistry
public:
static LLCommandHandlerRegistry& instance();
void add(const char* cmd, LLCommandHandler* handler);
bool dispatch(const std::string& cmd, const LLSD& params, const LLSD& queryMap);
bool dispatch(const std::string& cmd, const std::vector<std::string>& params);
private:
std::map<std::string, LLCommandHandler*> mMap;
@ -68,14 +68,13 @@ void LLCommandHandlerRegistry::add(const char* cmd, LLCommandHandler* handler)
}
bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
const LLSD& params,
const LLSD& queryMap)
const std::vector<std::string>& params)
{
std::map<std::string, LLCommandHandler*>::iterator it = mMap.find(cmd);
if (it == mMap.end()) return false;
LLCommandHandler* handler = it->second;
if (!handler) return false;
return handler->handle(params, queryMap);
return handler->handle(params);
}
//---------------------------------------------------------------------------
@ -98,7 +97,7 @@ LLCommandHandler::~LLCommandHandler()
//---------------------------------------------------------------------------
// static
bool LLCommandDispatcher::dispatch(const std::string& cmd, const LLSD& params, const LLSD& queryMap)
bool LLCommandDispatcher::dispatch(const std::string& cmd, const std::vector<std::string>& params)
{
return LLCommandHandlerRegistry::instance().dispatch(cmd, params, queryMap);
return LLCommandHandlerRegistry::instance().dispatch(cmd, params);
}

View File

@ -44,7 +44,7 @@ public:
LLFooHandler() : LLCommandHandler("foo") { }
// Your code here
bool handle(const LLSD& tokens, const LLSD& queryMap)
bool handle(const std::vector<std::string>& tokens)
{
if (tokens.size() < 1) return false;
LLUUID id( tokens[0] );
@ -65,8 +65,7 @@ public:
virtual ~LLCommandHandler();
virtual bool handle(const LLSD& params,
const LLSD& queryMap) = 0;
virtual bool handle(const std::vector<std::string>& params) = 0;
// Execute the command with a provided (possibly empty)
// list of parameters.
// Return true if you did something, false if the parameters
@ -77,9 +76,7 @@ public:
class LLCommandDispatcher
{
public:
static bool dispatch(const std::string& cmd,
const LLSD& params,
const LLSD& queryMap);
static bool dispatch(const std::string& cmd, const std::vector<std::string>& params);
// Execute a command registered via the above mechanism,
// passing string parameters.
// Returns true if command was found and executed correctly.

View File

@ -34,14 +34,14 @@ class LLEventHandler : public LLCommandHandler
{
public:
LLEventHandler() : LLCommandHandler("event") { }
bool handle(const LLSD& tokens, const LLSD& queryMap)
bool handle(const std::vector<std::string>& tokens)
{
if (tokens.size() < 2)
{
return false;
}
U32 event_id = tokens[0].asInteger();
if (tokens[1].asString() == "about")
U32 event_id = atoi(tokens[0].c_str());
if (tokens[1] == "about")
{
LLFloaterEventInfo::show(event_id);
return true;

View File

@ -29,7 +29,7 @@ class LLParcelHandler : public LLCommandHandler
{
public:
LLParcelHandler() : LLCommandHandler("parcel") { }
bool handle(const LLSD& params, const LLSD& queryMap)
bool handle(const std::vector<std::string>& params)
{
if (params.size() < 2)
{
@ -40,7 +40,7 @@ public:
{
return false;
}
if (params[1].asString() == "about")
if (params[1] == "about")
{
LLFloaterParcelInfo::show(parcel_id);
return true;

View File

@ -47,16 +47,13 @@
#include "llspinctrl.h"
#include "message.h"
#include "llcommandhandler.h"
#include "llfloaterabout.h"
#include "llfloaterpreference.h"
#include "llpanelnetwork.h"
#include "llpanelaudioprefs.h"
#include "llpaneldisplay.h"
#include "llpaneldebug.h"
#include "llpanelgeneral.h"
#include "llpanelinput.h"
#include "llpanellogin.h"
#include "llpanelLCD.h"
#include "llpanelmsgs.h"
#include "llpanelweb.h"
@ -74,13 +71,6 @@
#include "llkeyboard.h"
#include "llscrollcontainer.h"
#if LL_WINDOWS
// for Logitech LCD keyboards / speakers
#ifndef LL_LOGITECH_LCD_H
#include "lllogitechlcd.h"
#endif
extern llLCD *gLcdScreen;
#endif
const S32 PREF_BORDER = 4;
const S32 PREF_PAD = 5;
@ -91,20 +81,13 @@ const S32 PREF_FLOATER_MIN_HEIGHT = 2 * SCROLLBAR_SIZE + 2 * LLPANEL_BORDER_WIDT
LLFloaterPreference* LLFloaterPreference::sInstance = NULL;
class LLPreferencesHandler : public LLCommandHandler
{
public:
LLPreferencesHandler() : LLCommandHandler("preferences") { }
bool handle(const LLSD& tokens, const LLSD& queryMap)
{
LLFloaterPreference::show(NULL);
return true;
}
};
LLPreferencesHandler gPreferencesHandler;
#if LL_WINDOWS
// for Logitech LCD keyboards / speakers
#ifndef LL_LOGITECH_LCD_H
#include "lllogitechlcd.h"
#endif
extern llLCD *gLcdScreen;
#endif
// Must be done at run time, not compile time. JC
S32 pref_min_width()
@ -427,8 +410,6 @@ void LLFloaterPreference::show(void*)
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
gAgent.sendReliableMessage();
}
LLPanelLogin::setAlwaysRefresh(true);
}
@ -442,9 +423,6 @@ void LLFloaterPreference::onClickAbout(void*)
// static
void LLFloaterPreference::onBtnOK( void* userdata )
{
//refresh splash page if we're displaying it
LLPanelLogin::loadLoginPage();
LLFloaterPreference *fp =(LLFloaterPreference *)userdata;
// commit any outstanding text entry
if (fp->hasFocus())
@ -488,16 +466,6 @@ void LLFloaterPreference::onBtnApply( void* userdata )
}
}
fp->apply();
//refresh splash page if we're displaying it
LLPanelLogin::loadLoginPage();
}
void LLFloaterPreference::onClose(bool app_quitting)
{
LLPanelLogin::setAlwaysRefresh(false);
LLFloater::onClose(app_quitting);
}

View File

@ -117,7 +117,6 @@ protected:
LLPreferenceCore *mPreferenceCore;
/*virtual*/ void draw();
/*virtual*/ void onClose(bool app_quitting);
LLButton* mAboutBtn;
LLButton *mOKBtn;

View File

@ -44,16 +44,13 @@
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcommandhandler.h"
#include "llcombobox.h"
#include "llcurl.h"
#include "llviewercontrol.h"
#include "llfloaterabout.h"
#include "llfloatertest.h"
#include "llfloaterpreference.h"
#include "llfocusmgr.h"
#include "lllineeditor.h"
#include "llstartup.h"
#include "lltextbox.h"
#include "llui.h"
#include "lluiconstants.h"
@ -77,145 +74,11 @@
#include "llglheaders.h"
LLString load_password_from_disk(void);
void save_password_to_disk(const char* hashed_password);
const S32 BLACK_BORDER_HEIGHT = 160;
const S32 MAX_PASSWORD = 16;
LLPanelLogin *LLPanelLogin::sInstance = NULL;
//parses the input url and returns true if afterwards
//a web-login-key, firstname and lastname is set
bool LLLoginHandler::parseDirectLogin(std::string url)
{
LLURI uri(url);
parse(uri.queryMap());
if (mWebLoginKey.isNull() ||
mFirstName.empty() ||
mLastName.empty())
{
return false;
}
else
{
return true;
}
}
void LLLoginHandler::parse(const LLSD& queryMap)
{
mWebLoginKey = queryMap["web_login_key"].asUUID();
mFirstName = queryMap["first_name"].asString();
mLastName = queryMap["last_name"].asString();
if (queryMap["grid"].asString() == "aditi")
{
gGridChoice = GRID_INFO_ADITI;
}
else if (queryMap["grid"].asString() == "agni")
{
gGridChoice = GRID_INFO_AGNI;
}
else if (queryMap["grid"].asString() == "siva")
{
gGridChoice = GRID_INFO_SIVA;
}
else if (queryMap["grid"].asString() == "durga")
{
gGridChoice = GRID_INFO_DURGA;
}
else if (queryMap["grid"].asString() == "shakti")
{
gGridChoice = GRID_INFO_SHAKTI;
}
else if (queryMap["grid"].asString() == "soma")
{
gGridChoice = GRID_INFO_SOMA;
}
else if (queryMap["grid"].asString() == "ganga")
{
gGridChoice = GRID_INFO_GANGA;
}
else if (queryMap["grid"].asString() == "vaak")
{
gGridChoice = GRID_INFO_VAAK;
}
else if (queryMap["grid"].asString() == "uma")
{
gGridChoice = GRID_INFO_UMA;
}
snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); /* Flawfinder: ignore */
LLAppViewer::instance()->resetURIs();
LLString startLocation = queryMap["location"].asString();
if (startLocation == "specify")
{
LLURLSimString::setString(queryMap["region"].asString());
}
else if (startLocation == "home")
{
gSavedSettings.setBOOL("LoginLastLocation", FALSE);
LLURLSimString::setString("");
}
else if (startLocation == "last")
{
gSavedSettings.setBOOL("LoginLastLocation", TRUE);
LLURLSimString::setString("");
}
}
bool LLLoginHandler::handle(const LLSD& tokens,
const LLSD& queryMap)
{
parse(queryMap);
//if we haven't initialized stuff yet, this is
//coming in from the GURL handler, just parse
if (STATE_FIRST == LLStartUp::getStartupState())
{
return true;
}
LLString password = queryMap["password"].asString();
if (!password.empty())
{
gSavedSettings.setBOOL("RememberPassword", TRUE);
if (password.substr(0,3) != "$1$")
{
LLMD5 pass((unsigned char*)password.c_str());
char md5pass[33]; /* Flawfinder: ignore */
pass.hex_digest(md5pass);
password = md5pass;
save_password_to_disk(password.c_str());
}
}
else
{
save_password_to_disk(NULL);
gSavedSettings.setBOOL("RememberPassword", FALSE);
}
if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) //on splash page
{
if (mWebLoginKey.isNull()) {
LLPanelLogin::loadLoginPage();
} else {
LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
}
}
return true;
}
LLLoginHandler gLoginHandler;
BOOL LLPanelLogin::sCapslockDidNotification = FALSE;
// helper class that trys to download a URL from a web site and calls a method
// on parent class indicating if the web server is working or not
@ -294,11 +157,92 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
mLogoImage = gImageList.getImage("startup_logo.tga", LLUUID::null, MIPMAP_FALSE, TRUE);
gUICtrlFactory->buildPanel(this, "panel_login.xml");
//leave room for the login menu bar
setRect(LLRect(0, rect.getHeight()-18, rect.getWidth(), 0));
//setRect(rect);
reshape(rect.getWidth(), rect.getHeight());
childSetPrevalidate("first_name_edit", LLLineEditor::prevalidatePrintableNoSpace);
childSetPrevalidate("last_name_edit", LLLineEditor::prevalidatePrintableNoSpace);
childSetCommitCallback("password_edit", mungePassword);
childSetKeystrokeCallback("password_edit", onPassKey, this);
childSetUserData("password_edit", this);
LLLineEditor* edit = LLUICtrlFactory::getLineEditorByName(this, "password_edit");
if (edit) edit->setDrawAsterixes(TRUE);
LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(this, "start_location_combo");
if (combo)
{
combo->setAllowTextEntry(TRUE, 128, FALSE);
// The XML file loads the combo with the following labels:
// 0 - "My Home"
// 1 - "My Last Location"
// 2 - "<Type region name>"
BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation");
LLString sim_string = LLURLSimString::sInstance.mSimString;
if (!sim_string.empty())
{
// Replace "<Type region name>" with this region name
combo->remove(2);
combo->add( sim_string );
combo->setTextEntry(sim_string);
combo->setCurrentByIndex( 2 );
}
else if (login_last)
{
combo->setCurrentByIndex( 1 );
}
else
{
combo->setCurrentByIndex( 0 );
}
combo->setCommitCallback( &LLPanelGeneral::set_start_location );
}
// Specific servers added later.
childSetVisible("server_combo", show_server);
childSetAction("new_account_btn", onClickNewAccount, this);
childSetVisible("new_account_btn", !gHideLinks);
childSetAction("connect_btn", onClickConnect, this);
setDefaultBtn("connect_btn");
childSetAction("preferences_btn", LLFloaterPreference::show, this);
childSetAction("quit_btn", onClickQuit, this);
LLTextBox* version_text = LLUICtrlFactory::getTextBoxByName(this, "version_text");
if (version_text)
{
LLString version = llformat("%d.%d.%d (%d)",
LL_VERSION_MAJOR,
LL_VERSION_MINOR,
LL_VERSION_PATCH,
LL_VIEWER_BUILD );
version_text->setText(version);
version_text->setClickedCallback(onClickVersion);
version_text->setCallbackUserData(this);
}
LLTextBox* channel_text = LLUICtrlFactory::getTextBoxByName(this, "channel_text");
if (channel_text)
{
channel_text->setText(gChannelName);
channel_text->setClickedCallback(onClickVersion);
channel_text->setCallbackUserData(this);
}
LLTextBox* forgot_password_text = LLUICtrlFactory::getTextBoxByName(this, "forgot_password_text");
if (forgot_password_text)
{
forgot_password_text->setClickedCallback(onClickForgotPassword);
}
// get the web browser control
#if LL_LIBXUL_ENABLED
LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(this, "login_html");
@ -322,11 +266,11 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
// force the size to be correct (XML doesn't seem to be sufficient to do this) (with some padding so the other login screen doesn't show through)
LLRect htmlRect = mRect;
htmlRect.setCenterAndSize( mRect.getCenterX() - 2, mRect.getCenterY(), mRect.getWidth() + 6, mRect.getHeight());
htmlRect.setCenterAndSize( mRect.getCenterX() - 2, mRect.getCenterY() + 40, mRect.getWidth() + 6, mRect.getHeight() - 78 );
web_browser->setRect( htmlRect );
web_browser->reshape( htmlRect.getWidth(), htmlRect.getHeight(), TRUE );
reshape( mRect.getWidth(), mRect.getHeight(), 1 );
reshape( mRect.getWidth(), mRect.getHeight(), 1 );
// kick off a request to grab the url manually
gResponsePtr = LLIamHereLogin::build( this );
LLHTTPClient::get( childGetValue( "real_url" ).asString(), gResponsePtr );
@ -336,6 +280,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
#endif
// Initialize visibility (and don't force visibility - use prefs)
refreshLocation( false );
}
void LLPanelLogin::setSiteIsAlive( bool alive )
@ -347,8 +292,9 @@ void LLPanelLogin::setSiteIsAlive( bool alive )
{
if ( web_browser )
{
loadLoginPage();
// navigate to the "real" page
web_browser->navigateTo( childGetValue( "real_url" ).asString() );
// mark as available
mHtmlAvailable = TRUE;
};
@ -370,6 +316,21 @@ void LLPanelLogin::setSiteIsAlive( bool alive )
#endif
}
void LLPanelLogin::mungePassword(LLUICtrl* caller, void* user_data)
{
LLPanelLogin* self = (LLPanelLogin*)user_data;
LLLineEditor* editor = (LLLineEditor*)caller;
std::string password = editor->getText();
// Re-md5 if we've changed at all
if (password != self->mIncomingPassword)
{
LLMD5 pass((unsigned char *)password.c_str());
char munged_password[MD5HEX_STR_SIZE];
pass.hex_digest(munged_password);
self->mMungedPassword = munged_password;
}
}
LLPanelLogin::~LLPanelLogin()
{
@ -405,6 +366,13 @@ void LLPanelLogin::draw()
glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * mRect.getWidth(), 0.f, 0.f);
glScalef(image_aspect / view_aspect, 1.f, 1.f);
}
// Don't maintain aspect ratio if screen wider than image. This results in the
// hand being partially cut off. JC
//else
//{
// glTranslatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * (F32)BLACK_BORDER_HEIGHT, 0.f);
// glScalef(1.f, view_aspect / image_aspect, 1.f);
//}
S32 width = mRect.getWidth();
S32 height = mRect.getHeight();
@ -413,6 +381,9 @@ void LLPanelLogin::draw()
{
// draw a background box in black
gl_rect_2d( 0, height - 264, width, 264, LLColor4( 0.0f, 0.0f, 0.0f, 1.f ) );
// draw the bottom part of the background image - just the blue background to the native client UI
gl_draw_scaled_image(0, -264, width + 8, mLogoImage->getHeight(), mLogoImage);
}
else
{
@ -480,14 +451,54 @@ BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent)
return LLPanel::handleKeyHere(key, mask, called_from_parent);
}
// virtual
void LLPanelLogin::setFocus(BOOL b)
{
if(b != hasFocus())
{
if(b)
{
LLPanelLogin::giveFocus();
}
else
{
LLPanel::setFocus(b);
}
}
}
// static
void LLPanelLogin::giveFocus()
{
if( sInstance )
{
// Grab focus and move cursor to first blank input field
std::string first = sInstance->childGetText("first_name_edit");
std::string pass = sInstance->childGetText("password_edit");
if (sInstance)
sInstance->setFocus(TRUE);
BOOL have_first = !first.empty();
BOOL have_pass = !pass.empty();
LLLineEditor* edit = NULL;
if (have_first && !have_pass)
{
// User saved his name but not his password. Move
// focus to password field.
edit = LLUICtrlFactory::getLineEditorByName(sInstance, "password_edit");
}
else
{
// User doesn't have a name, so start there.
edit = LLUICtrlFactory::getLineEditorByName(sInstance, "first_name_edit");
}
if (edit)
{
edit->setFocus(TRUE);
edit->selectAll();
}
}
}
@ -499,20 +510,175 @@ void LLPanelLogin::show(const LLRect &rect,
{
new LLPanelLogin(rect, show_server, callback, callback_data);
LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html");
if (!web_browser) return;
if( !gFocusMgr.getKeyboardFocus() )
{
// Grab focus and move cursor to first enabled control
web_browser->setFocus(TRUE);
sInstance->setFocus(TRUE);
}
// Make sure that focus always goes here (and use the latest sInstance that was just created)
gFocusMgr.setDefaultKeyboardFocus(web_browser);
gFocusMgr.setDefaultKeyboardFocus(sInstance);
}
// static
void LLPanelLogin::setFields(const std::string& firstname, const std::string& lastname, const std::string& password,
BOOL remember)
{
if (!sInstance)
{
llwarns << "Attempted fillFields with no login view shown" << llendl;
return;
}
sInstance->childSetText("first_name_edit", firstname);
sInstance->childSetText("last_name_edit", lastname);
// Max "actual" password length is 16 characters.
// Hex digests are always 32 characters.
if (password.length() == 32)
{
// This is a MD5 hex digest of a password.
// We don't actually use the password input field,
// fill it with MAX_PASSWORD characters so we get a
// nice row of asterixes.
const std::string filler("123456789!123456");
sInstance->childSetText("password_edit", filler);
sInstance->mIncomingPassword = filler;
sInstance->mMungedPassword = password;
}
else
{
// this is a normal text password
sInstance->childSetText("password_edit", password);
sInstance->mIncomingPassword = password;
LLMD5 pass((unsigned char *)password.c_str());
char munged_password[MD5HEX_STR_SIZE];
pass.hex_digest(munged_password);
sInstance->mMungedPassword = munged_password;
}
sInstance->childSetValue("remember_check", remember);
}
// static
void LLPanelLogin::addServer(const char *server, S32 domain_name)
{
if (!sInstance)
{
llwarns << "Attempted addServer with no login view shown" << llendl;
return;
}
LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "server_combo");
if (combo)
{
combo->add(server, LLSD(domain_name) );
combo->setCurrentByIndex(0);
}
}
// static
void LLPanelLogin::getFields(LLString &firstname, LLString &lastname, LLString &password,
BOOL &remember)
{
if (!sInstance)
{
llwarns << "Attempted getFields with no login view shown" << llendl;
return;
}
firstname = sInstance->childGetText("first_name_edit");
LLString::trim(firstname);
lastname = sInstance->childGetText("last_name_edit");
LLString::trim(lastname);
password = sInstance->mMungedPassword;
remember = sInstance->childGetValue("remember_check");
}
// static. Return TRUE if user made a choice from the popup
BOOL LLPanelLogin::getServer(LLString &server, S32 &domain_name)
{
BOOL user_picked = FALSE;
if (!sInstance)
{
llwarns << "Attempted getServer with no login view shown" << llendl;
}
else
{
LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "server_combo");
if (combo)
{
LLSD combo_val = combo->getValue();
if (LLSD::TypeInteger == combo_val.type())
{
domain_name = combo->getValue().asInteger();
if ((S32)GRID_INFO_OTHER == domain_name)
{
server = gGridName;
}
}
else
{
// no valid selection, return other
domain_name = (S32)GRID_INFO_OTHER;
server = combo_val.asString();
}
user_picked = combo->isDirty();
}
}
return user_picked;
}
// static
void LLPanelLogin::getLocation(LLString &location)
{
if (!sInstance)
{
llwarns << "Attempted getLocation with no login view shown" << llendl;
return;
}
LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "start_location_combo");
if (combo)
{
location = combo->getValue().asString();
}
}
// static
void LLPanelLogin::refreshLocation( bool force_visible )
{
if (!sInstance) return;
LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "start_location_combo");
if (!combo) return;
LLString sim_string = LLURLSimString::sInstance.mSimString;
if (!sim_string.empty())
{
combo->setCurrentByIndex( 3 ); // BUG? Maybe 2?
combo->setTextEntry(sim_string);
}
else
{
BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation");
combo->setCurrentByIndex( login_last ? 1 : 0 );
}
BOOL show_start = TRUE;
if ( ! force_visible )
show_start = gSavedSettings.getBOOL("ShowStartLocation");
sInstance->childSetVisible("start_location_combo", show_start);
sInstance->childSetVisible("start_location_text", show_start);
}
// static
void LLPanelLogin::close()
@ -528,127 +694,82 @@ void LLPanelLogin::close()
}
}
// static
void LLPanelLogin::setAlwaysRefresh(bool refresh)
{
if (LLStartUp::getStartupState() >= STATE_LOGIN_CLEANUP) return;
LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html");
if (web_browser)
{
web_browser->setAlwaysRefresh(refresh);
}
}
void LLPanelLogin::loadLoginPage()
{
if (!sInstance) return;
LLURLSimString::sInstance.parse();
LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html");
std::ostringstream oStr;
LLString location;
LLString region;
LLString password;
if (LLURLSimString::parse())
{
std::ostringstream oRegionStr;
location = "specify";
oRegionStr << LLURLSimString::sInstance.mSimName << "/" << LLURLSimString::sInstance.mX << "/"
<< LLURLSimString::sInstance.mY << "/"
<< LLURLSimString::sInstance.mZ;
region = oRegionStr.str();
}
else
{
if (gSavedSettings.getBOOL("LoginLastLocation"))
{
location = "last";
}
else
{
location = "home";
}
}
LLString firstname, lastname;
if (gCmdLineFirstName.empty())
{
firstname = gSavedSettings.getString("FirstName");
}
else
{
firstname = gCmdLineFirstName;
}
if (gCmdLineLastName.empty())
{
lastname = gSavedSettings.getString("LastName");
}
else
{
lastname = gCmdLineLastName;
}
LLString version = llformat("%d.%d.%d (%d)",
LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD);
char* curl_region = curl_escape(region.c_str(), 0);
char* curl_channel = curl_escape(gChannelName.c_str(), 0);
char* curl_version = curl_escape(version.c_str(), 0);
oStr << sInstance->childGetValue( "real_url" ).asString() << "&firstname=" << firstname <<
"&lastname=" << lastname << "&location=" << location << "&region=" << curl_region <<
"&grid=" << gGridInfo[gGridChoice].mLabel << "&channel=" << curl_channel <<
"&version=" << curl_version;
curl_free(curl_region);
curl_free(curl_channel);
curl_free(curl_version);
if (!gCmdLinePassword.empty())
{
oStr << "&password=" << gCmdLinePassword;
}
else if (!(password = load_password_from_disk()).empty())
{
oStr << "&password=$1$" << password;
}
if (gAutoLogin)
{
oStr << "&auto_login=TRUE";
}
if (gSavedSettings.getBOOL("ShowStartLocation"))
{
oStr << "&show_start_location=TRUE";
}
if (gSavedSettings.getBOOL("RememberPassword"))
{
oStr << "&remember_password=TRUE";
}
#ifndef LL_RELEASE_FOR_DOWNLOAD
oStr << "&show_grid=TRUE";
#endif
// navigate to the "real" page
web_browser->navigateTo( oStr.str() );
}
//---------------------------------------------------------------------------
// Protected methods
//---------------------------------------------------------------------------
// static
void LLPanelLogin::onClickConnect(void *)
{
if (sInstance && sInstance->mCallback)
{
// tell the responder we're not here anymore
if ( gResponsePtr )
gResponsePtr->setParent( 0 );
// JC - Make sure the fields all get committed.
sInstance->setFocus(FALSE);
LLString first = sInstance->childGetText("first_name_edit");
LLString last = sInstance->childGetText("last_name_edit");
if (!first.empty() && !last.empty())
{
// has both first and last name typed
// store off custom server entry, if currently selected
LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "server_combo");
if (combo)
{
S32 selected_server = combo->getValue();
if (selected_server == GRID_INFO_NONE)
{
LLString custom_server = combo->getValue().asString();
gSavedSettings.setString("CustomServer", custom_server);
}
}
sInstance->mCallback(0, sInstance->mCallbackData);
}
else
{
// empty first or last name
// same as clicking new account
onClickNewAccount(NULL);
}
}
}
// static
void LLPanelLogin::newAccountAlertCallback(S32 option, void*)
{
if (0 == option)
{
llinfos << "Going to account creation URL" << llendl;
LLWeb::loadURL( CREATE_ACCOUNT_URL );
}
else
{
sInstance->setFocus(TRUE);
}
}
// static
void LLPanelLogin::onClickNewAccount(void*)
{
if (gHideLinks)
{
gViewerWindow->alertXml("MustHaveAccountToLogInNoLinks");
}
else
{
gViewerWindow->alertXml("MustHaveAccountToLogIn",
LLPanelLogin::newAccountAlertCallback);
}
}
// static
void LLPanelLogin::onClickQuit(void*)
{
@ -668,3 +789,22 @@ void LLPanelLogin::onClickVersion(void*)
{
LLFloaterAbout::show(NULL);
}
void LLPanelLogin::onClickForgotPassword(void*)
{
if (sInstance )
{
LLWeb::loadURL(sInstance->childGetValue( "forgot_password_url" ).asString());
}
}
// static
void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
{
if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE)
{
LLNotifyBox::showXml("CapsKeyOn");
sCapslockDidNotification = TRUE;
}
}

View File

@ -33,7 +33,7 @@
#define LL_LLPANELLOGIN_H
#include "llpanel.h"
#include "llcommandhandler.h"
#include "lldbstrings.h"
#include "llmemory.h"
#include "llviewerimage.h"
@ -46,22 +46,6 @@ class LLCheckBoxCtrl;
class LLButton;
class LLComboBox;
class LLLoginHandler : public LLCommandHandler
{
public:
LLLoginHandler() : LLCommandHandler("login") { }
bool handle(const LLSD& tokens, const LLSD& queryMap);
bool parseDirectLogin(std::string url);
void parse(const LLSD& queryMap);
LLUUID mWebLoginKey;
LLString mFirstName;
LLString mLastName;
};
extern LLLoginHandler gLoginHandler;
class LLPanelLogin
: public LLPanel
{
@ -73,22 +57,39 @@ public:
virtual BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent);
virtual void draw();
virtual void setFocus( BOOL b );
static void show(const LLRect &rect, BOOL show_server,
void (*callback)(S32 option, void* user_data),
void* callback_data);
static void setFields(const std::string& firstname, const std::string& lastname,
const std::string& password, BOOL remember);
static void addServer(const char *server, S32 domain_name);
static void refreshLocation( bool force_visible );
static void getFields(LLString &firstname, LLString &lastname,
LLString &password, BOOL &remember);
static BOOL getServer(LLString &server, S32& domain_name);
static void getLocation(LLString &location);
static void close();
void setSiteIsAlive( bool alive );
static void loadLoginPage();
static void giveFocus();
static void setAlwaysRefresh(bool refresh);
static void giveFocus();
static void mungePassword(LLUICtrl* caller, void* user_data);
private:
static void onClickConnect(void*);
static void onClickNewAccount(void*);
static void newAccountAlertCallback(S32 option, void*);
static void onClickQuit(void*);
static void onClickVersion(void*);
static void onClickForgotPassword(void*);
static void onPassKey(LLLineEditor* caller, void* user_data);
private:
LLPointer<LLViewerImage> mLogoImage;
@ -96,7 +97,11 @@ private:
void (*mCallback)(S32 option, void *userdata);
void* mCallbackData;
std::string mIncomingPassword;
std::string mMungedPassword;
static LLPanelLogin* sInstance;
static BOOL sCapslockDidNotification;
BOOL mHtmlAvailable;
};

View File

@ -329,7 +329,6 @@ BOOL idle_startup()
static std::string auth_message;
static LLString firstname;
static LLString lastname;
static LLUUID web_login_key;
static LLString password;
static std::vector<const char*> requested_options;
@ -349,6 +348,7 @@ BOOL idle_startup()
static S32 location_which = START_LOCATION_ID_LAST;
static BOOL show_connect_box = TRUE;
static BOOL remember_password = TRUE;
static BOOL stipend_since_login = FALSE;
@ -634,34 +634,28 @@ BOOL idle_startup()
//
// Log on to system
//
if ((!gLoginHandler.mFirstName.empty() &&
!gLoginHandler.mLastName.empty() &&
!gLoginHandler.mWebLoginKey.isNull())
|| gLoginHandler.parseDirectLogin(LLStartUp::sSLURLCommand) )
{
firstname = gLoginHandler.mFirstName;
lastname = gLoginHandler.mLastName;
web_login_key = gLoginHandler.mWebLoginKey;
show_connect_box = FALSE;
}
else if( !gCmdLineFirstName.empty()
if( !gCmdLineFirstName.empty()
&& !gCmdLineLastName.empty()
&& !gCmdLinePassword.empty())
{
firstname = gCmdLineFirstName;
lastname = gCmdLineLastName;
show_connect_box = TRUE;
gAutoLogin = TRUE;
LLMD5 pass((unsigned char*)gCmdLinePassword.c_str());
char md5pass[33]; /* Flawfinder: ignore */
pass.hex_digest(md5pass);
password = md5pass;
remember_password = gSavedSettings.getBOOL("RememberPassword");
show_connect_box = FALSE;
}
else if (gAutoLogin || gSavedSettings.getBOOL("AutoLogin"))
{
firstname = gSavedSettings.getString("FirstName");
lastname = gSavedSettings.getString("LastName");
password = load_password_from_disk();
gSavedSettings.setBOOL("RememberPassword", TRUE);
show_connect_box = TRUE;
remember_password = TRUE;
show_connect_box = FALSE;
}
else
{
@ -670,6 +664,7 @@ BOOL idle_startup()
firstname = gSavedSettings.getString("FirstName");
lastname = gSavedSettings.getString("LastName");
password = load_password_from_disk();
remember_password = gSavedSettings.getBOOL("RememberPassword");
show_connect_box = TRUE;
}
@ -679,8 +674,7 @@ BOOL idle_startup()
}
if (STATE_LOGIN_SHOW == LLStartUp::getStartupState())
{
{
llinfos << "Initializing Window" << llendl;
gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
@ -701,6 +695,8 @@ BOOL idle_startup()
// Show the login dialog
login_show();
// connect dialog is already shown, so fill in the names
LLPanelLogin::setFields( firstname, lastname, password, remember_password );
LLPanelLogin::giveFocus();
gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
@ -712,31 +708,6 @@ BOOL idle_startup()
// skip directly to message template verification
LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
}
// Create selection manager
// Must be done before menus created, because many enabled callbacks
// require its existance.
gSelectMgr = new LLSelectMgr();
gParcelMgr = new LLViewerParcelMgr();
gHUDManager = new LLHUDManager();
gMuteListp = new LLMuteList();
// Initialize UI
if (!gNoRender)
{
// Initialize all our tools. Must be done after saved settings loaded.
if ( gToolMgr == NULL )
{
gToolMgr = new LLToolMgr();
gToolMgr->initTools();
}
// Quickly get something onscreen to look at.
gViewerWindow->initWorldUI();
}
gViewerWindow->setNormalControlsVisible( FALSE );
gLoginMenuBarView->setVisible( TRUE );
timeout.reset();
return do_normal_idle;
@ -754,16 +725,11 @@ BOOL idle_startup()
if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState())
{
//reset the values that could have come in from a slurl
if (!gLoginHandler.mWebLoginKey.isNull())
{
firstname = gLoginHandler.mFirstName;
lastname = gLoginHandler.mLastName;
web_login_key = gLoginHandler.mWebLoginKey;
}
if (show_connect_box)
{
// Load all the name information out of the login view
LLPanelLogin::getFields(firstname, lastname, password, remember_password);
// HACK: Try to make not jump on login
gKeyboard->resetKeys();
}
@ -823,6 +789,25 @@ BOOL idle_startup()
if (show_connect_box)
{
LLString server_label;
S32 domain_name_index;
BOOL user_picked_server = LLPanelLogin::getServer( server_label, domain_name_index );
gGridChoice = (EGridInfo) domain_name_index;
gSavedSettings.setS32("ServerChoice", gGridChoice);
if (gGridChoice == GRID_INFO_OTHER)
{
snprintf(gGridName, MAX_STRING, "%s", server_label.c_str()); /* Flawfinder: ignore */
}
if ( user_picked_server )
{ // User picked a grid from the popup, so clear the stored urls and they will be re-generated from gGridChoice
sAuthUris.clear();
LLAppViewer::instance()->resetURIs();
}
LLString location;
LLPanelLogin::getLocation( location );
LLURLSimString::setString( location );
LLPanelLogin::close();
}
@ -955,12 +940,11 @@ BOOL idle_startup()
// a startup URL was specified
std::stringstream unescaped_start;
unescaped_start << "uri:"
<< LLURLSimString::sInstance.mSimName << "&"
<< LLURLSimString::sInstance.mX << "&"
<< LLURLSimString::sInstance.mY << "&"
<< LLURLSimString::sInstance.mZ;
<< LLURLSimString::sInstance.mSimName << "&"
<< LLURLSimString::sInstance.mX << "&"
<< LLURLSimString::sInstance.mY << "&"
<< LLURLSimString::sInstance.mZ;
start << xml_escape_string(unescaped_start.str().c_str());
}
else if (gSavedSettings.getBOOL("LoginLastLocation"))
{
@ -976,13 +960,13 @@ BOOL idle_startup()
hashed_mac.update( gMACAddress, MAC_ADDRESS_BYTES );
hashed_mac.finalize();
hashed_mac.hex_digest(hashed_mac_string);
gUserAuthp->authenticate(
sAuthUris[sAuthUriNum].c_str(),
auth_method.c_str(),
firstname.c_str(),
lastname.c_str(),
web_login_key,
password.c_str(),
start.str().c_str(),
gSkipOptionalUpdate,
gAcceptTOS,
@ -992,7 +976,6 @@ BOOL idle_startup()
requested_options,
hashed_mac_string,
LLAppViewer::instance()->getSerialNumber());
// reset globals
gAcceptTOS = FALSE;
gAcceptCriticalMessage = FALSE;
@ -1254,7 +1237,15 @@ BOOL idle_startup()
if(text) lastname.assign(text);
gSavedSettings.setString("FirstName", firstname);
gSavedSettings.setString("LastName", lastname);
if (remember_password)
{
save_password_to_disk(password.c_str());
}
else
{
save_password_to_disk(NULL);
}
gSavedSettings.setBOOL("RememberPassword", remember_password);
gSavedSettings.setBOOL("LoginLastLocation", gSavedSettings.getBOOL("LoginLastLocation"));
text = gUserAuthp->getResponse("agent_access");
@ -1480,6 +1471,14 @@ BOOL idle_startup()
// type the name/password again if we crash.
gSavedSettings.saveToFile(gSettingsFileName, TRUE);
// Create selection manager
// Must be done before menus created, because many enabled callbacks
// require its existance.
gSelectMgr = new LLSelectMgr();
gParcelMgr = new LLViewerParcelMgr();
gHUDManager = new LLHUDManager();
gMuteListp = new LLMuteList();
//
// Initialize classes w/graphics stuff.
//
@ -1548,11 +1547,21 @@ BOOL idle_startup()
if ( gViewerWindow != NULL && gToolMgr != NULL )
{ // This isn't the first logon attempt, so show the UI
gViewerWindow->setNormalControlsVisible( TRUE );
}
gLoginMenuBarView->setVisible( FALSE );
}
// Initialize UI
if (!gNoRender)
{
// Initialize all our tools. Must be done after saved settings loaded.
if ( gToolMgr == NULL )
{
gToolMgr = new LLToolMgr();
gToolMgr->initTools();
}
// Quickly get something onscreen to look at.
gViewerWindow->initWorldUI();
// Move the progress view in front of the UI
gViewerWindow->moveProgressViewToFront();
@ -2335,12 +2344,68 @@ void login_show()
// UI textures have been previously loaded in doPreloadImages()
llinfos << "Setting Servers" << llendl;
if( GRID_INFO_OTHER == gGridChoice )
{
LLPanelLogin::addServer( gGridName, GRID_INFO_OTHER );
}
else
{
LLPanelLogin::addServer( gGridInfo[gGridChoice].mLabel, gGridChoice );
}
// Arg! We hate loops!
LLPanelLogin::addServer( gGridInfo[GRID_INFO_DMZ].mLabel, GRID_INFO_DMZ );
LLPanelLogin::addServer( gGridInfo[GRID_INFO_LOCAL].mLabel, GRID_INFO_LOCAL );
LLPanelLogin::addServer( gGridInfo[GRID_INFO_AGNI].mLabel, GRID_INFO_AGNI );
LLPanelLogin::addServer( gGridInfo[GRID_INFO_ADITI].mLabel, GRID_INFO_ADITI );
LLPanelLogin::addServer( gGridInfo[GRID_INFO_SIVA].mLabel, GRID_INFO_SIVA );
LLPanelLogin::addServer( gGridInfo[GRID_INFO_DURGA].mLabel, GRID_INFO_DURGA );
LLPanelLogin::addServer( gGridInfo[GRID_INFO_SHAKTI].mLabel, GRID_INFO_SHAKTI );
LLPanelLogin::addServer( gGridInfo[GRID_INFO_GANGA].mLabel, GRID_INFO_GANGA );
LLPanelLogin::addServer( gGridInfo[GRID_INFO_UMA].mLabel, GRID_INFO_UMA );
LLPanelLogin::addServer( gGridInfo[GRID_INFO_SOMA].mLabel, GRID_INFO_SOMA );
LLPanelLogin::addServer( gGridInfo[GRID_INFO_VAAK].mLabel, GRID_INFO_VAAK );
}
// Callback for when login screen is closed. Option 0 = connect, option 1 = quit.
void login_callback(S32 option, void *userdata)
{
const S32 CONNECT_OPTION = 0;
const S32 QUIT_OPTION = 1;
if (CONNECT_OPTION == option)
{
LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
return;
}
else if (QUIT_OPTION == option)
{
// Make sure we don't save the password if the user is trying to clear it.
LLString first, last, password;
BOOL remember = TRUE;
LLPanelLogin::getFields(first, last, password, remember);
if (!remember)
{
// turn off the setting and write out to disk
gSavedSettings.setBOOL("RememberPassword", FALSE);
gSavedSettings.saveToFile(gSettingsFileName, TRUE);
// stomp the saved password on disk
save_password_to_disk(NULL);
}
LLPanelLogin::close();
// Next iteration through main loop should shut down the app cleanly.
LLAppViewer::instance()->userQuit(); // gQuit = TRUE;
return;
}
else
{
llwarns << "Unknown login button clicked" << llendl;
}
}
LLString load_password_from_disk()
@ -3580,7 +3645,6 @@ void reset_login()
if ( gViewerWindow )
{ // Hide menus and normal buttons
gViewerWindow->setNormalControlsVisible( FALSE );
gLoginMenuBarView->setVisible( TRUE );
}
// Hide any other stuff

View File

@ -85,8 +85,6 @@ LLToolPie::LLToolPie()
BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
{
if (!gCamera) return FALSE;
//left mouse down always picks transparent
gViewerWindow->hitObjectOrLandGlobalAsync(x, y, mask, leftMouseCallback,
TRUE, TRUE);

View File

@ -48,6 +48,9 @@
// library includes
#include "llsd.h"
// system includes
#include <boost/tokenizer.hpp>
const std::string SLURL_SL_HELP_PREFIX = "secondlife://app.";
const std::string SLURL_SL_PREFIX = "sl://";
const std::string SLURL_SECONDLIFE_PREFIX = "secondlife://";
@ -108,9 +111,9 @@ bool LLURLDispatcherImpl::isSLURL(const std::string& url)
// static
bool LLURLDispatcherImpl::isSLURLCommand(const std::string& url)
{
{
if (matchPrefix(url, SLURL_SL_PREFIX + SLURL_APP_TOKEN)
|| matchPrefix(url, SLURL_SECONDLIFE_PREFIX + "/" + SLURL_APP_TOKEN)
|| matchPrefix(url, SLURL_SECONDLIFE_PREFIX + SLURL_APP_TOKEN)
|| matchPrefix(url, SLURL_SLURL_PREFIX + SLURL_APP_TOKEN) )
{
return true;
@ -125,11 +128,6 @@ bool LLURLDispatcherImpl::dispatchCore(const std::string& url, bool right_mouse)
if (dispatchHelp(url, right_mouse)) return true;
if (dispatchApp(url, right_mouse)) return true;
if (dispatchRegion(url, right_mouse)) return true;
// Inform the user we can't handle this
std::map<std::string, std::string> args;
args["[SLURL]"] = url;
gViewerWindow->alertXml("BadURL", args);
return false;
}
@ -164,14 +162,41 @@ bool LLURLDispatcherImpl::dispatchApp(const std::string& url, BOOL right_mouse)
{
return false;
}
std::string s = stripProtocol(url);
LLURI uri(url);
LLSD pathArray = uri.pathArray();
pathArray.erase(0); // erase "app"
std::string cmd = pathArray.get(0);
pathArray.erase(0); // erase "cmd"
bool handled = LLCommandDispatcher::dispatch(cmd, pathArray, uri.queryMap());
return handled;
// At this point, "secondlife://app/foo/bar/baz/" should be left
// as: "app/foo/bar/baz/"
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
boost::char_separator<char> sep("/", "", boost::drop_empty_tokens);
tokenizer tokens(s, sep);
tokenizer::iterator it = tokens.begin();
tokenizer::iterator end = tokens.end();
// Build parameter list suitable for LLDispatcher dispatch
if (it == end) return false;
if (*it != "app") return false;
++it;
if (it == end) return false;
std::string cmd = *it;
++it;
std::vector<std::string> params;
for ( ; it != end; ++it)
{
params.push_back(*it);
}
bool handled = LLCommandDispatcher::dispatch(cmd, params);
if (handled) return true;
// Inform the user we can't handle this
std::map<std::string, std::string> args;
args["[SLURL]"] = url;
gViewerWindow->alertXml("BadURL", args);
// This was a SLURL with a /app prefix, and we "handled" it by displaying an error dialog,
// so return true. It doesn't need to be parsed any further.
return true;
}
// static
@ -184,14 +209,14 @@ bool LLURLDispatcherImpl::dispatchRegion(const std::string& url, BOOL right_mous
// Before we're logged in, need to update the startup screen
// to tell the user where they are going.
if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP)
if (LLStartUp::getStartupState() < STATE_CLEANUP)
{
// Parse it and stash in globals, it will be dispatched in
// STATE_CLEANUP.
LLURLSimString::setString(url);
// We're at the login screen, so make sure user can see
// the login location box to know where they are going.
LLPanelLogin::loadLoginPage();
LLPanelLogin::refreshLocation( true );
return true;
}
@ -287,7 +312,7 @@ class LLTeleportHandler : public LLCommandHandler
{
public:
LLTeleportHandler() : LLCommandHandler("teleport") { }
bool handle(const LLSD& tokens, const LLSD& queryMap)
bool handle(const std::vector<std::string>& tokens)
{
// construct a "normal" SLURL, resolve the region to
// a global position, and teleport to it
@ -298,9 +323,9 @@ public:
// build secondlife://De%20Haro/123/45/67 for use in callback
std::string url = SLURL_SECONDLIFE_PREFIX;
for (int i = 0; i < tokens.size(); ++i)
for (size_t i = 0; i < tokens.size(); ++i)
{
url += tokens[i].asString() + "/";
url += tokens[i] + "/";
}
gWorldMap->sendNamedRegionRequest(region_name,
LLURLDispatcherImpl::regionHandleCallback,

View File

@ -235,7 +235,6 @@ extern BOOL gAllowSelectAvatar;
LLMenuBarGL *gMenuBarView = NULL;
LLViewerMenuHolderGL *gMenuHolder = NULL;
LLMenuGL *gPopupMenuView = NULL;
LLMenuBarGL *gLoginMenuBarView = NULL;
// Pie menus
LLPieMenu *gPieSelf = NULL;
@ -751,15 +750,6 @@ void init_menus()
// Debug menu visiblity
//
show_debug_menus();
gLoginMenuBarView = (LLMenuBarGL*)gUICtrlFactory->buildMenu("menu_login.xml", gMenuHolder);
LLRect menuBarRect = gLoginMenuBarView->getRect();
gLoginMenuBarView->setRect(LLRect(menuBarRect.mLeft, menuBarRect.mTop, gViewerWindow->getRootView()->getRect().getWidth() - menuBarRect.mLeft, menuBarRect.mBottom));
gLoginMenuBarView->setBackgroundColor( color );
gMenuHolder->addChild(gLoginMenuBarView);
}
void init_landmark_menu(LLMenuGL* menu)

View File

@ -141,7 +141,6 @@ extern LLMenuBarGL* gMenuBarView;
//extern LLView* gMenuBarHolder;
extern LLMenuGL* gPopupMenuView;
extern LLViewerMenuHolderGL* gMenuHolder;
extern LLMenuBarGL* gLoginMenuBarView;
// Pie menus
extern LLPieMenu *gPieSelf;

View File

@ -31,7 +31,6 @@
#include "llviewerprecompiledheaders.h"
#include "llpanellogin.h"
#include "llviewerwindow.h"
// system library includes
@ -106,7 +105,6 @@
#include "llfloatermap.h"
#include "llfloatermute.h"
#include "llfloaternamedesc.h"
#include "llfloaterpreference.h"
#include "llfloatersnapshot.h"
#include "llfloatertools.h"
#include "llfloaterworldmap.h"
@ -2844,7 +2842,7 @@ BOOL LLViewerWindow::handlePerFrameHover()
// *NOTE: sometimes tools handle the mouse as a captor, so this
// logic is a little confusing
LLTool *tool = NULL;
if (gToolMgr && gHoverView && gCamera)
if (gToolMgr && gHoverView)
{
tool = gToolMgr->getCurrentTool();
@ -2917,8 +2915,8 @@ BOOL LLViewerWindow::handlePerFrameHover()
mToolTip->setVisible( TRUE );
}
}
if (tool && tool != gToolNull && tool != gToolInspect && tool != gToolDragAndDrop && !gSavedSettings.getBOOL("FreezeTime"))
if (tool != gToolNull && tool != gToolInspect && tool != gToolDragAndDrop && !gSavedSettings.getBOOL("FreezeTime"))
{
LLMouseHandler *captor = gFocusMgr.getMouseCapture();
// With the null, inspect, or drag and drop tool, don't muck

View File

@ -450,8 +450,6 @@ class LinuxManifest(ViewerManifest):
if self.prefix("linux_tools", ""):
self.path("client-readme.txt","README-linux.txt")
self.path("wrapper.sh","secondlife")
self.path("handle_secondlifeprotocol.sh")
self.path("register_secondlifeprotocol.sh")
self.path("unicode.ttf","unicode.ttf")
self.end_prefix("linux_tools")