Merge viewer-neko
commit
fd29941479
|
|
@ -358,6 +358,7 @@ set(viewer_SOURCE_FILES
|
|||
llfloaterexperiences.cpp
|
||||
llfloaterflickr.cpp
|
||||
llfloaterfonttest.cpp
|
||||
llfloaterforgetuser.cpp
|
||||
llfloatergesture.cpp
|
||||
llfloatergodtools.cpp
|
||||
llfloatergotoline.cpp
|
||||
|
|
@ -1116,6 +1117,7 @@ set(viewer_HEADER_FILES
|
|||
llfloaterexperiences.h
|
||||
llfloaterflickr.h
|
||||
llfloaterfonttest.h
|
||||
llfloaterforgetuser.h
|
||||
llfloatergesture.h
|
||||
llfloatergodtools.h
|
||||
llfloatergotoline.h
|
||||
|
|
|
|||
|
|
@ -7075,7 +7075,7 @@
|
|||
<key>InventoryOutboxDisplayBoth</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show the legacy Merchant Outbox UI as well as the Marketplace Listings UI</string>
|
||||
<string>(Deprecated) Show the legacy Merchant Outbox UI as well as the Marketplace Listings UI</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -11159,6 +11159,17 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>RememberUser</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Keep user name for next login</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>RememberPassword</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -575,7 +575,7 @@ void FSPanelLogin::setFields(LLPointer<LLCredential> credential, bool from_start
|
|||
|
||||
// static
|
||||
void FSPanelLogin::getFields(LLPointer<LLCredential>& credential,
|
||||
BOOL& remember)
|
||||
bool& remember)
|
||||
{
|
||||
if (!sInstance)
|
||||
{
|
||||
|
|
@ -945,7 +945,7 @@ void FSPanelLogin::onClickConnect(void *)
|
|||
{
|
||||
sCredentialSet = FALSE;
|
||||
LLPointer<LLCredential> cred;
|
||||
BOOL remember;
|
||||
bool remember;
|
||||
getFields(cred, remember);
|
||||
std::string identifier_type;
|
||||
cred->identifierType(identifier_type);
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ public:
|
|||
|
||||
static void setFields(LLPointer<LLCredential> credential, bool from_startup = false);
|
||||
|
||||
static void getFields(LLPointer<LLCredential>& credential, BOOL& remember);
|
||||
static void getFields(LLPointer<LLCredential>& credential, bool& remember);
|
||||
|
||||
static BOOL isCredentialSet() { return sCredentialSet; }
|
||||
|
||||
|
|
|
|||
|
|
@ -504,7 +504,7 @@ bool LLConversationLog::saveToFile(const std::string& filename)
|
|||
(S32)conv_it->getConversationType(),
|
||||
(S32)0,
|
||||
(S32)conv_it->hasOfflineMessages(),
|
||||
conv_it->getConversationName().c_str(),
|
||||
LLURI::escape(conv_it->getConversationName()).c_str(),
|
||||
participant_id.c_str(),
|
||||
conversation_id.c_str(),
|
||||
LLURI::escape(conv_it->getHistoryFileName()).c_str());
|
||||
|
|
@ -567,7 +567,7 @@ bool LLConversationLog::loadFromFile(const std::string& filename)
|
|||
params.time(LLUnits::Seconds::fromValue(time))
|
||||
.conversation_type((SessionType)stype)
|
||||
.has_offline_ims(has_offline_ims)
|
||||
.conversation_name(conv_name_buffer)
|
||||
.conversation_name(LLURI::unescape(conv_name_buffer))
|
||||
.participant_id(LLUUID(part_id_buffer))
|
||||
.session_id(LLUUID(conv_id_buffer))
|
||||
.history_filename(LLURI::unescape(history_file_name));
|
||||
|
|
|
|||
|
|
@ -1664,20 +1664,26 @@ void LLFavoritesOrderStorage::getSLURL(const LLUUID& asset_id)
|
|||
return;
|
||||
}
|
||||
|
||||
// static
|
||||
std::string LLFavoritesOrderStorage::getStoredFavoritesFilename(const std::string &grid)
|
||||
{
|
||||
// <FS:Ansariel> Favorites are stored in username.grid folder
|
||||
//std::string user_dir = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "");
|
||||
|
||||
//return (user_dir.empty() ? ""
|
||||
// : gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
|
||||
// "stored_favorites_"
|
||||
// + grid
|
||||
// + ".xml")
|
||||
// );
|
||||
return gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
|
||||
// <FS:Ansariel>
|
||||
}
|
||||
|
||||
// static
|
||||
std::string LLFavoritesOrderStorage::getStoredFavoritesFilename()
|
||||
{
|
||||
// <FS:Ansariel> Favorites are stored in username.grid folder
|
||||
//std::string user_dir = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "");
|
||||
|
||||
// return (user_dir.empty() ? ""
|
||||
// : gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
|
||||
// "stored_favorites_"
|
||||
// + LLGridManager::getInstance()->getGrid()
|
||||
// + ".xml")
|
||||
// );
|
||||
return gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
|
||||
// <FS:Ansariel>
|
||||
return getStoredFavoritesFilename(LLGridManager::getInstance()->getGrid());
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
@ -1783,6 +1789,64 @@ void LLFavoritesOrderStorage::load()
|
|||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLFavoritesOrderStorage::removeFavoritesRecordOfUser(const std::string &user, const std::string &grid)
|
||||
{
|
||||
std::string filename = getStoredFavoritesFilename(grid);
|
||||
if (!filename.empty())
|
||||
{
|
||||
LLSD fav_llsd;
|
||||
llifstream file;
|
||||
file.open(filename.c_str());
|
||||
if (file.is_open())
|
||||
{
|
||||
LLSDSerialize::fromXML(fav_llsd, file);
|
||||
file.close();
|
||||
|
||||
// Note : use the "John Doe" and not the "john.doe" version of the name.
|
||||
// See saveFavoritesSLURLs() here above for the reason why.
|
||||
if (fav_llsd.has(user))
|
||||
{
|
||||
LLSD user_llsd = fav_llsd[user];
|
||||
|
||||
if ((user_llsd.beginArray() != user_llsd.endArray()) && user_llsd.beginArray()->has("id"))
|
||||
{
|
||||
for (LLSD::array_iterator iter = user_llsd.beginArray(); iter != user_llsd.endArray(); ++iter)
|
||||
{
|
||||
LLSD value;
|
||||
value["id"] = iter->get("id").asUUID();
|
||||
iter->assign(value);
|
||||
}
|
||||
fav_llsd[user] = user_llsd;
|
||||
llofstream file;
|
||||
file.open(filename.c_str());
|
||||
if (file.is_open())
|
||||
{
|
||||
LLSDSerialize::toPrettyXML(fav_llsd, file);
|
||||
file.close();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_INFOS("FavoritesBar") << "Removed favorites for " << user << LL_ENDL;
|
||||
fav_llsd.erase(user);
|
||||
}
|
||||
}
|
||||
|
||||
llofstream out_file;
|
||||
out_file.open(filename.c_str());
|
||||
if (out_file.is_open())
|
||||
{
|
||||
LLSDSerialize::toPrettyXML(fav_llsd, out_file);
|
||||
LL_INFOS("FavoritesBar") << "saved favorites to '" << filename << "' "
|
||||
<< LL_ENDL;
|
||||
out_file.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLFavoritesOrderStorage::removeFavoritesRecordOfUser()
|
||||
{
|
||||
std::string filename = getStoredFavoritesFilename();
|
||||
|
|
|
|||
|
|
@ -215,9 +215,15 @@ public:
|
|||
* @see cleanup()
|
||||
*/
|
||||
static void destroyClass();
|
||||
static std::string getStoredFavoritesFilename(const std::string &grid);
|
||||
static std::string getStoredFavoritesFilename();
|
||||
static std::string getSavedOrderFileName();
|
||||
|
||||
// Remove record of specified user's favorites from file on disk.
|
||||
static void removeFavoritesRecordOfUser(const std::string &user, const std::string &grid);
|
||||
// Remove record of current user's favorites from file on disk.
|
||||
static void removeFavoritesRecordOfUser();
|
||||
|
||||
BOOL saveFavoritesRecord(bool pref_changed = false);
|
||||
void showFavoritesOnLoginChanged(BOOL show);
|
||||
|
||||
|
|
@ -239,9 +245,6 @@ private:
|
|||
|
||||
void load();
|
||||
|
||||
// Remove record of current user's favorites from file on disk.
|
||||
void removeFavoritesRecordOfUser();
|
||||
|
||||
void onLandmarkLoaded(const LLUUID& asset_id, class LLLandmark* landmark);
|
||||
void storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl);
|
||||
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i
|
|||
mShowHistory(false),
|
||||
mMessages(NULL),
|
||||
mHistoryThreadsBusy(false),
|
||||
mIsGroup(false),
|
||||
mOpened(false)
|
||||
{
|
||||
}
|
||||
|
|
@ -93,6 +94,7 @@ BOOL LLFloaterConversationPreview::postBuild()
|
|||
{
|
||||
name = conv->getConversationName();
|
||||
file = conv->getHistoryFileName();
|
||||
mIsGroup = (LLIMModel::LLIMSession::GROUP_SESSION == conv->getConversationType());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -101,6 +103,10 @@ BOOL LLFloaterConversationPreview::postBuild()
|
|||
}
|
||||
// <FS:Ansariel> Remember used log file name
|
||||
mChatHistoryFileName = file;
|
||||
if (mIsGroup)
|
||||
{
|
||||
mChatHistoryFileName += GROUP_CHAT_SUFFIX;
|
||||
}
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[NAME]"] = name;
|
||||
std::string title = getString("Title", args);
|
||||
|
|
@ -164,6 +170,7 @@ void LLFloaterConversationPreview::onOpen(const LLSD& key)
|
|||
LLSD load_params;
|
||||
load_params["load_all_history"] = true;
|
||||
load_params["cut_off_todays_date"] = false;
|
||||
load_params["is_group"] = mIsGroup;
|
||||
|
||||
// The temporary message list with "Loading..." text
|
||||
// Will be deleted upon loading completion in setPages() method
|
||||
|
|
|
|||
|
|
@ -78,6 +78,7 @@ private:
|
|||
bool mShowHistory;
|
||||
bool mHistoryThreadsBusy;
|
||||
bool mOpened;
|
||||
bool mIsGroup;
|
||||
};
|
||||
|
||||
#endif /* LLFLOATERCONVERSATIONPREVIEW_H_ */
|
||||
|
|
|
|||
|
|
@ -0,0 +1,154 @@
|
|||
/**
|
||||
* @file llfloaterforgetuser.cpp
|
||||
* @brief LLFloaterForgetUser class definition.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2019&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2019, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
#if 0
|
||||
#include "llfloaterforgetuser.h"
|
||||
|
||||
#include "llcheckboxctrl.h"
|
||||
#include "llfavoritesbar.h"
|
||||
#include "llpanellogin.h" // for helper function getUserName() and to repopulate list if nessesary
|
||||
#include "llscrolllistctrl.h"
|
||||
#include "llsecapi.h"
|
||||
#include "llviewernetwork.h"
|
||||
|
||||
|
||||
LLFloaterForgetUser::LLFloaterForgetUser(const LLSD &key)
|
||||
: LLFloater("floater_forget_user"),
|
||||
mLoginPanelDirty(false)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
LLFloaterForgetUser::~LLFloaterForgetUser()
|
||||
{
|
||||
if (mLoginPanelDirty)
|
||||
{
|
||||
LLPanelLogin::resetFields();
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLFloaterForgetUser::postBuild()
|
||||
{
|
||||
// Note, storage works per grid, watever is selected currently in login screen or logged in.
|
||||
// Since login screen can change grid, store the value.
|
||||
mGrid = LLGridManager::getInstance()->getGrid();
|
||||
|
||||
LLScrollListCtrl *scroll_list = getChild<LLScrollListCtrl>("user_list");
|
||||
if (gSecAPIHandler->hasCredentialMap("login_list", mGrid))
|
||||
{
|
||||
LLSecAPIHandler::credential_map_t credencials;
|
||||
gSecAPIHandler->loadCredentialMap("login_list", mGrid, credencials);
|
||||
|
||||
LLSecAPIHandler::credential_map_t::iterator cr_iter = credencials.begin();
|
||||
LLSecAPIHandler::credential_map_t::iterator cr_end = credencials.end();
|
||||
while (cr_iter != cr_end)
|
||||
{
|
||||
if (cr_iter->second.notNull()) // basic safety
|
||||
{
|
||||
LLScrollListItem::Params item_params;
|
||||
item_params.value(cr_iter->first);
|
||||
item_params.columns.add()
|
||||
.value(LLPanelLogin::getUserName(cr_iter->second))
|
||||
.column("user")
|
||||
.font(LLFontGL::getFontSansSerifSmall());
|
||||
scroll_list->addRow(item_params, ADD_BOTTOM);
|
||||
}
|
||||
cr_iter++;
|
||||
}
|
||||
scroll_list->selectFirstItem();
|
||||
}
|
||||
else
|
||||
{
|
||||
LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(mGrid);
|
||||
if (cred.notNull())
|
||||
{
|
||||
LLScrollListItem::Params item_params;
|
||||
item_params.value(cred->userID());
|
||||
item_params.columns.add()
|
||||
.value(LLPanelLogin::getUserName(cred))
|
||||
.column("user")
|
||||
.font(LLFontGL::getFontSansSerifSmall());
|
||||
scroll_list->addRow(item_params, ADD_BOTTOM);
|
||||
scroll_list->selectFirstItem();
|
||||
}
|
||||
}
|
||||
|
||||
bool enable_button = scroll_list->getFirstSelectedIndex() != -1;
|
||||
getChild<LLView>("delete_data")->setEnabled(enable_button);
|
||||
LLButton *button = getChild<LLButton>("forget");
|
||||
button->setEnabled(enable_button);
|
||||
button->setCommitCallback(boost::bind(&LLFloaterForgetUser::onForgetClicked, this));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void LLFloaterForgetUser::onForgetClicked()
|
||||
{
|
||||
mLoginPanelDirty = true;
|
||||
LLScrollListCtrl *scroll_list = getChild<LLScrollListCtrl>("user_list");
|
||||
std::string user_key = scroll_list->getSelectedValue();
|
||||
|
||||
// remove creds
|
||||
gSecAPIHandler->removeFromCredentialMap("login_list", mGrid, user_key);
|
||||
|
||||
LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(mGrid);
|
||||
if (cred.notNull() && cred->userID() == user_key)
|
||||
{
|
||||
gSecAPIHandler->deleteCredential(cred);
|
||||
}
|
||||
|
||||
// Clean data
|
||||
LLCheckBoxCtrl *chk_box = getChild<LLCheckBoxCtrl>("delete_data");
|
||||
BOOL delete_data = chk_box->getValue();
|
||||
if (delete_data)
|
||||
{
|
||||
// key is edentical to one we use for name of user's folder
|
||||
std::string user_path = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter() + user_key;
|
||||
gDirUtilp->deleteDirAndContents(user_path);
|
||||
|
||||
// Clean favorites, label is edentical to username
|
||||
LLFavoritesOrderStorage::removeFavoritesRecordOfUser(scroll_list->getSelectedItemLabel(), mGrid);
|
||||
|
||||
// Note: we do not clean user-related files from cache because there are id dependent (inventory)
|
||||
// files and cache has separate cleaning mechanism either way.
|
||||
// Also this only cleans user from current grid, not all of them.
|
||||
}
|
||||
|
||||
|
||||
// Update UI
|
||||
scroll_list->deleteSelectedItems();
|
||||
scroll_list->selectFirstItem();
|
||||
if (scroll_list->getFirstSelectedIndex() == -1)
|
||||
{
|
||||
LLButton *button = getChild<LLButton>("forget");
|
||||
button->setEnabled(false);
|
||||
chk_box->setEnabled(false);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
/**
|
||||
* @file llfloaterforgetuser.h
|
||||
* @brief LLFloaterForgetUser class declaration.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2019&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2019, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
#if 0
|
||||
#ifndef LL_LLFLOATERFORGETUSER_H
|
||||
#define LL_LLFLOATERFORGETUSER_H
|
||||
|
||||
#include "llfloater.h"
|
||||
|
||||
class LLFloaterForgetUser : public LLFloater
|
||||
{
|
||||
public:
|
||||
LLFloaterForgetUser(const LLSD &key);
|
||||
~LLFloaterForgetUser();
|
||||
|
||||
BOOL postBuild();
|
||||
void onForgetClicked();
|
||||
|
||||
private:
|
||||
bool mLoginPanelDirty;
|
||||
std::string mGrid;
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -2400,7 +2400,7 @@ void LLPanelLandOptions::refreshSearch()
|
|||
// effort to reduce search spam from small parcels. See also
|
||||
// the search crawler "grid-crawl.py" in secondlife.com/doc/app/search/ JC
|
||||
const S32 MIN_PARCEL_AREA_FOR_SEARCH = 128;
|
||||
bool large_enough = parcel->getArea() > MIN_PARCEL_AREA_FOR_SEARCH;
|
||||
bool large_enough = parcel->getArea() >= MIN_PARCEL_AREA_FOR_SEARCH;
|
||||
if (large_enough)
|
||||
{
|
||||
if (can_change)
|
||||
|
|
|
|||
|
|
@ -581,6 +581,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
|
|||
mCommitCallbackRegistrar.add("Pref.TranslationSettings", boost::bind(&LLFloaterPreference::onClickTranslationSettings, this));
|
||||
mCommitCallbackRegistrar.add("Pref.AutoReplace", boost::bind(&LLFloaterPreference::onClickAutoReplace, this));
|
||||
mCommitCallbackRegistrar.add("Pref.PermsDefault", boost::bind(&LLFloaterPreference::onClickPermsDefault, this));
|
||||
mCommitCallbackRegistrar.add("Pref.RememberedUsernames", boost::bind(&LLFloaterPreference::onClickRememberedUsernames, this));
|
||||
mCommitCallbackRegistrar.add("Pref.SpellChecker", boost::bind(&LLFloaterPreference::onClickSpellChecker, this));
|
||||
mCommitCallbackRegistrar.add("Pref.Advanced", boost::bind(&LLFloaterPreference::onClickAdvanced, this));
|
||||
|
||||
|
|
@ -3554,6 +3555,11 @@ void LLFloaterPreference::onClickPermsDefault()
|
|||
LLFloaterReg::showInstance("perms_default");
|
||||
}
|
||||
|
||||
void LLFloaterPreference::onClickRememberedUsernames()
|
||||
{
|
||||
LLFloaterReg::showInstance("forget_username");
|
||||
}
|
||||
|
||||
void LLFloaterPreference::onDeleteTranscripts()
|
||||
{
|
||||
LLSD args;
|
||||
|
|
|
|||
|
|
@ -258,6 +258,7 @@ public:
|
|||
void onClickProxySettings();
|
||||
void onClickTranslationSettings();
|
||||
void onClickPermsDefault();
|
||||
void onClickRememberedUsernames();
|
||||
void onClickAutoReplace();
|
||||
void onClickSpellChecker();
|
||||
void onClickRenderExceptions();
|
||||
|
|
|
|||
|
|
@ -990,7 +990,7 @@ void LLIMModel::LLIMSession::loadHistory()
|
|||
std::list<LLSD> chat_history;
|
||||
|
||||
//involves parsing of a chat history
|
||||
LLLogChat::loadChatHistory(mHistoryFileName, chat_history);
|
||||
LLLogChat::loadChatHistory(mHistoryFileName, chat_history, LLSD(), isGroupChat());
|
||||
addMessagesFromHistory(chat_history);
|
||||
}
|
||||
}
|
||||
|
|
@ -1054,6 +1054,11 @@ bool LLIMModel::LLIMSession::isP2P()
|
|||
return IM_NOTHING_SPECIAL == mType;
|
||||
}
|
||||
|
||||
bool LLIMModel::LLIMSession::isGroupChat()
|
||||
{
|
||||
return IM_SESSION_GROUP_START == mType || (IM_SESSION_INVITE == mType && gAgent.isInGroup(mSessionID));
|
||||
}
|
||||
|
||||
bool LLIMModel::LLIMSession::isOtherParticipantAvaline()
|
||||
{
|
||||
return !mOtherParticipantIsAvatar;
|
||||
|
|
@ -1132,6 +1137,10 @@ void LLIMModel::LLIMSession::buildHistoryFileName()
|
|||
// </FS:Ansariel> [Legacy IM logfile names]
|
||||
}
|
||||
}
|
||||
else if (isGroupChat())
|
||||
{
|
||||
mHistoryFileName = mName + GROUP_CHAT_SUFFIX;
|
||||
}
|
||||
}
|
||||
|
||||
//static
|
||||
|
|
|
|||
|
|
@ -100,6 +100,7 @@ public:
|
|||
bool isOutgoingAdHoc() const;
|
||||
bool isAdHoc();
|
||||
bool isP2P();
|
||||
bool isGroupChat();
|
||||
bool isOtherParticipantAvaline();
|
||||
|
||||
bool isP2PSessionType() const { return mSessionType == P2P_SESSION;}
|
||||
|
|
|
|||
|
|
@ -317,7 +317,6 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
|
|||
{
|
||||
// <FS:Ansariel> Optional hiding of Received Items folder aka Inbox
|
||||
//getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_INBOX));
|
||||
getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_OUTBOX));
|
||||
}
|
||||
// hide marketplace listing box, unless we are a marketplace panel
|
||||
if (!gSavedSettings.getBOOL("InventoryOutboxMakeVisible") && !mParams.use_marketplace_folders)
|
||||
|
|
|
|||
|
|
@ -71,6 +71,8 @@ const std::string LL_IM_FROM("from");
|
|||
const std::string LL_IM_FROM_ID("from_id");
|
||||
const std::string LL_TRANSCRIPT_FILE_EXTENSION("txt");
|
||||
|
||||
const std::string GROUP_CHAT_SUFFIX(" (group)");
|
||||
|
||||
const static char IM_SYMBOL_SEPARATOR(':');
|
||||
const static std::string IM_SEPARATOR(std::string() + IM_SYMBOL_SEPARATOR + " ");
|
||||
const static std::string NEW_LINE("\n");
|
||||
|
|
@ -432,7 +434,7 @@ void LLLogChat::saveHistory(const std::string& filename,
|
|||
}
|
||||
|
||||
// static
|
||||
void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params)
|
||||
void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params, bool is_group)
|
||||
{
|
||||
if (file_name.empty())
|
||||
{
|
||||
|
|
@ -445,10 +447,25 @@ void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& m
|
|||
LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
|
||||
if (!fptr)
|
||||
{
|
||||
fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
|
||||
if (is_group)
|
||||
{
|
||||
std::string old_name(file_name);
|
||||
old_name.erase(old_name.size() - GROUP_CHAT_SUFFIX.size());
|
||||
fptr = LLFile::fopen(LLLogChat::makeLogFileName(old_name), "r");
|
||||
if (fptr)
|
||||
{
|
||||
fclose(fptr);
|
||||
LLFile::copy(LLLogChat::makeLogFileName(old_name), LLLogChat::makeLogFileName(file_name));
|
||||
}
|
||||
fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");
|
||||
}
|
||||
if (!fptr)
|
||||
{
|
||||
return; //No previous conversation with this name.
|
||||
fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
|
||||
if (!fptr)
|
||||
{
|
||||
return; //No previous conversation with this name.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1197,12 +1214,28 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL
|
|||
|
||||
if (!fptr)
|
||||
{
|
||||
fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
|
||||
bool is_group = load_params.has("is_group") ? load_params["is_group"].asBoolean() : false;
|
||||
if (is_group)
|
||||
{
|
||||
std::string old_name(file_name);
|
||||
old_name.erase(old_name.size() - GROUP_CHAT_SUFFIX.size());
|
||||
fptr = LLFile::fopen(LLLogChat::makeLogFileName(old_name), "r");
|
||||
if (fptr)
|
||||
{
|
||||
fclose(fptr);
|
||||
LLFile::copy(LLLogChat::makeLogFileName(old_name), LLLogChat::makeLogFileName(file_name));
|
||||
}
|
||||
fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");
|
||||
}
|
||||
if (!fptr)
|
||||
{
|
||||
mNewLoad = false;
|
||||
(*mLoadEndSignal)(messages, file_name);
|
||||
return; //No previous conversation with this name.
|
||||
fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
|
||||
if (!fptr)
|
||||
{
|
||||
mNewLoad = false;
|
||||
(*mLoadEndSignal)(messages, file_name);
|
||||
return; //No previous conversation with this name.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ public:
|
|||
static void getListOfTranscriptFiles(std::vector<std::string>& list);
|
||||
static void getListOfTranscriptBackupFiles(std::vector<std::string>& list_of_transcriptions);
|
||||
|
||||
static void loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params = LLSD());
|
||||
static void loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params = LLSD(), bool is_group = false);
|
||||
|
||||
typedef boost::signals2::signal<void ()> save_history_signal_t;
|
||||
static boost::signals2::connection setSaveHistorySignal(const save_history_signal_t::slot_type& cb);
|
||||
|
|
@ -192,6 +192,7 @@ protected:
|
|||
virtual ~LLChatLogParser() {};
|
||||
};
|
||||
|
||||
extern const std::string GROUP_CHAT_SUFFIX;
|
||||
|
||||
// LLSD map lookup constants
|
||||
extern const std::string LL_IM_TIME; //("time");
|
||||
|
|
|
|||
|
|
@ -145,10 +145,13 @@ LLPointer<LLCredential> LLLoginHandler::initializeLoginInfo()
|
|||
// so try to load it from the UserLoginInfo
|
||||
result = loadSavedUserLoginInfo();
|
||||
// <FS:CR>
|
||||
//if (result.isNull())
|
||||
//if (result.isNull())
|
||||
//{
|
||||
// result = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
|
||||
//}
|
||||
//// Since legacy viewer store login info one per grid, newer viewers have to
|
||||
//// reuse same information to remember last user and for compatibility,
|
||||
//// but otherwise login info is stored in separate map in gSecAPIHandler
|
||||
//result = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
|
||||
//}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -614,6 +614,8 @@ BOOL LLPanelStandStopFlying::postBuild()
|
|||
mStopFlyingButton->setCommitCallback(boost::bind(&LLPanelStandStopFlying::onStopFlyingButtonClick, this));
|
||||
mStopFlyingButton->setVisible(FALSE);
|
||||
|
||||
gViewerWindow->setOnWorldViewRectUpdated(boost::bind(&LLPanelStandStopFlying::updatePosition, this));
|
||||
|
||||
mFlycamButton = getChild<LLButton>("flycam_btn");
|
||||
mFlycamButton->setVisible(FALSE);
|
||||
|
||||
|
|
|
|||
|
|
@ -79,6 +79,60 @@ LLPanelLogin *LLPanelLogin::sInstance = NULL;
|
|||
BOOL LLPanelLogin::sCapslockDidNotification = FALSE;
|
||||
BOOL LLPanelLogin::sCredentialSet = FALSE;
|
||||
|
||||
// Helper functions
|
||||
|
||||
LLPointer<LLCredential> load_user_credentials(std::string &user_key)
|
||||
{
|
||||
if (gSecAPIHandler->hasCredentialMap("login_list", LLGridManager::getInstance()->getGrid()))
|
||||
{
|
||||
// user_key should be of "name Resident" format
|
||||
return gSecAPIHandler->loadFromCredentialMap("login_list", LLGridManager::getInstance()->getGrid(), user_key);
|
||||
}
|
||||
else
|
||||
{
|
||||
// legacy (or legacy^2, since it also tries to load from settings)
|
||||
return gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
|
||||
}
|
||||
}
|
||||
|
||||
// keys are lower case to be case insensitive so they are not always
|
||||
// identical to names which retain user input, like:
|
||||
// "AwEsOmE Resident" -> "awesome_resident"
|
||||
std::string get_user_key_from_name(const std::string &username)
|
||||
{
|
||||
std::string key = username;
|
||||
LLStringUtil::trim(key);
|
||||
LLStringUtil::toLower(key);
|
||||
if (!LLGridManager::getInstance()->isSystemGrid())
|
||||
{
|
||||
size_t separator_index = username.find_first_of(" ");
|
||||
if (separator_index == username.npos)
|
||||
{
|
||||
// CRED_IDENTIFIER_TYPE_ACCOUNT
|
||||
return key;
|
||||
}
|
||||
}
|
||||
// CRED_IDENTIFIER_TYPE_AGENT
|
||||
size_t separator_index = username.find_first_of(" ._");
|
||||
std::string first = username.substr(0, separator_index);
|
||||
std::string last;
|
||||
if (separator_index != username.npos)
|
||||
{
|
||||
last = username.substr(separator_index + 1, username.npos);
|
||||
LLStringUtil::trim(last);
|
||||
}
|
||||
else
|
||||
{
|
||||
// ...on Linden grids, single username users as considered to have
|
||||
// last name "Resident"
|
||||
// *TODO: Make login.cgi support "account_name" like above
|
||||
last = "resident";
|
||||
}
|
||||
|
||||
key = first + "_" + last;
|
||||
return key;
|
||||
}
|
||||
|
||||
class LLLoginLocationAutoHandler : public LLCommandHandler
|
||||
{
|
||||
public:
|
||||
|
|
@ -170,6 +224,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
|||
mCallback(callback),
|
||||
mCallbackData(cb_data),
|
||||
mListener(new LLPanelLoginListener(this)),
|
||||
mFirstLoginThisInstall(gSavedSettings.getBOOL("FirstLoginThisInstall")),
|
||||
mUsernameLength(0),
|
||||
mPasswordLength(0),
|
||||
mLocationLength(0),
|
||||
|
|
@ -188,7 +243,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
|||
login_holder->addChild(this);
|
||||
}
|
||||
|
||||
if (gSavedSettings.getBOOL("FirstLoginThisInstall"))
|
||||
if (mFirstLoginThisInstall)
|
||||
{
|
||||
buildFromFile( "panel_login_first.xml");
|
||||
}
|
||||
|
|
@ -208,35 +263,39 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
|||
sendChildToBack(getChildView("forgot_password_text"));
|
||||
sendChildToBack(getChildView("sign_up_text"));
|
||||
|
||||
LLComboBox* favorites_combo = getChild<LLComboBox>("start_location_combo");
|
||||
updateLocationSelectorsVisibility(); // separate so that it can be called from preferences
|
||||
favorites_combo->setReturnCallback(boost::bind(&LLPanelLogin::onClickConnect, this));
|
||||
favorites_combo->setFocusLostCallback(boost::bind(&LLPanelLogin::onLocationSLURL, this));
|
||||
|
||||
LLComboBox* server_choice_combo = getChild<LLComboBox>("server_combo");
|
||||
server_choice_combo->setCommitCallback(boost::bind(&LLPanelLogin::onSelectServer, this));
|
||||
|
||||
// Load all of the grids, sorted, and then add a bar and the current grid at the top
|
||||
server_choice_combo->removeall();
|
||||
std::string current_grid = LLGridManager::getInstance()->getGrid();
|
||||
if (!mFirstLoginThisInstall)
|
||||
{
|
||||
LLComboBox* favorites_combo = getChild<LLComboBox>("start_location_combo");
|
||||
updateLocationSelectorsVisibility(); // separate so that it can be called from preferences
|
||||
favorites_combo->setReturnCallback(boost::bind(&LLPanelLogin::onClickConnect, this));
|
||||
favorites_combo->setFocusLostCallback(boost::bind(&LLPanelLogin::onLocationSLURL, this));
|
||||
|
||||
std::string current_grid = LLGridManager::getInstance()->getGrid();
|
||||
std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
|
||||
for (std::map<std::string, std::string>::iterator grid_choice = known_grids.begin();
|
||||
grid_choice != known_grids.end();
|
||||
grid_choice++)
|
||||
{
|
||||
if (!grid_choice->first.empty() && current_grid != grid_choice->first)
|
||||
{
|
||||
LL_DEBUGS("AppInit")<<"adding "<<grid_choice->first<<LL_ENDL;
|
||||
server_choice_combo->add(grid_choice->second, grid_choice->first);
|
||||
}
|
||||
}
|
||||
server_choice_combo->sortByName();
|
||||
LL_DEBUGS("AppInit")<<"adding current "<<current_grid<<LL_ENDL;
|
||||
server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(),
|
||||
current_grid,
|
||||
ADD_TOP);
|
||||
server_choice_combo->selectFirstItem();
|
||||
LLComboBox* server_choice_combo = getChild<LLComboBox>("server_combo");
|
||||
server_choice_combo->setCommitCallback(boost::bind(&LLPanelLogin::onSelectServer, this));
|
||||
|
||||
// Load all of the grids, sorted, and then add a bar and the current grid at the top
|
||||
server_choice_combo->removeall();
|
||||
|
||||
std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
|
||||
for (std::map<std::string, std::string>::iterator grid_choice = known_grids.begin();
|
||||
grid_choice != known_grids.end();
|
||||
grid_choice++)
|
||||
{
|
||||
if (!grid_choice->first.empty() && current_grid != grid_choice->first)
|
||||
{
|
||||
LL_DEBUGS("AppInit") << "adding " << grid_choice->first << LL_ENDL;
|
||||
server_choice_combo->add(grid_choice->second, grid_choice->first);
|
||||
}
|
||||
}
|
||||
server_choice_combo->sortByName();
|
||||
|
||||
LL_DEBUGS("AppInit") << "adding current " << current_grid << LL_ENDL;
|
||||
server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(),
|
||||
current_grid,
|
||||
ADD_TOP);
|
||||
server_choice_combo->selectFirstItem();
|
||||
}
|
||||
|
||||
LLSLURL start_slurl(LLStartUp::getStartSLURL());
|
||||
// The StartSLURL might have been set either by an explicit command-line
|
||||
|
|
@ -299,14 +358,30 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
|||
loadLoginPage();
|
||||
|
||||
LLComboBox* username_combo(getChild<LLComboBox>("username_combo"));
|
||||
username_combo->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this));
|
||||
username_combo->setTextChangedCallback(boost::bind(&LLPanelLogin::onUserNameTextEnty, this));
|
||||
// STEAM-14: When user presses Enter with this field in focus, initiate login
|
||||
username_combo->setCommitCallback(boost::bind(&LLPanelLogin::onClickConnect, this));
|
||||
username_combo->setCommitCallback(boost::bind(&LLPanelLogin::onUserListCommit, this));
|
||||
username_combo->setReturnCallback(boost::bind(&LLPanelLogin::onClickConnect, this));
|
||||
username_combo->setKeystrokeOnEsc(TRUE);
|
||||
|
||||
if (!mFirstLoginThisInstall)
|
||||
{
|
||||
LLCheckBoxCtrl* remember_name = getChild<LLCheckBoxCtrl>("remember_name");
|
||||
remember_name->setCommitCallback(boost::bind(&LLPanelLogin::onRememberUserCheck, this));
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelLogin::addFavoritesToStartLocation()
|
||||
{
|
||||
if (mFirstLoginThisInstall)
|
||||
{
|
||||
// first login panel has no favorites, just update name length and buttons
|
||||
std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple();
|
||||
mUsernameLength = user_defined_name.length();
|
||||
updateLoginButtons();
|
||||
return;
|
||||
}
|
||||
|
||||
// Clear the combo.
|
||||
LLComboBox* combo = getChild<LLComboBox>("start_location_combo");
|
||||
if (!combo) return;
|
||||
|
|
@ -318,14 +393,14 @@ void LLPanelLogin::addFavoritesToStartLocation()
|
|||
|
||||
// Load favorites into the combo.
|
||||
std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple();
|
||||
LLStringUtil::trim(user_defined_name);
|
||||
LLStringUtil::toLower(user_defined_name);
|
||||
std::replace(user_defined_name.begin(), user_defined_name.end(), '.', ' ');
|
||||
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites_" + LLGridManager::getInstance()->getGrid() + ".xml");
|
||||
std::string old_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
|
||||
mUsernameLength = user_defined_name.length();
|
||||
updateLoginButtons();
|
||||
|
||||
std::string::size_type index = user_defined_name.find(' ');
|
||||
std::string::size_type index = user_defined_name.find_first_of(" ._");
|
||||
if (index != std::string::npos)
|
||||
{
|
||||
std::string username = user_defined_name.substr(0, index);
|
||||
|
|
@ -334,6 +409,10 @@ void LLPanelLogin::addFavoritesToStartLocation()
|
|||
{
|
||||
user_defined_name = username;
|
||||
}
|
||||
else
|
||||
{
|
||||
user_defined_name = username + " " + lastname;
|
||||
}
|
||||
}
|
||||
|
||||
LLSD fav_llsd;
|
||||
|
|
@ -444,24 +523,6 @@ void LLPanelLogin::giveFocus()
|
|||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelLogin::showLoginWidgets()
|
||||
{
|
||||
if (sInstance)
|
||||
{
|
||||
// *NOTE: Mani - This may or may not be obselete code.
|
||||
// It seems to be part of the defunct? reg-in-client project.
|
||||
sInstance->getChildView("login_widgets")->setVisible( true);
|
||||
LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
|
||||
|
||||
// *TODO: Append all the usual login parameters, like first_login=Y etc.
|
||||
std::string splash_screen_url = LLGridManager::getInstance()->getLoginPage();
|
||||
web_browser->navigateTo( splash_screen_url, "text/html" );
|
||||
LLUICtrl* username_combo = sInstance->getChild<LLUICtrl>("username_combo");
|
||||
username_combo->setFocus(TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelLogin::show(const LLRect &rect,
|
||||
void (*callback)(S32 option, void* user_data),
|
||||
|
|
@ -482,9 +543,55 @@ void LLPanelLogin::show(const LLRect &rect,
|
|||
gFocusMgr.setDefaultKeyboardFocus(sInstance);
|
||||
}
|
||||
|
||||
//static
|
||||
void LLPanelLogin::populateFields(LLPointer<LLCredential> credential, bool remember_user, bool remember_psswrd)
|
||||
{
|
||||
if (!sInstance)
|
||||
{
|
||||
LL_WARNS() << "Attempted fillFields with no login view shown" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
LLUICtrl* remember_check = sInstance->getChild<LLUICtrl>("remember_check");
|
||||
remember_check->setValue(remember_psswrd);
|
||||
if (sInstance->mFirstLoginThisInstall)
|
||||
{
|
||||
// no list to populate
|
||||
setFields(credential, remember_psswrd);
|
||||
}
|
||||
else
|
||||
{
|
||||
sInstance->getChild<LLUICtrl>("remember_name")->setValue(remember_user);
|
||||
sInstance->populateUserList(credential, remember_psswrd);
|
||||
remember_check->setEnabled(remember_user);
|
||||
}
|
||||
}
|
||||
|
||||
//static
|
||||
void LLPanelLogin::resetFields()
|
||||
{
|
||||
if (!sInstance)
|
||||
{
|
||||
// class not existing at this point might happen since this
|
||||
// function is used to reset list in case of changes by external sources
|
||||
return;
|
||||
}
|
||||
if (sInstance->mFirstLoginThisInstall)
|
||||
{
|
||||
// no list to populate
|
||||
LL_WARNS() << "Shouldn't happen, user should have no ability to modify list on first install" << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LLUICtrl* remember_check = sInstance->getChild<LLUICtrl>("remember_check");
|
||||
bool remember_psswrd = remember_check->getValue();
|
||||
LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
|
||||
sInstance->populateUserList(cred, remember_psswrd);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelLogin::setFields(LLPointer<LLCredential> credential,
|
||||
BOOL remember)
|
||||
bool remember_psswrd)
|
||||
{
|
||||
if (!sInstance)
|
||||
{
|
||||
|
|
@ -494,13 +601,15 @@ void LLPanelLogin::setFields(LLPointer<LLCredential> credential,
|
|||
sCredentialSet = TRUE;
|
||||
LL_INFOS("Credentials") << "Setting login fields to " << *credential << LL_ENDL;
|
||||
|
||||
LLSD identifier = credential->getIdentifier();
|
||||
if((std::string)identifier["type"] == "agent")
|
||||
LLSD identifier = credential.notNull() ? credential->getIdentifier() : LLSD();
|
||||
|
||||
if(identifier.has("type") && (std::string)identifier["type"] == "agent")
|
||||
{
|
||||
// not nessesary for panel_login.xml, needed for panel_login_first.xml
|
||||
std::string firstname = identifier["first_name"].asString();
|
||||
std::string lastname = identifier["last_name"].asString();
|
||||
std::string login_id = firstname;
|
||||
if (!lastname.empty() && lastname != "Resident")
|
||||
if (!lastname.empty() && lastname != "Resident" && lastname != "resident")
|
||||
{
|
||||
// support traditional First Last name SLURLs
|
||||
login_id += " ";
|
||||
|
|
@ -508,22 +617,23 @@ void LLPanelLogin::setFields(LLPointer<LLCredential> credential,
|
|||
}
|
||||
sInstance->getChild<LLComboBox>("username_combo")->setLabel(login_id);
|
||||
}
|
||||
else if((std::string)identifier["type"] == "account")
|
||||
else if(identifier.has("type") && (std::string)identifier["type"] == "account")
|
||||
{
|
||||
sInstance->getChild<LLComboBox>("username_combo")->setLabel((std::string)identifier["account_name"]);
|
||||
}
|
||||
else
|
||||
{
|
||||
sInstance->getChild<LLComboBox>("username_combo")->setLabel(std::string());
|
||||
sInstance->getChild<LLComboBox>("username_combo")->setLabel(std::string());
|
||||
}
|
||||
|
||||
sInstance->addFavoritesToStartLocation();
|
||||
// if the password exists in the credential, set the password field with
|
||||
// a filler to get some stars
|
||||
LLSD authenticator = credential->getAuthenticator();
|
||||
LLSD authenticator = credential.notNull() ? credential->getAuthenticator() : LLSD();
|
||||
LL_INFOS("Credentials") << "Setting authenticator field " << authenticator["type"].asString() << LL_ENDL;
|
||||
if(authenticator.isMap() &&
|
||||
authenticator.has("secret") &&
|
||||
(authenticator["secret"].asString().size() > 0) && remember)
|
||||
(authenticator["secret"].asString().size() > 0) && remember_psswrd)
|
||||
{
|
||||
|
||||
// This is a MD5 hex digest of a password.
|
||||
|
|
@ -539,36 +649,25 @@ void LLPanelLogin::setFields(LLPointer<LLCredential> credential,
|
|||
{
|
||||
sInstance->getChild<LLUICtrl>("password_edit")->setValue(std::string());
|
||||
}
|
||||
sInstance->getChild<LLUICtrl>("remember_check")->setValue(remember);
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
|
||||
BOOL& remember)
|
||||
bool& remember_user,
|
||||
bool& remember_psswrd)
|
||||
{
|
||||
if (!sInstance)
|
||||
{
|
||||
LL_WARNS() << "Attempted getFields with no login view shown" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
// load the credential so we can pass back the stored password or hash if the user did
|
||||
// not modify the password field.
|
||||
|
||||
credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
|
||||
|
||||
LLSD identifier = LLSD::emptyMap();
|
||||
LLSD authenticator = LLSD::emptyMap();
|
||||
|
||||
if(credential.notNull())
|
||||
{
|
||||
authenticator = credential->getAuthenticator();
|
||||
}
|
||||
|
||||
std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
|
||||
LLStringUtil::trim(username);
|
||||
std::string username = sInstance->getChild<LLComboBox>("username_combo")->getValue().asString();
|
||||
std::string password = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
|
||||
LLStringUtil::trim(username);
|
||||
|
||||
LL_INFOS("Credentials", "Authentication") << "retrieving username:" << username << LL_ENDL;
|
||||
// determine if the username is a first/last form or not.
|
||||
|
|
@ -588,6 +687,14 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
|
|||
authenticator["type"] = CRED_AUTHENTICATOR_TYPE_CLEAR;
|
||||
authenticator["secret"] = password;
|
||||
}
|
||||
else
|
||||
{
|
||||
credential = load_user_credentials(username);
|
||||
if (credential.notNull())
|
||||
{
|
||||
authenticator = credential->getAuthenticator();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -599,7 +706,7 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
|
|||
if (separator_index != username.npos)
|
||||
{
|
||||
last = username.substr(separator_index+1, username.npos);
|
||||
LLStringUtil::trim(last);
|
||||
LLStringUtil::trim(last);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -627,10 +734,28 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
|
|||
pass.hex_digest(md5pass);
|
||||
authenticator["secret"] = md5pass;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string key = first + "_" + last;
|
||||
LLStringUtil::toLower(key);
|
||||
credential = load_user_credentials(key);
|
||||
if (credential.notNull())
|
||||
{
|
||||
authenticator = credential->getAuthenticator();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
credential = gSecAPIHandler->createCredential(LLGridManager::getInstance()->getGrid(), identifier, authenticator);
|
||||
remember = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
|
||||
remember_psswrd = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
|
||||
if (!sInstance->mFirstLoginThisInstall)
|
||||
{
|
||||
remember_user = sInstance->getChild<LLUICtrl>("remember_name")->getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
remember_user = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -900,8 +1025,8 @@ void LLPanelLogin::onClickConnect(void *)
|
|||
{
|
||||
sCredentialSet = FALSE;
|
||||
LLPointer<LLCredential> cred;
|
||||
BOOL remember;
|
||||
getFields(cred, remember);
|
||||
bool remember_1, remember_2;
|
||||
getFields(cred, remember_1, remember_2);
|
||||
std::string identifier_type;
|
||||
cred->identifierType(identifier_type);
|
||||
LLSD allowed_credential_types;
|
||||
|
|
@ -954,6 +1079,57 @@ void LLPanelLogin::onClickSignUp(void*)
|
|||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelLogin::onUserNameTextEnty(void*)
|
||||
{
|
||||
sInstance->mPasswordModified = true;
|
||||
sInstance->getChild<LLUICtrl>("password_edit")->setValue(std::string());
|
||||
sInstance->addFavoritesToStartLocation(); //will call updateLoginButtons()
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelLogin::onUserListCommit(void*)
|
||||
{
|
||||
if (sInstance)
|
||||
{
|
||||
LLComboBox* username_combo(sInstance->getChild<LLComboBox>("username_combo"));
|
||||
static S32 ind = -1;
|
||||
if (ind != username_combo->getCurrentIndex())
|
||||
{
|
||||
std::string user_key = username_combo->getSelectedValue();
|
||||
LLPointer<LLCredential> cred = gSecAPIHandler->loadFromCredentialMap("login_list", LLGridManager::getInstance()->getGrid(), user_key);
|
||||
bool remember_psswrd = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
|
||||
setFields(cred, remember_psswrd);
|
||||
sInstance->mPasswordModified = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string pass = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
|
||||
if (pass.empty())
|
||||
{
|
||||
sInstance->giveFocus();
|
||||
}
|
||||
else
|
||||
{
|
||||
onClickConnect(NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelLogin::onRememberUserCheck(void*)
|
||||
{
|
||||
if (sInstance)
|
||||
{
|
||||
LLCheckBoxCtrl* remember_name(sInstance->getChild<LLCheckBoxCtrl>("remember_name"));
|
||||
LLCheckBoxCtrl* remember_psswrd(sInstance->getChild<LLCheckBoxCtrl>("remember_check"));
|
||||
|
||||
bool remember = remember_name->getValue().asBoolean();
|
||||
remember_psswrd->setEnabled(remember);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
|
||||
{
|
||||
|
|
@ -981,9 +1157,11 @@ void LLPanelLogin::updateServer()
|
|||
// for that grid and set them to the UI.
|
||||
if(!sInstance->areCredentialFieldsDirty())
|
||||
{
|
||||
LLPointer<LLCredential> credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
|
||||
bool remember = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
|
||||
sInstance->setFields(credential, remember);
|
||||
// populate dropbox and setFields
|
||||
bool remember_psswrd = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
|
||||
// Note: following call is related to initializeLoginInfo()
|
||||
LLPointer<LLCredential> credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
|
||||
sInstance->populateUserList(credential, remember_psswrd);
|
||||
}
|
||||
|
||||
// update the login panel links
|
||||
|
|
@ -1013,14 +1191,63 @@ void LLPanelLogin::updateLoginButtons()
|
|||
LLButton* login_btn = getChild<LLButton>("connect_btn");
|
||||
|
||||
login_btn->setEnabled(mUsernameLength != 0 && mPasswordLength != 0);
|
||||
|
||||
if (!mFirstLoginThisInstall)
|
||||
{
|
||||
LLComboBox* user_combo = getChild<LLComboBox>("username_combo");
|
||||
LLCheckBoxCtrl* remember_name = getChild<LLCheckBoxCtrl>("remember_name");
|
||||
remember_name->setEnabled(user_combo->getCurrentIndex() == -1);
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelLogin::populateUserList(LLPointer<LLCredential> credential, bool remember_psswrd)
|
||||
{
|
||||
LLComboBox* user_combo = getChild<LLComboBox>("username_combo");
|
||||
user_combo->removeall();
|
||||
user_combo->clear();
|
||||
|
||||
if (gSecAPIHandler->hasCredentialMap("login_list", LLGridManager::getInstance()->getGrid()))
|
||||
{
|
||||
LLSecAPIHandler::credential_map_t credencials;
|
||||
gSecAPIHandler->loadCredentialMap("login_list", LLGridManager::getInstance()->getGrid(), credencials);
|
||||
|
||||
LLSecAPIHandler::credential_map_t::iterator cr_iter = credencials.begin();
|
||||
LLSecAPIHandler::credential_map_t::iterator cr_end = credencials.end();
|
||||
while (cr_iter != cr_end)
|
||||
{
|
||||
if (cr_iter->second.notNull()) // basic safety in case of future changes
|
||||
{
|
||||
// cr_iter->first == user_id , to be able to be find it in case we select it
|
||||
user_combo->add(LLPanelLogin::getUserName(cr_iter->second), cr_iter->first, ADD_BOTTOM, TRUE);
|
||||
}
|
||||
cr_iter++;
|
||||
}
|
||||
|
||||
if (credential.isNull() || !user_combo->setSelectedByValue(LLSD(credential->userID()), true))
|
||||
{
|
||||
// selection failed, just deselect whatever might be selected
|
||||
user_combo->setValue(std::string());
|
||||
}
|
||||
else
|
||||
{
|
||||
setFields(credential, remember_psswrd);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (credential.notNull())
|
||||
{
|
||||
user_combo->add(LLPanelLogin::getUserName(credential), credential->userID(), ADD_BOTTOM, TRUE);
|
||||
setFields(credential, remember_psswrd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLPanelLogin::onSelectServer()
|
||||
{
|
||||
// The user twiddled with the grid choice ui.
|
||||
// apply the selection to the grid setting.
|
||||
LLPointer<LLCredential> credential;
|
||||
|
||||
LLComboBox* server_combo = getChild<LLComboBox>("server_combo");
|
||||
LLSD server_combo_val = server_combo->getSelectedValue();
|
||||
LL_INFOS("AppInit") << "grid "<<server_combo_val.asString()<< LL_ENDL;
|
||||
|
|
@ -1079,4 +1306,34 @@ bool LLPanelLogin::getShowFavorites()
|
|||
return gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin");
|
||||
}
|
||||
|
||||
// static
|
||||
std::string LLPanelLogin::getUserName(LLPointer<LLCredential> &cred)
|
||||
{
|
||||
if (cred.isNull())
|
||||
{
|
||||
return "unknown";
|
||||
}
|
||||
const LLSD &ident = cred->getIdentifier();
|
||||
|
||||
if (!ident.isMap())
|
||||
{
|
||||
return "unknown";
|
||||
}
|
||||
else if ((std::string)ident["type"] == "agent")
|
||||
{
|
||||
std::string second_name = ident["last_name"];
|
||||
if (second_name == "resident" || second_name == "Resident")
|
||||
{
|
||||
return (std::string)ident["first_name"];
|
||||
}
|
||||
return (std::string)ident["first_name"] + " " + (std::string)ident["last_name"];
|
||||
}
|
||||
else if ((std::string)ident["type"] == "account")
|
||||
{
|
||||
return LLCacheName::cleanFullName((std::string)ident["account_name"]);
|
||||
}
|
||||
|
||||
return "unknown";
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -57,9 +57,9 @@ public:
|
|||
void (*callback)(S32 option, void* user_data),
|
||||
void* callback_data);
|
||||
|
||||
static void setFields(LLPointer<LLCredential> credential, BOOL remember);
|
||||
|
||||
static void getFields(LLPointer<LLCredential>& credential, BOOL& remember);
|
||||
static void populateFields(LLPointer<LLCredential> credential, bool remember_user, bool remember_psswrd);
|
||||
static void resetFields();
|
||||
static void getFields(LLPointer<LLCredential>& credential, bool& remember_user, bool& remember_psswrd);
|
||||
|
||||
static BOOL isCredentialSet() { return sCredentialSet; }
|
||||
|
||||
|
|
@ -74,8 +74,6 @@ public:
|
|||
|
||||
void setSiteIsAlive( bool alive );
|
||||
|
||||
void showLoginWidgets();
|
||||
|
||||
static void loadLoginPage();
|
||||
static void giveFocus();
|
||||
static void setAlwaysRefresh(bool refresh);
|
||||
|
|
@ -90,6 +88,9 @@ public:
|
|||
// called from prefs when initializing panel
|
||||
static bool getShowFavorites();
|
||||
|
||||
// extract name from cred in a format apropriate for username field
|
||||
static std::string getUserName(LLPointer<LLCredential> &cred);
|
||||
|
||||
private:
|
||||
friend class LLPanelLoginListener;
|
||||
void addFavoritesToStartLocation();
|
||||
|
|
@ -97,11 +98,16 @@ private:
|
|||
void onSelectServer();
|
||||
void onLocationSLURL();
|
||||
|
||||
static void setFields(LLPointer<LLCredential> credential, bool remember_psswrd);
|
||||
|
||||
static void onClickConnect(void*);
|
||||
static void onClickNewAccount(void*);
|
||||
static void onClickVersion(void*);
|
||||
static void onClickForgotPassword(void*);
|
||||
static void onClickSignUp(void*);
|
||||
static void onUserNameTextEnty(void*);
|
||||
static void onUserListCommit(void*);
|
||||
static void onRememberUserCheck(void*);
|
||||
static void onPassKey(LLLineEditor* caller, void* user_data);
|
||||
static void updateServerCombo();
|
||||
|
||||
|
|
@ -109,6 +115,7 @@ private:
|
|||
boost::scoped_ptr<LLPanelLoginListener> mListener;
|
||||
|
||||
void updateLoginButtons();
|
||||
void populateUserList(LLPointer<LLCredential> credential, bool remember_psswrd);
|
||||
|
||||
void (*mCallback)(S32 option, void *userdata);
|
||||
void* mCallbackData;
|
||||
|
|
|
|||
|
|
@ -464,8 +464,20 @@ public:
|
|||
// delete a protected data item from the store
|
||||
virtual void deleteProtectedData(const std::string& data_type,
|
||||
const std::string& data_id)=0;
|
||||
|
||||
virtual LLPointer<LLCredential> createCredential(const std::string& name,
|
||||
|
||||
// persist data in a protected store's map
|
||||
virtual void addToProtectedMap(const std::string& data_type,
|
||||
const std::string& data_id,
|
||||
const std::string& map_elem,
|
||||
const LLSD& data)=0;
|
||||
|
||||
// remove data from protected store's map
|
||||
virtual void removeFromProtectedMap(const std::string& data_type,
|
||||
const std::string& data_id,
|
||||
const std::string& map_elem)=0;
|
||||
|
||||
public:
|
||||
virtual LLPointer<LLCredential> createCredential(const std::string& grid,
|
||||
const LLSD& identifier,
|
||||
const LLSD& authenticator)=0;
|
||||
|
||||
|
|
@ -476,6 +488,38 @@ public:
|
|||
virtual void saveCredential(LLPointer<LLCredential> cred, bool save_authenticator)=0;
|
||||
|
||||
virtual void deleteCredential(LLPointer<LLCredential> cred)=0;
|
||||
|
||||
// has map of credentials declared as specific storage
|
||||
virtual bool hasCredentialMap(const std::string& storage,
|
||||
const std::string& grid)=0;
|
||||
|
||||
// load map of credentials from specific storage
|
||||
typedef std::map<std::string, LLPointer<LLCredential> > credential_map_t;
|
||||
virtual void loadCredentialMap(const std::string& storage,
|
||||
const std::string& grid,
|
||||
credential_map_t& credential_map)=0;
|
||||
|
||||
// load single username from map of credentials from specific storage
|
||||
virtual LLPointer<LLCredential> loadFromCredentialMap(const std::string& storage,
|
||||
const std::string& grid,
|
||||
const std::string& userid)=0;
|
||||
|
||||
// add item to map of credentials from specific storage
|
||||
virtual void addToCredentialMap(const std::string& storage,
|
||||
LLPointer<LLCredential> cred,
|
||||
bool save_authenticator)=0;
|
||||
|
||||
// remove item from map of credentials from specific storage
|
||||
virtual void removeFromCredentialMap(const std::string& storage,
|
||||
LLPointer<LLCredential> cred)=0;
|
||||
|
||||
// remove item from map of credentials from specific storage
|
||||
virtual void removeFromCredentialMap(const std::string& storage,
|
||||
const std::string& grid,
|
||||
const std::string& userid)=0;
|
||||
|
||||
virtual void removeCredentialMap(const std::string& storage,
|
||||
const std::string& grid)=0;
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@
|
|||
#include "llmachineid.h"
|
||||
|
||||
|
||||
static const std::string DEFAULT_CREDENTIAL_STORAGE = "credential";
|
||||
|
||||
// 128 bits of salt data...
|
||||
#define STORE_SALT_SIZE 16
|
||||
|
|
@ -1545,6 +1546,38 @@ void LLSecAPIBasicHandler::setProtectedData(const std::string& data_type,
|
|||
mProtectedDataMap[data_type][data_id] = data;
|
||||
}
|
||||
|
||||
// persist data in a protected store's map
|
||||
void LLSecAPIBasicHandler::addToProtectedMap(const std::string& data_type,
|
||||
const std::string& data_id,
|
||||
const std::string& map_elem,
|
||||
const LLSD& data)
|
||||
{
|
||||
if (!mProtectedDataMap.has(data_type) || !mProtectedDataMap[data_type].isMap()) {
|
||||
mProtectedDataMap[data_type] = LLSD::emptyMap();
|
||||
}
|
||||
|
||||
if (!mProtectedDataMap[data_type].has(data_id) || !mProtectedDataMap[data_type][data_id].isMap()) {
|
||||
mProtectedDataMap[data_type][data_id] = LLSD::emptyMap();
|
||||
}
|
||||
|
||||
mProtectedDataMap[data_type][data_id][map_elem] = data;
|
||||
}
|
||||
|
||||
// remove data from protected store's map
|
||||
void LLSecAPIBasicHandler::removeFromProtectedMap(const std::string& data_type,
|
||||
const std::string& data_id,
|
||||
const std::string& map_elem)
|
||||
{
|
||||
if (mProtectedDataMap.has(data_type) &&
|
||||
mProtectedDataMap[data_type].isMap() &&
|
||||
mProtectedDataMap[data_type].has(data_id) &&
|
||||
mProtectedDataMap[data_type][data_id].isMap() &&
|
||||
mProtectedDataMap[data_type][data_id].has(map_elem))
|
||||
{
|
||||
mProtectedDataMap[data_type][data_id].erase(map_elem);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Create a credential object from an identifier and authenticator. credentials are
|
||||
// per credential name (was: grid).
|
||||
|
|
@ -1557,10 +1590,10 @@ LLPointer<LLCredential> LLSecAPIBasicHandler::createCredential(const std::string
|
|||
return result;
|
||||
}
|
||||
|
||||
// Load a credential from the credential store, given the credential name
|
||||
// Load a credential from default credential store, given the credential name
|
||||
LLPointer<LLCredential> LLSecAPIBasicHandler::loadCredential(const std::string& credName)
|
||||
{
|
||||
LLSD credential = getProtectedData("credential", credName);
|
||||
LLSD credential = getProtectedData(DEFAULT_CREDENTIAL_STORAGE, credName);
|
||||
LLPointer<LLSecAPIBasicCredential> result = new LLSecAPIBasicCredential(credName);
|
||||
if(credential.isMap() &&
|
||||
credential.has("identifier"))
|
||||
|
|
@ -1615,7 +1648,7 @@ void LLSecAPIBasicHandler::saveCredential(LLPointer<LLCredential> cred, bool sav
|
|||
credential["authenticator"] = cred->getAuthenticator();
|
||||
}
|
||||
LL_DEBUGS("SECAPI") << "Saving Credential " << cred->getCredentialName() << ":" << cred->userID() << " " << save_authenticator << LL_ENDL;
|
||||
setProtectedData("credential", cred->getCredentialName(), credential);
|
||||
setProtectedData(DEFAULT_CREDENTIAL_STORAGE, cred->getCredentialName(), credential);
|
||||
//*TODO: If we're saving Agni credentials, should we write the
|
||||
// credentials to the legacy password.dat/etc?
|
||||
_writeProtectedData();
|
||||
|
|
@ -1625,19 +1658,145 @@ void LLSecAPIBasicHandler::saveCredential(LLPointer<LLCredential> cred, bool sav
|
|||
void LLSecAPIBasicHandler::deleteCredential(LLPointer<LLCredential> cred)
|
||||
{
|
||||
LLSD undefVal;
|
||||
deleteProtectedData("credential", cred->getCredentialName());
|
||||
deleteProtectedData(DEFAULT_CREDENTIAL_STORAGE, cred->getCredentialName());
|
||||
cred->setCredentialData(undefVal, undefVal);
|
||||
_writeProtectedData();
|
||||
}
|
||||
|
||||
// has map of credentials declared as specific storage
|
||||
bool LLSecAPIBasicHandler::hasCredentialMap(const std::string& storage, const std::string& grid)
|
||||
{
|
||||
if (storage == DEFAULT_CREDENTIAL_STORAGE)
|
||||
{
|
||||
LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
|
||||
}
|
||||
|
||||
LLSD credential = getProtectedData(storage, grid);
|
||||
|
||||
return credential.isMap();
|
||||
}
|
||||
|
||||
// Load map of credentials from specified credential store, given the grid
|
||||
void LLSecAPIBasicHandler::loadCredentialMap(const std::string& storage, const std::string& grid, credential_map_t& credential_map)
|
||||
{
|
||||
if (storage == DEFAULT_CREDENTIAL_STORAGE)
|
||||
{
|
||||
LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
|
||||
}
|
||||
|
||||
LLSD credential = getProtectedData(storage, grid);
|
||||
if (credential.isMap())
|
||||
{
|
||||
LLSD::map_const_iterator crd_it = credential.beginMap();
|
||||
for (; crd_it != credential.endMap(); crd_it++)
|
||||
{
|
||||
LLSD::String name = crd_it->first;
|
||||
const LLSD &link_map = crd_it->second;
|
||||
LLPointer<LLSecAPIBasicCredential> result = new LLSecAPIBasicCredential(grid);
|
||||
if (link_map.has("identifier"))
|
||||
{
|
||||
LLSD identifier = link_map["identifier"];
|
||||
LLSD authenticator;
|
||||
if (link_map.has("authenticator"))
|
||||
{
|
||||
authenticator = link_map["authenticator"];
|
||||
}
|
||||
result->setCredentialData(identifier, authenticator);
|
||||
}
|
||||
credential_map[name] = result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLPointer<LLCredential> LLSecAPIBasicHandler::loadFromCredentialMap(const std::string& storage, const std::string& grid, const std::string& userkey)
|
||||
{
|
||||
if (storage == DEFAULT_CREDENTIAL_STORAGE)
|
||||
{
|
||||
LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
|
||||
}
|
||||
|
||||
LLPointer<LLSecAPIBasicCredential> result = new LLSecAPIBasicCredential(grid);
|
||||
|
||||
LLSD credential = getProtectedData(storage, grid);
|
||||
if (credential.isMap() && credential.has(userkey) && credential[userkey].has("identifier"))
|
||||
{
|
||||
LLSD identifier = credential[userkey]["identifier"];
|
||||
LLSD authenticator;
|
||||
if (credential[userkey].has("authenticator"))
|
||||
{
|
||||
authenticator = credential[userkey]["authenticator"];
|
||||
}
|
||||
result->setCredentialData(identifier, authenticator);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// add item to map of credentials from specific storage
|
||||
void LLSecAPIBasicHandler::addToCredentialMap(const std::string& storage, LLPointer<LLCredential> cred, bool save_authenticator)
|
||||
{
|
||||
if (storage == DEFAULT_CREDENTIAL_STORAGE)
|
||||
{
|
||||
LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
|
||||
}
|
||||
|
||||
std::string user_id = cred->userID();
|
||||
LLSD credential = LLSD::emptyMap();
|
||||
credential["identifier"] = cred->getIdentifier();
|
||||
if (save_authenticator)
|
||||
{
|
||||
credential["authenticator"] = cred->getAuthenticator();
|
||||
}
|
||||
LL_DEBUGS("SECAPI") << "Saving Credential " << cred->getCredentialName() << ":" << cred->userID() << " " << save_authenticator << LL_ENDL;
|
||||
addToProtectedMap(storage, cred->getCredentialName(), user_id, credential);
|
||||
|
||||
_writeProtectedData();
|
||||
}
|
||||
|
||||
// remove item from map of credentials from specific storage
|
||||
void LLSecAPIBasicHandler::removeFromCredentialMap(const std::string& storage, LLPointer<LLCredential> cred)
|
||||
{
|
||||
if (storage == DEFAULT_CREDENTIAL_STORAGE)
|
||||
{
|
||||
LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
|
||||
}
|
||||
|
||||
LLSD undefVal;
|
||||
removeFromProtectedMap(storage, cred->getCredentialName(), cred->userID());
|
||||
cred->setCredentialData(undefVal, undefVal);
|
||||
_writeProtectedData();
|
||||
}
|
||||
|
||||
// remove item from map of credentials from specific storage
|
||||
void LLSecAPIBasicHandler::removeFromCredentialMap(const std::string& storage, const std::string& grid, const std::string& userkey)
|
||||
{
|
||||
if (storage == DEFAULT_CREDENTIAL_STORAGE)
|
||||
{
|
||||
LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
|
||||
}
|
||||
|
||||
LLSD undefVal;
|
||||
LLPointer<LLCredential> cred = loadFromCredentialMap(storage, grid, userkey);
|
||||
removeFromProtectedMap(storage, grid, userkey);
|
||||
cred->setCredentialData(undefVal, undefVal);
|
||||
_writeProtectedData();
|
||||
}
|
||||
|
||||
// remove item from map of credentials from specific storage
|
||||
void LLSecAPIBasicHandler::removeCredentialMap(const std::string& storage, const std::string& grid)
|
||||
{
|
||||
deleteProtectedData(storage, grid);
|
||||
_writeProtectedData();
|
||||
}
|
||||
|
||||
// List saved logins
|
||||
std::vector<std::string> LLSecAPIBasicHandler::listCredentials()
|
||||
{
|
||||
if (mProtectedDataMap.has("credential") && mProtectedDataMap["credential"].isMap())
|
||||
if (mProtectedDataMap.has(DEFAULT_CREDENTIAL_STORAGE) && mProtectedDataMap[DEFAULT_CREDENTIAL_STORAGE].isMap())
|
||||
{
|
||||
std::vector<std::string> logins(mProtectedDataMap["credential"].size());
|
||||
std::vector<std::string> logins(mProtectedDataMap[DEFAULT_CREDENTIAL_STORAGE].size());
|
||||
int i = 0;
|
||||
for (LLSD::map_const_iterator it = mProtectedDataMap["credential"].beginMap(); it != mProtectedDataMap["credential"].endMap(); ++it)
|
||||
for (LLSD::map_const_iterator it = mProtectedDataMap[DEFAULT_CREDENTIAL_STORAGE].beginMap(); it != mProtectedDataMap[DEFAULT_CREDENTIAL_STORAGE].endMap(); ++it)
|
||||
{
|
||||
logins[i++] = it->first;
|
||||
}
|
||||
|
|
@ -1684,15 +1843,18 @@ std::string LLSecAPIBasicCredential::userID() const
|
|||
}
|
||||
else if ((std::string)mIdentifier["type"] == "agent")
|
||||
{
|
||||
return (std::string)mIdentifier["first_name"] + "_" + (std::string)mIdentifier["last_name"];
|
||||
std::string id = (std::string)mIdentifier["first_name"] + "_" + (std::string)mIdentifier["last_name"];
|
||||
LLStringUtil::toLower(id);
|
||||
return id;
|
||||
}
|
||||
else if ((std::string)mIdentifier["type"] == "account")
|
||||
{
|
||||
return (std::string)mIdentifier["account_name"];
|
||||
std::string id = (std::string)mIdentifier["account_name"];
|
||||
LLStringUtil::toLower(id);
|
||||
return id;
|
||||
}
|
||||
|
||||
return "unknown";
|
||||
|
||||
}
|
||||
|
||||
// return a printable user identifier
|
||||
|
|
|
|||
|
|
@ -211,8 +211,9 @@ class LLSecAPIBasicCredential : public LLCredential
|
|||
public:
|
||||
LLSecAPIBasicCredential(const std::string& credName) : LLCredential(credName) {}
|
||||
virtual ~LLSecAPIBasicCredential() {}
|
||||
// return a value representing the user id, (could be guid, name, whatever)
|
||||
virtual std::string userID() const;
|
||||
// return a value representing the user id, used for server and voice
|
||||
// (could be guid, name in format "name_resident", whatever)
|
||||
virtual std::string userID() const;
|
||||
|
||||
// printible string identifying the credential.
|
||||
virtual std::string asString() const;
|
||||
|
|
@ -246,7 +247,10 @@ public:
|
|||
// exists, it'll be loaded. If not, one will be created (but not
|
||||
// persisted)
|
||||
virtual LLPointer<LLCertificateStore> getCertificateStore(const std::string& store_id);
|
||||
|
||||
|
||||
// protectedData functions technically should be pretected or private,
|
||||
// they are not because of llsechandler_basic_test imlementation
|
||||
|
||||
// persist data in a protected store
|
||||
virtual void setProtectedData(const std::string& data_type,
|
||||
const std::string& data_id,
|
||||
|
|
@ -259,21 +263,66 @@ public:
|
|||
// delete a protected data item from the store
|
||||
virtual void deleteProtectedData(const std::string& data_type,
|
||||
const std::string& data_id);
|
||||
|
||||
|
||||
// persist data in a protected store's map
|
||||
virtual void addToProtectedMap(const std::string& data_type,
|
||||
const std::string& data_id,
|
||||
const std::string& map_elem,
|
||||
const LLSD& data);
|
||||
|
||||
// remove data from protected store's map
|
||||
virtual void removeFromProtectedMap(const std::string& data_type,
|
||||
const std::string& data_id,
|
||||
const std::string& map_elem);
|
||||
|
||||
// credential management routines
|
||||
|
||||
virtual LLPointer<LLCredential> createCredential(const std::string& credName,
|
||||
const LLSD& identifier,
|
||||
const LLSD& authenticator);
|
||||
|
||||
|
||||
// load single credencial from default storage
|
||||
virtual LLPointer<LLCredential> loadCredential(const std::string& credName);
|
||||
|
||||
// save credencial to default storage
|
||||
virtual void saveCredential(LLPointer<LLCredential> cred, bool save_authenticator);
|
||||
|
||||
virtual void deleteCredential(LLPointer<LLCredential> cred);
|
||||
|
||||
virtual std::vector<std::string> listCredentials();
|
||||
|
||||
|
||||
// has map of credentials declared as specific storage
|
||||
virtual bool hasCredentialMap(const std::string& storage,
|
||||
const std::string& grid);
|
||||
|
||||
// load map of credentials from specific storage
|
||||
virtual void loadCredentialMap(const std::string& storage,
|
||||
const std::string& grid,
|
||||
credential_map_t& credential_map);
|
||||
|
||||
// load single username from map of credentials from specific storage
|
||||
virtual LLPointer<LLCredential> loadFromCredentialMap(const std::string& storage,
|
||||
const std::string& grid,
|
||||
const std::string& userid);
|
||||
|
||||
// add item to map of credentials from specific storage
|
||||
virtual void addToCredentialMap(const std::string& storage,
|
||||
LLPointer<LLCredential> cred,
|
||||
bool save_authenticator);
|
||||
|
||||
// remove item from map of credentials from specific storage
|
||||
virtual void removeFromCredentialMap(const std::string& storage,
|
||||
LLPointer<LLCredential> cred);
|
||||
|
||||
// remove item from map of credentials from specific storage
|
||||
virtual void removeFromCredentialMap(const std::string& storage,
|
||||
const std::string& grid,
|
||||
const std::string& userid);
|
||||
|
||||
virtual void removeCredentialMap(const std::string& storage,
|
||||
const std::string& grid);
|
||||
|
||||
|
||||
protected:
|
||||
void _readProtectedData();
|
||||
void _writeProtectedData();
|
||||
|
|
|
|||
|
|
@ -284,7 +284,8 @@ std::string LLStartUp::sStartSLURLString;
|
|||
|
||||
static LLPointer<LLCredential> gUserCredential;
|
||||
static std::string gDisplayName;
|
||||
static BOOL gRememberPassword = TRUE;
|
||||
static bool gRememberPassword = true;
|
||||
static bool gRememberUser = true;
|
||||
|
||||
static U64 gFirstSimHandle = 0;
|
||||
static LLHost gFirstSim;
|
||||
|
|
@ -1080,15 +1081,17 @@ bool idle_startup()
|
|||
// <FS:Ansariel> Option to not save password if using login cmdline switch;
|
||||
// gLoginHandler.initializeLoginInfo() sets AutoLogin to TRUE,
|
||||
// so we end up here!
|
||||
//gRememberPassword = TRUE;
|
||||
//gRememberPassword = true;
|
||||
//gRememberUser = true;
|
||||
//gSavedSettings.setBOOL("RememberPassword", TRUE);
|
||||
//gRememberUser = gSavedSettings.getBOOL("RememberUser");
|
||||
if (gSavedSettings.getBOOL("FSLoginDontSavePassword"))
|
||||
{
|
||||
gRememberPassword = FALSE;
|
||||
gRememberPassword = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
gRememberPassword = TRUE;
|
||||
gRememberPassword = true;
|
||||
gSavedSettings.setBOOL("RememberPassword", TRUE);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
|
@ -1100,12 +1103,14 @@ bool idle_startup()
|
|||
//{
|
||||
// // Console provided login&password
|
||||
// gRememberPassword = gSavedSettings.getBOOL("RememberPassword");
|
||||
// gRememberUser = gSavedSettings.getBOOL("RememberUser");
|
||||
// show_connect_box = false;
|
||||
//}
|
||||
// </FS:Ansariel>
|
||||
else
|
||||
{
|
||||
gRememberPassword = gSavedSettings.getBOOL("RememberPassword");
|
||||
gRememberUser = gSavedSettings.getBOOL("RememberUser");
|
||||
show_connect_box = TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -1217,10 +1222,7 @@ bool idle_startup()
|
|||
login_show();
|
||||
// connect dialog is already shown, so fill in the names
|
||||
// <FS:CR>
|
||||
//if (gUserCredential.notNull() && !LLPanelLogin::isCredentialSet())
|
||||
//{
|
||||
// LLPanelLogin::setFields( gUserCredential, gRememberPassword);
|
||||
//}
|
||||
//LLPanelLogin::populateFields( gUserCredential, gRememberUser, gRememberPassword);
|
||||
if (gUserCredential.notNull() && !FSPanelLogin::isCredentialSet())
|
||||
{
|
||||
FSPanelLogin::setFields(gUserCredential, true);
|
||||
|
|
@ -1355,7 +1357,7 @@ bool idle_startup()
|
|||
// TODO if not use viewer auth
|
||||
// Load all the name information out of the login view
|
||||
// <FS:Ansariel> [FS Login Panel]
|
||||
//LLPanelLogin::getFields(gUserCredential, gRememberPassword);
|
||||
//LLPanelLogin::getFields(gUserCredential, gRememberUser, gRememberPassword);
|
||||
FSPanelLogin::getFields(gUserCredential, gRememberPassword);
|
||||
// </FS:Ansariel> [FS Login Panel]
|
||||
// end TODO
|
||||
|
|
@ -1369,14 +1371,24 @@ bool idle_startup()
|
|||
// STATE_LOGIN_SHOW state if we've gone backwards
|
||||
mLoginStatePastUI = true;
|
||||
|
||||
// save the credentials
|
||||
std::string userid = "unknown";
|
||||
if(gUserCredential.notNull())
|
||||
{
|
||||
userid = gUserCredential->userID();
|
||||
}
|
||||
// save the credentials
|
||||
std::string userid = "unknown";
|
||||
if (gUserCredential.notNull())
|
||||
{
|
||||
userid = gUserCredential->userID();
|
||||
// <FS:Ansariel> [FS Login Panel]
|
||||
//if (gRememberUser)
|
||||
//{
|
||||
// gSecAPIHandler->addToCredentialMap("login_list", gUserCredential, gRememberPassword);
|
||||
// // Legacy viewers use this method to store user credentials, newer viewers
|
||||
// // reuse it to be compatible and to remember last session
|
||||
// gSecAPIHandler->saveCredential(gUserCredential, gRememberPassword);
|
||||
//}
|
||||
// </FS:Ansariel> [FS Login Panel]
|
||||
}
|
||||
// <FS:Ansariel> Option to not save password if using login cmdline switch
|
||||
//gSavedSettings.setBOOL("RememberPassword", gRememberPassword);
|
||||
//gSavedSettings.setBOOL("RememberUser", gRememberUser);
|
||||
if (!gSavedSettings.getBOOL("FSLoginDontSavePassword"))
|
||||
{
|
||||
gSavedSettings.setBOOL("RememberPassword", gRememberPassword);
|
||||
|
|
|
|||
|
|
@ -1767,6 +1767,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
|
|||
const LLUUID &outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
|
||||
if(gInventory.isObjectDescendentOf(item->getUUID(), outbox_id))
|
||||
{
|
||||
// Legacy
|
||||
return ACCEPT_NO;
|
||||
}
|
||||
|
||||
|
|
@ -2240,6 +2241,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
|
|||
const LLUUID &outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
|
||||
if(gInventory.isObjectDescendentOf(category->getUUID(), outbox_id))
|
||||
{
|
||||
// Legacy
|
||||
return ACCEPT_NO;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -400,7 +400,7 @@ bool LLToolMgr::inBuildMode()
|
|||
|
||||
bool LLToolMgr::canAccessMarketplace()
|
||||
{
|
||||
return (LLMarketplaceData::instance().getSLMStatus() != MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT) || gSavedSettings.getBOOL("InventoryOutboxDisplayBoth");
|
||||
return (LLMarketplaceData::instance().getSLMStatus() != MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT);
|
||||
}
|
||||
|
||||
void LLToolMgr::toggleMarketplace(const LLSD& sdname)
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@
|
|||
#include "llfloaterevent.h"
|
||||
#include "llfloaterflickr.h"
|
||||
#include "llfloaterfonttest.h"
|
||||
#include "llfloaterforgetuser.h"
|
||||
#include "llfloatergesture.h"
|
||||
#include "llfloatergodtools.h"
|
||||
#include "llfloatergridstatus.h"
|
||||
|
|
@ -285,6 +286,7 @@ void LLViewerFloaterReg::registerFloaters()
|
|||
LLFloaterReg::add("experience_search", "floater_experience_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterExperiencePicker>);
|
||||
|
||||
LLFloaterReg::add("font_test", "floater_font_test.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFontTest>);
|
||||
//LLFloaterReg::add("forget_username", "floater_forget_user.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterForgetUser>);
|
||||
|
||||
LLFloaterReg::add("gestures", "floater_gesture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGesture>);
|
||||
LLFloaterReg::add("god_tools", "floater_god_tools.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGodTools>);
|
||||
|
|
|
|||
|
|
@ -2113,7 +2113,7 @@ void menu_create_inventory_item(LLInventoryPanel* panel, LLFolderBridge *bridge,
|
|||
{
|
||||
std::string type_name = userdata.asString();
|
||||
|
||||
if (("inbox" == type_name) || ("outbox" == type_name) || ("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name))
|
||||
if (("inbox" == type_name) || ("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name))
|
||||
{
|
||||
LLFolderType::EType preferred_type = LLFolderType::lookup(type_name);
|
||||
|
||||
|
|
|
|||
|
|
@ -481,23 +481,20 @@ void check_merchant_status(bool force)
|
|||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
if (!gSavedSettings.getBOOL("InventoryOutboxDisplayBoth"))
|
||||
if (force)
|
||||
{
|
||||
if (force)
|
||||
{
|
||||
// Reset the SLM status: we actually want to check again, that's the point of calling check_merchant_status()
|
||||
LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED);
|
||||
}
|
||||
// Hide SLM related menu item
|
||||
gMenuHolder->getChild<LLView>("MarketplaceListings")->setVisible(FALSE);
|
||||
|
||||
// Also disable the toolbar button for Marketplace Listings
|
||||
LLCommand* command = LLCommandManager::instance().getCommand("marketplacelistings");
|
||||
gToolBarView->enableCommand(command->id(), false);
|
||||
|
||||
// Launch an SLM test connection to get the merchant status
|
||||
LLMarketplaceData::instance().initializeSLM(boost::bind(&set_merchant_SLM_menu));
|
||||
// Reset the SLM status: we actually want to check again, that's the point of calling check_merchant_status()
|
||||
LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED);
|
||||
}
|
||||
// Hide SLM related menu item
|
||||
gMenuHolder->getChild<LLView>("MarketplaceListings")->setVisible(FALSE);
|
||||
|
||||
// Also disable the toolbar button for Marketplace Listings
|
||||
LLCommand* command = LLCommandManager::instance().getCommand("marketplacelistings");
|
||||
gToolBarView->enableCommand(command->id(), false);
|
||||
|
||||
// Launch an SLM test connection to get the merchant status
|
||||
LLMarketplaceData::instance().initializeSLM(boost::bind(&set_merchant_SLM_menu));
|
||||
}
|
||||
|
||||
void init_menus()
|
||||
|
|
|
|||
|
|
@ -150,7 +150,6 @@ with the same filename but different name
|
|||
<texture name="Command_MiniCart_Icon" file_name="toolbar_icons/mini_cart.png" preload="true" />
|
||||
<texture name="Command_MiniMap_Icon" file_name="toolbar_icons/mini_map.png" preload="true" />
|
||||
<texture name="Command_Move_Icon" file_name="toolbar_icons/move.png" preload="true" />
|
||||
<texture name="Command_Outbox_Icon" file_name="toolbar_icons/outbox.png" preload="true" />
|
||||
<texture name="Command_People_Icon" file_name="toolbar_icons/people.png" preload="true" />
|
||||
<texture name="Command_Picks_Icon" file_name="toolbar_icons/picks.png" preload="true" />
|
||||
<texture name="Command_Places_Icon" file_name="toolbar_icons/places.png" preload="true" />
|
||||
|
|
|
|||
|
|
@ -0,0 +1,40 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater
|
||||
legacy_header_height="18"
|
||||
height="258"
|
||||
layout="topleft"
|
||||
name="groups"
|
||||
help_topic="forget_username"
|
||||
title="REMEMBERED USERNAMES"
|
||||
width="280">
|
||||
<scroll_list
|
||||
height="173"
|
||||
layout="topleft"
|
||||
left="12"
|
||||
name="user_list"
|
||||
top="24"
|
||||
width="256">
|
||||
<scroll_list.columns
|
||||
name="user"
|
||||
width="248" />
|
||||
</scroll_list>
|
||||
<button
|
||||
height="20"
|
||||
label="Forget"
|
||||
label_selected="Forget"
|
||||
layout="topleft"
|
||||
left_delta="90"
|
||||
name="forget"
|
||||
top_pad="8"
|
||||
width="80" />
|
||||
<check_box
|
||||
height="20"
|
||||
label="Also delete local data for this username"
|
||||
layout="topleft"
|
||||
left="15"
|
||||
name="delete_data"
|
||||
top_pad="5"
|
||||
width="260"
|
||||
initial_value="1"
|
||||
tooltip="Deletes local files: chat history, last session screenshot, browser cookies, teleport history, toolbar settings, e t c"/>
|
||||
</floater>
|
||||
|
|
@ -1,156 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<floater
|
||||
positioning="cascading"
|
||||
can_close="true"
|
||||
can_resize="true"
|
||||
height="440"
|
||||
help_topic="floater_merchant_outbox"
|
||||
min_width="300"
|
||||
min_height="200"
|
||||
name="floater_merchant_outbox"
|
||||
save_rect="true"
|
||||
save_visibility="false"
|
||||
reuse_instance="true"
|
||||
title="Merchant Outbox"
|
||||
width="333">
|
||||
<string name="OutboxFolderCount0"></string>
|
||||
<string name="OutboxFolderCount1">1 folder</string>
|
||||
<string name="OutboxFolderCountN">[NUM] folders</string>
|
||||
<string name="OutboxImporting">Sending folders...</string>
|
||||
<string name="OutboxInitializing">Initializing...</string>
|
||||
<panel
|
||||
name="panel_1"
|
||||
follows="all"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
top="0"
|
||||
label=""
|
||||
height="440"
|
||||
width="333">
|
||||
<panel
|
||||
name="panel_2"
|
||||
follows="all"
|
||||
left="10"
|
||||
bottom="370"
|
||||
width="313"
|
||||
top="0"
|
||||
bg_opaque_color="InventoryBackgroundColor">
|
||||
<panel
|
||||
name="outbox_inventory_placeholder_panel"
|
||||
follows="all"
|
||||
layout="topleft"
|
||||
top="0"
|
||||
left="0"
|
||||
width="308"
|
||||
height="370"
|
||||
bg_opaque_color="InventoryBackgroundColor">
|
||||
<text
|
||||
name="outbox_inventory_placeholder_title"
|
||||
type="string"
|
||||
follows="top|left|right"
|
||||
layout="topleft"
|
||||
top="10"
|
||||
left="0"
|
||||
width="308"
|
||||
height="25"
|
||||
wrap="true"
|
||||
halign="center"
|
||||
font="SansSerifBold">
|
||||
Loading...
|
||||
</text>
|
||||
<text
|
||||
name="outbox_inventory_placeholder_text"
|
||||
type="string"
|
||||
follows="top|left|right"
|
||||
layout="topleft"
|
||||
top="35"
|
||||
left="0"
|
||||
width="308"
|
||||
height="130"
|
||||
wrap="true"
|
||||
halign="left" />
|
||||
</panel>
|
||||
</panel>
|
||||
<panel
|
||||
name="panel_3"
|
||||
follows="bottom|left|right"
|
||||
left="10"
|
||||
bottom="435"
|
||||
width="313"
|
||||
top="370">
|
||||
<panel
|
||||
name="outbox_generic_drag_target"
|
||||
mouse_opaque="false"
|
||||
follows="all"
|
||||
top="5"
|
||||
left="5"
|
||||
width="303"
|
||||
height="25"
|
||||
background_visible="false"
|
||||
bg_alpha_color="EmphasisColor_35"
|
||||
border="true"
|
||||
bevel_style="in"
|
||||
visible="true">
|
||||
<text
|
||||
name="text_1"
|
||||
type="string"
|
||||
follows="all"
|
||||
layout="topleft"
|
||||
top="6"
|
||||
height="20"
|
||||
left="5"
|
||||
width="293"
|
||||
halign="center"
|
||||
font="SansSerifMedium"
|
||||
font_shadow="hard"
|
||||
valign="top">
|
||||
Drag items here to create folders
|
||||
</text>
|
||||
</panel>
|
||||
<text
|
||||
name="outbox_folder_count"
|
||||
type="string"
|
||||
follows="all"
|
||||
layout="topleft"
|
||||
top="40"
|
||||
left="5"
|
||||
width="150"
|
||||
height="20"
|
||||
wrap="true"
|
||||
halign="left"
|
||||
valign="center"
|
||||
font="SansSerif"/>
|
||||
<button
|
||||
label="Send to Marketplace"
|
||||
tool_tip="Push to my Marketplace Storefront"
|
||||
is_toggle="false"
|
||||
name="outbox_import_btn"
|
||||
follows="bottom|right"
|
||||
tab_stop="false"
|
||||
halign="center"
|
||||
top="37"
|
||||
left="160"
|
||||
height="25"
|
||||
width="150"
|
||||
enabled="false" />
|
||||
</panel>
|
||||
<layout_stack name="import_progress_indicator" orientation="vertical" left="0" height="440" top="0" width="333" follows="all" visible="false">
|
||||
<layout_panel />
|
||||
<layout_panel height="24" auto_resize="false">
|
||||
<layout_stack orientation="horizontal" left="0" height="24" top="0" width="333" follows="all">
|
||||
<layout_panel width="0" />
|
||||
<layout_panel width="24" auto_resize="false">
|
||||
<loading_indicator
|
||||
height="24"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
top="0"
|
||||
width="24" />
|
||||
</layout_panel>
|
||||
<layout_panel width="0" />
|
||||
</layout_stack>
|
||||
</layout_panel>
|
||||
<layout_panel />
|
||||
</layout_stack>
|
||||
</panel>
|
||||
</floater>
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
reuse_instance="true"
|
||||
can_minimize="false">
|
||||
<inventory_panel
|
||||
name="inventory_outbox"
|
||||
name="inventory_trash"
|
||||
start_folder.name="Trash"
|
||||
show_empty_message="false"
|
||||
start_folder.type="trash"
|
||||
|
|
|
|||
|
|
@ -57,19 +57,15 @@
|
|||
combo_editor.prevalidate_callback="ascii"
|
||||
tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"
|
||||
name="username_combo"
|
||||
width="232">
|
||||
width="206">
|
||||
<combo_box.combo_editor
|
||||
text_pad_left="8"
|
||||
bg_image_always_focused="true"/>
|
||||
<combo_box.combo_button
|
||||
visible="false" />
|
||||
<combo_box.drop_down_button
|
||||
visible="false" />
|
||||
</combo_box>
|
||||
<line_editor
|
||||
follows="left|top"
|
||||
height="32"
|
||||
left_pad="-11"
|
||||
left_pad="15"
|
||||
max_length_chars="16"
|
||||
text_pad_left="8"
|
||||
name="password_edit"
|
||||
|
|
@ -119,36 +115,49 @@
|
|||
width="120"
|
||||
height="32"
|
||||
left_pad="15"
|
||||
bottom_delta="0" />
|
||||
bottom_delta="0" />
|
||||
<text
|
||||
follows="left|top"
|
||||
font="SansSerifLarge"
|
||||
font.style="BOLD"
|
||||
text_color="EmphasisColor"
|
||||
height="34"
|
||||
name="sign_up_text"
|
||||
left_pad="10"
|
||||
width="200"
|
||||
valign="center">
|
||||
Sign up
|
||||
</text>
|
||||
<check_box
|
||||
follows="left|top"
|
||||
font="SansSerifMedium"
|
||||
left="185"
|
||||
bottom_delta="21"
|
||||
height="24"
|
||||
label="Remember me"
|
||||
check_button.bottom="3"
|
||||
name="remember_name"
|
||||
tooltip="Already recorded user can be forgotten from preferences."
|
||||
width="145" />
|
||||
<check_box
|
||||
control_name="RememberPassword"
|
||||
follows="left|top"
|
||||
font="SansSerifMedium"
|
||||
left="185"
|
||||
bottom_delta="21"
|
||||
height="24"
|
||||
label="Remember me"
|
||||
text_color="EmphasisColor"
|
||||
height="16"
|
||||
left="408"
|
||||
bottom_delta="0"
|
||||
label="Remember password"
|
||||
check_button.bottom="3"
|
||||
name="remember_check"
|
||||
width="145" />
|
||||
<text
|
||||
follows="left|top"
|
||||
font="SansSerifMedium"
|
||||
text_color="EmphasisColor"
|
||||
height="16"
|
||||
name="forgot_password_text"
|
||||
left="408"
|
||||
bottom_delta="0"
|
||||
width="200">
|
||||
Forgotten password
|
||||
</text>
|
||||
<combo_box
|
||||
allow_text_entry="false"
|
||||
font="SansSerifTiny"
|
||||
follows="left|top"
|
||||
height="26"
|
||||
left="588"
|
||||
bottom_delta="10"
|
||||
bottom_delta="8"
|
||||
max_chars="128"
|
||||
label="Select grid"
|
||||
layout="topleft"
|
||||
|
|
@ -159,12 +168,13 @@
|
|||
font="SansSerifMedium"
|
||||
text_color="EmphasisColor"
|
||||
height="16"
|
||||
name="sign_up_text"
|
||||
name="forgot_password_text"
|
||||
left="778"
|
||||
bottom_delta="-10"
|
||||
width="200">
|
||||
Sign up
|
||||
</text>
|
||||
bottom_delta="-8"
|
||||
width="120"
|
||||
halign="center">
|
||||
Password help
|
||||
</text>
|
||||
</layout_panel>
|
||||
<layout_panel
|
||||
height="172"
|
||||
|
|
|
|||
|
|
@ -1,31 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<inventory_panel
|
||||
name="inventory_outbox"
|
||||
start_folder.name="Outbox"
|
||||
show_empty_message="false"
|
||||
start_folder.type="outbox"
|
||||
follows="all" layout="topleft"
|
||||
top="0" left="0" height="165" width="308"
|
||||
top_pad="0"
|
||||
bg_opaque_color="DkGray2"
|
||||
bg_alpha_color="DkGray2"
|
||||
background_visible="true"
|
||||
border="false"
|
||||
bevel_style="none"
|
||||
show_item_link_overlays="true"
|
||||
tool_tip="Drag and drop items here to prepare them for sale on your storefront"
|
||||
scroll.reserve_scroll_corner="false">
|
||||
<folder folder_arrow_image="Folder_Arrow"
|
||||
folder_indentation="8"
|
||||
item_height="20"
|
||||
item_top_pad="4"
|
||||
selection_image="Rounded_Square"
|
||||
left_pad="5"
|
||||
icon_pad="2"
|
||||
icon_width="16"
|
||||
text_pad="1"
|
||||
text_pad_right="4"
|
||||
arrow_size="12"
|
||||
max_folder_item_overlap="2"/>
|
||||
<item allow_wear="false"/>
|
||||
</inventory_panel>
|
||||
|
|
@ -1290,7 +1290,7 @@ If you continue to receive this message, please contact Second Life support for
|
|||
<string name="BuyingCosts">Buying this costs L$ [AMOUNT]</string>
|
||||
<string name="UnknownFileExtension">
|
||||
Unknown file extension .%s
|
||||
Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
|
||||
Expected .wav, .tga, .bmp, .jpg, .jpeg, or .anim
|
||||
</string>
|
||||
<string name="MuteObject2">Block</string>
|
||||
<string name="MuteAvatar">Block</string>
|
||||
|
|
@ -2587,7 +2587,6 @@ Try enclosing path to the editor with double quotes.
|
|||
<string name="Command_MarketplaceListings_Label">Marketplace</string>
|
||||
<string name="Command_MiniMap_Label">Mini-map</string>
|
||||
<string name="Command_Move_Label">Walk / run / fly</string>
|
||||
<string name="Command_Outbox_Label">Merchant outbox</string>
|
||||
<string name="Command_People_Label">People</string>
|
||||
<string name="Command_Picks_Label">Picks</string>
|
||||
<string name="Command_Places_Label">Places</string>
|
||||
|
|
@ -2653,7 +2652,6 @@ Try enclosing path to the editor with double quotes.
|
|||
<string name="Command_MarketplaceListings_Tooltip">Sell your creation</string>
|
||||
<string name="Command_MiniMap_Tooltip">Show nearby people (CTRL+SHIFT+M)</string>
|
||||
<string name="Command_Move_Tooltip">Moving your avatar</string>
|
||||
<string name="Command_Outbox_Tooltip">Transfer items to your marketplace for sale</string>
|
||||
<string name="Command_People_Tooltip">Friends, groups, and nearby people (CTRL+SHIFT+A)</string>
|
||||
<string name="Command_Picks_Tooltip">Places to show as favorites in your profile</string>
|
||||
<string name="Command_Places_Tooltip">Places you've saved (ALT+H)</string>
|
||||
|
|
|
|||
|
|
@ -60,12 +60,21 @@ LLPointer<LLCertificate> LLSecAPIBasicHandler::getCertificate(X509* openssl_cert
|
|||
LLPointer<LLCertificateChain> LLSecAPIBasicHandler::getCertificateChain(const X509_STORE_CTX* chain) { return NULL; }
|
||||
LLPointer<LLCertificateStore> LLSecAPIBasicHandler::getCertificateStore(const std::string& store_id) { return NULL; }
|
||||
void LLSecAPIBasicHandler::setProtectedData(const std::string& data_type, const std::string& data_id, const LLSD& data) {}
|
||||
void LLSecAPIBasicHandler::addToProtectedMap(const std::string& data_type, const std::string& data_id, const std::string& map_elem, const LLSD& data) {}
|
||||
void LLSecAPIBasicHandler::removeFromProtectedMap(const std::string& data_type, const std::string& data_id, const std::string& map_elem) {}
|
||||
LLSD LLSecAPIBasicHandler::getProtectedData(const std::string& data_type, const std::string& data_id) { return LLSD(); }
|
||||
void LLSecAPIBasicHandler::deleteProtectedData(const std::string& data_type, const std::string& data_id) {}
|
||||
LLPointer<LLCredential> LLSecAPIBasicHandler::createCredential(const std::string& grid, const LLSD& identifier, const LLSD& authenticator) { return NULL; }
|
||||
LLPointer<LLCredential> LLSecAPIBasicHandler::loadCredential(const std::string& grid) { return NULL; }
|
||||
void LLSecAPIBasicHandler::saveCredential(LLPointer<LLCredential> cred, bool save_authenticator) {}
|
||||
void LLSecAPIBasicHandler::deleteCredential(LLPointer<LLCredential> cred) {}
|
||||
bool LLSecAPIBasicHandler::hasCredentialMap(const std::string& storage, const std::string& grid) { return false; }
|
||||
void LLSecAPIBasicHandler::loadCredentialMap(const std::string& storage, const std::string& grid, credential_map_t& credential_map) {}
|
||||
LLPointer<LLCredential> LLSecAPIBasicHandler::loadFromCredentialMap(const std::string& storage, const std::string& grid, const std::string& userkey) { return NULL; }
|
||||
void LLSecAPIBasicHandler::addToCredentialMap(const std::string& storage, LLPointer<LLCredential> cred, bool save_authenticator) {}
|
||||
void LLSecAPIBasicHandler::removeFromCredentialMap(const std::string& storage, LLPointer<LLCredential> cred) {}
|
||||
void LLSecAPIBasicHandler::removeFromCredentialMap(const std::string& storage, const std::string& grid, const std::string& userkey) {}
|
||||
void LLSecAPIBasicHandler::removeCredentialMap(const std::string& storage, const std::string& grid) {}
|
||||
|
||||
// -------------------------------------------------------------------------------------------
|
||||
// TUT
|
||||
|
|
|
|||
Loading…
Reference in New Issue