diff options
author | Tess Chu <tess@lindenlab.com> | 2007-11-15 22:39:12 +0000 |
---|---|---|
committer | Tess Chu <tess@lindenlab.com> | 2007-11-15 22:39:12 +0000 |
commit | 813b140d0767146b17acf4ad2fb96fbd5a347c34 (patch) | |
tree | d47a36708813b3f93b4049d822f966c48de4e576 /indra/newview/llpanellogin.cpp | |
parent | 291d99bc66c4c2b8009ba723a43e2e97d24313f9 (diff) |
svn merge -r73880:73879 svn+ssh://svn/svn/linden/release. backing out viewer auth merge
Diffstat (limited to 'indra/newview/llpanellogin.cpp')
-rw-r--r-- | indra/newview/llpanellogin.cpp | 622 |
1 files changed, 381 insertions, 241 deletions
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 8ebdb14e15..fe07175529 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -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,156 +510,266 @@ 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::close() +void LLPanelLogin::setFields(const std::string& firstname, const std::string& lastname, const std::string& password, + BOOL remember) { - if (sInstance) + if (!sInstance) { - gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance ); - - gFocusMgr.setDefaultKeyboardFocus(NULL); + llwarns << "Attempted fillFields with no login view shown" << llendl; + return; + } - delete sInstance; - sInstance = NULL; + 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::setAlwaysRefresh(bool refresh) +void LLPanelLogin::addServer(const char *server, S32 domain_name) { - if (LLStartUp::getStartupState() >= STATE_LOGIN_CLEANUP) return; - - LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html"); + if (!sInstance) + { + llwarns << "Attempted addServer with no login view shown" << llendl; + return; + } - if (web_browser) + LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "server_combo"); + if (combo) { - web_browser->setAlwaysRefresh(refresh); + combo->add(server, LLSD(domain_name) ); + combo->setCurrentByIndex(0); } } - - -void LLPanelLogin::loadLoginPage() +// static +void LLPanelLogin::getFields(LLString &firstname, LLString &lastname, LLString &password, + BOOL &remember) { - if (!sInstance) return; + if (!sInstance) + { + llwarns << "Attempted getFields with no login view shown" << llendl; + return; + } + + firstname = sInstance->childGetText("first_name_edit"); + LLString::trim(firstname); - LLURLSimString::sInstance.parse(); + lastname = sInstance->childGetText("last_name_edit"); + LLString::trim(lastname); - LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html"); + password = sInstance->mMungedPassword; + remember = sInstance->childGetValue("remember_check"); +} - std::ostringstream oStr; - LLString location; - LLString region; - LLString password; - - if (LLURLSimString::parse()) +// 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) { - std::ostringstream oRegionStr; - location = "specify"; - oRegionStr << LLURLSimString::sInstance.mSimName << "/" << LLURLSimString::sInstance.mX << "/" - << LLURLSimString::sInstance.mY << "/" - << LLURLSimString::sInstance.mZ; - region = oRegionStr.str(); + llwarns << "Attempted getServer with no login view shown" << llendl; } else { - if (gSavedSettings.getBOOL("LoginLastLocation")) - { - location = "last"; - } - else + LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "server_combo"); + if (combo) { - location = "home"; + 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(); } } - - LLString firstname, lastname; - - if (gCmdLineFirstName.empty()) + + return user_picked; +} + +// static +void LLPanelLogin::getLocation(LLString &location) +{ + if (!sInstance) { - firstname = gSavedSettings.getString("FirstName"); + llwarns << "Attempted getLocation with no login view shown" << llendl; + return; } - else + + LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "start_location_combo"); + if (combo) { - firstname = gCmdLineFirstName; + location = combo->getValue().asString(); } - - if (gCmdLineLastName.empty()) +} + +// 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()) { - lastname = gSavedSettings.getString("LastName"); + combo->setCurrentByIndex( 3 ); // BUG? Maybe 2? + combo->setTextEntry(sim_string); } else { - lastname = gCmdLineLastName; + BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation"); + combo->setCurrentByIndex( login_last ? 1 : 0 ); } - - 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); + BOOL show_start = TRUE; - - oStr << sInstance->childGetValue( "real_url" ).asString() << "&firstname=" << firstname << - "&lastname=" << lastname << "&location=" << location << "®ion=" << curl_region << - "&grid=" << gGridInfo[gGridChoice].mLabel << "&channel=" << curl_channel << - "&version=" << curl_version; + if ( ! force_visible ) + show_start = gSavedSettings.getBOOL("ShowStartLocation"); - - curl_free(curl_region); - curl_free(curl_channel); - curl_free(curl_version); + sInstance->childSetVisible("start_location_combo", show_start); + sInstance->childSetVisible("start_location_text", show_start); +} + +// static +void LLPanelLogin::close() +{ + if (sInstance) + { + gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance ); + + gFocusMgr.setDefaultKeyboardFocus(NULL); + + delete sInstance; + sInstance = NULL; + } +} + + +//--------------------------------------------------------------------------- +// Protected methods +//--------------------------------------------------------------------------- - if (!gCmdLinePassword.empty()) +// static +void LLPanelLogin::onClickConnect(void *) +{ + if (sInstance && sInstance->mCallback) { - oStr << "&password=" << gCmdLinePassword; + // 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); + } } - else if (!(password = load_password_from_disk()).empty()) +} + + +// static +void LLPanelLogin::newAccountAlertCallback(S32 option, void*) +{ + if (0 == option) { - oStr << "&password=$1$" << password; + llinfos << "Going to account creation URL" << llendl; + LLWeb::loadURL( CREATE_ACCOUNT_URL ); } - if (gAutoLogin) + else { - oStr << "&auto_login=TRUE"; + sInstance->setFocus(TRUE); } - if (gSavedSettings.getBOOL("ShowStartLocation")) +} + + +// static +void LLPanelLogin::onClickNewAccount(void*) +{ + if (gHideLinks) { - oStr << "&show_start_location=TRUE"; - } - if (gSavedSettings.getBOOL("RememberPassword")) + gViewerWindow->alertXml("MustHaveAccountToLogInNoLinks"); + } + else { - oStr << "&remember_password=TRUE"; - } -#ifndef LL_RELEASE_FOR_DOWNLOAD - oStr << "&show_grid=TRUE"; -#endif - - // navigate to the "real" page - web_browser->navigateTo( oStr.str() ); + gViewerWindow->alertXml("MustHaveAccountToLogIn", + LLPanelLogin::newAccountAlertCallback); + } } -//--------------------------------------------------------------------------- -// Protected methods -//--------------------------------------------------------------------------- - // 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; + } +} |