Merge branch 'master' into starlight

meow-7.2.2
Nicky 2022-05-05 16:44:12 +02:00
commit 3b92b326b8
28 changed files with 996 additions and 432 deletions

View File

@ -115,28 +115,28 @@ else (USESYSTEMLIBS)
elseif (DARWIN)
set(BOOST_CONTEXT_LIBRARY
optimized boost_context-mt${addrsfx}
debug boost_context-mt${addrsfx}-d)
debug boost_context-mt${addrsfx})
set(BOOST_FIBER_LIBRARY
optimized boost_fiber-mt${addrsfx}
debug boost_fiber-mt${addrsfx}-d)
debug boost_fiber-mt${addrsfx})
set(BOOST_FILESYSTEM_LIBRARY
optimized boost_filesystem-mt${addrsfx}
debug boost_filesystem-mt${addrsfx}-d)
debug boost_filesystem-mt${addrsfx})
set(BOOST_PROGRAM_OPTIONS_LIBRARY
optimized boost_program_options-mt${addrsfx}
debug boost_program_options-mt${addrsfx}-d)
debug boost_program_options-mt${addrsfx})
set(BOOST_REGEX_LIBRARY
optimized boost_regex-mt${addrsfx}
debug boost_regex-mt${addrsfx}-d)
debug boost_regex-mt${addrsfx})
set(BOOST_SIGNALS_LIBRARY
optimized boost_signals-mt${addrsfx}
debug boost_signals-mt${addrsfx}-d)
debug boost_signals-mt${addrsfx})
set(BOOST_SYSTEM_LIBRARY
optimized boost_system-mt${addrsfx}
debug boost_system-mt${addrsfx}-d)
debug boost_system-mt${addrsfx})
set(BOOST_THREAD_LIBRARY
optimized boost_thread-mt${addrsfx}
debug boost_thread-mt${addrsfx}-d)
debug boost_thread-mt${addrsfx})
set(BOOST_WAVE_LIBRARY
optimized boost_wave-mt${addrsfx}
debug boost_wave-mt${addrsfx}-gd)

View File

@ -857,6 +857,7 @@ set(viewer_SOURCE_FILES
llxmlrpctransaction.cpp
noise.cpp
particleeditor.cpp
permissionstracker.cpp
piemenu.cpp
pieseparator.cpp
pieslice.cpp
@ -1630,6 +1631,7 @@ set(viewer_HEADER_FILES
macmain.h
noise.h
particleeditor.h
permissionstracker.h
piemenu.h
pieseparator.h
pieslice.h

View File

@ -1 +1 @@
6.5.5
6.5.6

View File

@ -21918,6 +21918,30 @@ Change of this parameter will affect the layout of buttons in notification toast
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>CefVerboseLog</key>
<map>
<key>Comment</key>
<string>Enable/disable CEF verbose loggingk</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ResetUIScaleOnFirstRun</key>
<map>
<key>Comment</key>
<string>Resets the UI scale factor on first run due to changed display scaling behavior</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
<key>Backup</key>
<integer>0</integer>
</map>
<key>360CaptureUseInterestListCap</key>
<map>
@ -21996,30 +22020,19 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>3</integer>
</map>
<key>CefVerboseLog</key>
<map>
<key>Comment</key>
<string>Enable/disable CEF verbose loggingk</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ResetUIScaleOnFirstRun</key>
<map>
<key>Comment</key>
<string>Resets the UI scale factor on first run due to changed display scaling behavior</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
<key>Backup</key>
<integer>0</integer>
</map>
<key>MFAHash</key>
<map>
<key>Comment</key>
<string>Override MFA state hash for authentication</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string></string>
<key>Backup</key>
<integer>0</integer>
</map>
<key>FSShowServerVersionChangeNotice</key>
<map>
<key>Comment</key>

View File

@ -3705,6 +3705,11 @@ bool LLAppViewer::initWindow()
return true;
}
bool LLAppViewer::isUpdaterMissing()
{
return mUpdaterNotFound;
}
void LLAppViewer::writeDebugInfo(bool isStatic)
{
#if LL_WINDOWS && LL_BUGSPLAT

View File

@ -98,7 +98,7 @@ public:
bool quitRequested() { return mQuitRequested; }
bool logoutRequestSent() { return mLogoutRequestSent; }
bool isSecondInstance() { return mSecondInstance; }
bool isUpdaterMissing() { return mUpdaterNotFound; }
bool isUpdaterMissing(); // In use by tests
void writeDebugInfo(bool isStatic=true);

View File

@ -29,6 +29,8 @@
#include "llfollowcam.h"
#include "llagent.h"
#include "permissionstracker.h"
//-------------------------------------------------------
// constants
//-------------------------------------------------------
@ -829,11 +831,13 @@ void LLFollowCamMgr::setCameraActive( const LLUUID& source, bool active )
if (found_it != mParamStack.end())
{
mParamStack.erase(found_it);
PermissionsTracker::instance().removePermissionsEntry(source, PermissionsTracker::PERM_FOLLOWCAM);
}
// put on top of stack
if(active)
{
mParamStack.push_back(params);
PermissionsTracker::instance().addPermissionsEntry(source, PermissionsTracker::PERM_FOLLOWCAM);
}
}
@ -843,6 +847,8 @@ void LLFollowCamMgr::removeFollowCamParams(const LLUUID& source)
LLFollowCamParams* params = getParamsForID(source);
mParamMap.erase(source);
delete params;
PermissionsTracker::instance().removePermissionsEntry(source, PermissionsTracker::PERM_FOLLOWCAM);
}
bool LLFollowCamMgr::isScriptedCameraSource(const LLUUID& source)

View File

@ -61,6 +61,7 @@
#include "lltrans.h"
#include <boost/scoped_ptr.hpp>
#include <boost/regex.hpp>
#include <sstream>
const S32 LOGIN_MAX_RETRIES = 0; // Viewer should not autmatically retry login
@ -239,8 +240,9 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
request_params["id0"] = mSerialNumber;
request_params["host_id"] = gSavedSettings.getString("HostID");
request_params["extended_errors"] = true; // request message_id and message_args
request_params["token"] = "";
// log request_params _before_ adding the credentials
// log request_params _before_ adding the credentials or sensitive MFA hash data
LL_DEBUGS("LLLogin") << "Login parameters: " << LLSDOStreamer<LLSDNotationFormatter>(request_params) << LL_ENDL;
// Copy the credentials into the request after logging the rest
@ -253,6 +255,33 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
request_params[it->first] = it->second;
}
std::string mfa_hash = gSavedSettings.getString("MFAHash"); //non-persistent to enable testing
std::string grid(LLGridManager::getInstance()->getGridId());
std::string user_id = user_credential->userID();
if (gSecAPIHandler)
{
if (mfa_hash.empty())
{
// normal execution, mfa_hash was not set from debug setting so load from protected store
LLSD data_map = gSecAPIHandler->getProtectedData("mfa_hash", grid);
if (data_map.isMap() && data_map.has(user_id))
{
mfa_hash = data_map[user_id].asString();
}
}
else
{
// SL-16888 the mfa_hash is being overridden for testing so save it for consistency for future login requests
gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, mfa_hash);
}
}
else
{
LL_WARNS() << "unable to access protected store for mfa_hash" << LL_ENDL;
}
request_params["mfa_hash"] = mfa_hash;
// Specify desired timeout/retry options
LLSD http_params;
F32 srv_timeout = llclamp(gSavedSettings.getF32("LoginSRVTimeout"), LOGIN_SRV_TIMEOUT_MIN, LOGIN_SRV_TIMEOUT_MAX);
@ -265,6 +294,11 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
mRequestData["params"] = request_params;
mRequestData["options"] = requested_options;
mRequestData["http_params"] = http_params;
//#if LL_RELEASE_FOR_DOWNLOAD
// mRequestData["wait_for_updater"] = !gSavedSettings.getBOOL("CmdLineSkipUpdater") && !LLAppViewer::instance()->isUpdaterMissing();
//#else
mRequestData["wait_for_updater"] = false;
//#endif
}
bool LLLoginInstance::handleLoginEvent(const LLSD& event)
@ -420,6 +454,38 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event)
boost::bind(&LLLoginInstance::syncWithUpdater, this, resp, _1, _2));
}
}
else if(reason_response == "mfa_challenge")
{
LL_DEBUGS("LLLogin") << " MFA challenge" << LL_ENDL;
if (gViewerWindow)
{
gViewerWindow->setShowProgress(FALSE, FALSE);
}
LLSD args(llsd::map( "MESSAGE", LLTrans::getString(response["message_id"]) ));
LLSD payload;
LLNotificationsUtil::add("PromptMFAToken", args, payload, [=](LLSD const & notif, LLSD const & response) {
bool continue_clicked = response["continue"].asBoolean();
std::string token = response["token"].asString();
LL_DEBUGS("LLLogin") << "PromptMFAToken: response: " << response << " continue_clicked" << continue_clicked << LL_ENDL;
// strip out whitespace - SL-17034/BUG-231938
token = boost::regex_replace(token, boost::regex("\\s"), "");
if (continue_clicked && !token.empty())
{
LL_INFOS("LLLogin") << "PromptMFAToken: token submitted" << LL_ENDL;
// Set the request data to true and retry login.
mRequestData["params"]["token"] = token;
reconnect();
} else {
LL_INFOS("LLLogin") << "PromptMFAToken: no token, attemptComplete" << LL_ENDL;
attemptComplete();
}
});
}
else if( reason_response == "key"
|| reason_response == "presence"
|| reason_response == "connect"

View File

@ -485,6 +485,9 @@ public:
const std::string& data_id,
const std::string& map_elem)=0;
// ensure protected store's map is written to storage
virtual void syncProtectedMap() = 0;
public:
virtual LLPointer<LLCredential> createCredential(const std::string& grid,
const LLSD& identifier,

View File

@ -1621,6 +1621,11 @@ void LLSecAPIBasicHandler::removeFromProtectedMap(const std::string& data_type,
}
}
void LLSecAPIBasicHandler::syncProtectedMap()
{
// TODO - consider unifing these functions
_writeProtectedData();
}
//
// Create a credential object from an identifier and authenticator. credentials are
// per credential name (was: grid).

View File

@ -278,6 +278,9 @@ public:
const std::string& data_id,
const std::string& map_elem);
// ensure protected store's map is written to storage
virtual void syncProtectedMap();
// credential management routines
virtual LLPointer<LLCredential> createCredential(const std::string& credName,

View File

@ -141,6 +141,7 @@
#include "llproxy.h"
#include "llproductinforequest.h"
#include "llqueryflags.h"
#include "llsecapi.h"
#include "llselectmgr.h"
#include "llsky.h"
#include "llstatview.h"
@ -1732,10 +1733,10 @@ bool idle_startup()
}
else
{
if (reason_response != "tos")
if (reason_response != "tos" && reason_response != "mfa_challenge")
{
// Don't pop up a notification in the TOS case because
// LLFloaterTOS::onCancel() already scolded the user.
// Don't pop up a notification in the TOS or MFA cases because
// the specialized floater has already scolded the user.
std::string error_code;
if(response.has("errorcode"))
{
@ -3247,8 +3248,31 @@ void show_release_notes_if_required()
&& gSavedSettings.getBOOL("UpdaterShowReleaseNotes")
&& !gSavedSettings.getBOOL("FirstLoginThisInstall"))
{
LLSD info(LLAppViewer::instance()->getViewerInfo());
LLWeb::loadURLInternal(info["VIEWER_RELEASE_NOTES_URL"]);
#if LL_RELEASE_FOR_DOWNLOAD
if (!gSavedSettings.getBOOL("CmdLineSkipUpdater")
&& !LLAppViewer::instance()->isUpdaterMissing())
{
// Instantiate a "relnotes" listener which assumes any arriving event
// is the release notes URL string. Since "relnotes" is an
// LLEventMailDrop, this listener will be invoked whether or not the
// URL has already been posted. If so, it will fire immediately;
// otherwise it will fire whenever the URL is (later) posted. Either
// way, it will display the release notes as soon as the URL becomes
// available.
LLEventPumps::instance().obtain("relnotes").listen(
"showrelnotes",
[](const LLSD& url) {
LLWeb::loadURLInternal(url.asString());
return false;
});
}
else
#endif // LL_RELEASE_FOR_DOWNLOAD
{
LLSD info(LLAppViewer::instance()->getViewerInfo());
LLWeb::loadURLInternal(info["VIEWER_RELEASE_NOTES_URL"]);
}
release_notes_shown = true;
}
}
@ -4703,6 +4727,17 @@ bool process_login_success_response(U32 &first_sim_size_x, U32 &first_sim_size_y
LLViewerMedia::getInstance()->openIDSetup(openid_url, openid_token);
}
// Only save mfa_hash for future logins if the user wants their info remembered.
if(response.has("mfa_hash") && gSavedSettings.getBOOL("RememberUser") && gSavedSettings.getBOOL("RememberPassword"))
{
std::string grid(LLGridManager::getInstance()->getGridId());
std::string user_id(gUserCredential->userID());
gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, response["mfa_hash"]);
// TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically
gSecAPIHandler->syncProtectedMap();
}
// <FS:Ansariel> OpenSim legacy economy support
#ifdef OPENSIM
if (!LLGridManager::instance().isInSecondLife())

View File

@ -166,6 +166,7 @@
#include "lltexturecache.h"
#include "llvovolume.h"
#include "particleeditor.h"
#include "permissionstracker.h"
using namespace LLAvatarAppearanceDefines;
@ -5424,6 +5425,9 @@ void handle_reset_camera_angles()
// Camera focus and offset with CTRL/SHIFT + Scroll wheel
gSavedSettings.getControl("FocusOffsetRearView")->resetToDefault();
gSavedSettings.getControl("CameraOffsetRearView")->resetToDefault();
// warn the user if there is a scripted followcam active that might stop a camera reset
PermissionsTracker::instance().warnFollowcam();
}
// </FS:Zi>

View File

@ -150,6 +150,7 @@
#include "llfloaterbump.h"
#include "llfloaterreg.h"
#include "llfriendcard.h"
#include "permissionstracker.h" // <FS:Zi> Permissions Tracker
#include "tea.h" // <FS:AW opensim currency support>
#include "NACLantispam.h"
#include "chatbar_as_cmdline.h"
@ -4733,6 +4734,8 @@ void process_object_properties(LLMessageSystem *msg, void**user_data)
{
explorer->requestNameCallback(msg);
}
PermissionsTracker::instance().objectPropertiesCallback(msg);
}
// </FS:Techwolf Lupindo> area search

View File

@ -0,0 +1,274 @@
/**
* @file permissionstracker.cpp
* @brief Permissions Tracker implementation - Initially it's only tracking
* camera control permissions, to warn users about attachments or seats that
* took camera control permissions and might interfere with resetting the
* camera view.
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
* Copyright (C) 2022, Zi Ree @ Second Life
*
* 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"
#include "llagentdata.h" // for gAgentID anf gAgentSessionID
#include "llnotificationsutil.h"
#include "llslurl.h"
#include "lltrans.h"
#include "llviewermenu.h" // for handle_object_edit()
#include "llviewerregion.h"
#include "llviewerobject.h"
#include "llviewerobjectlist.h" // for gObjectList
#include "llvoavatarself.h" // for gAgentAvatarp
#include "llworld.h"
#include "permissionstracker.h"
#define PERMISSION_ENTRY_EXPIRY_TIME 3600.0
PermissionsTracker::PermissionsTracker()
: LLSingleton<PermissionsTracker>()
{
}
PermissionsTracker::~PermissionsTracker()
{
}
void PermissionsTracker::addPermissionsEntry(const LLUUID& source_id, PermissionsTracker::PERM_TYPE permission_type)
{
// find out if this is a new entry in the list
if (mPermissionsList.find(source_id) == mPermissionsList.end())
{
LL_DEBUGS("PermissionsTracker") << "Creating list entry for source " << source_id << LL_ENDL;
mPermissionsList[source_id].objectName = LLTrans::getString("LoadingData");
// find out if the object is still in reach
LLViewerObject* vo = gObjectList.findObject(source_id);
if (!vo)
{
mPermissionsList[source_id].objectName = LLTrans::getString("ObjectOutOfRange");
}
else
{
mPermissionsList[source_id].attachmentID = vo->getAttachmentItemID();
LL_DEBUGS("PermissionsTracker") << "Requesting ObjectProperties for source " << source_id << LL_ENDL;
// remember which object names we already requested
mRequestedIDs.push_back(source_id);
// send a request out to get this object's details
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_ObjectSelect);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
msg->nextBlockFast(_PREHASH_ObjectData);
msg->addU32Fast(_PREHASH_ObjectLocalID, vo->getLocalID());
msg->sendReliable(gAgentAvatarp->getRegion()->getHost());
msg->newMessageFast(_PREHASH_ObjectDeselect);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
msg->nextBlockFast(_PREHASH_ObjectData);
msg->addU32Fast(_PREHASH_ObjectLocalID, vo->getLocalID());
msg->sendReliable(gAgentAvatarp->getRegion()->getHost());
}
}
LL_DEBUGS("PermissionsTracker") << "Adding permission type " << permission_type << " to source " << source_id << LL_ENDL;
mPermissionsList[source_id].type |= permission_type;
mPermissionsList[source_id].time = LLDate(LLTimer::getTotalSeconds());
purgePermissionsEntries();
}
void PermissionsTracker::removePermissionsEntry(const LLUUID& source_id, PermissionsTracker::PERM_TYPE permission_type)
{
if (mPermissionsList.find(source_id) == mPermissionsList.end())
{
LL_DEBUGS("PermissionsTracker") << "Could not find list entry for source " << source_id << LL_ENDL;
return;
}
LL_DEBUGS("PermissionsTracker") << "Removing permissions type " << permission_type << " from source " << source_id << LL_ENDL;
mPermissionsList[source_id].type &= ~permission_type;
mPermissionsList[source_id].time = LLDate(LLTimer::getTotalSeconds());
purgePermissionsEntries();
}
void PermissionsTracker::purgePermissionsEntries()
{
F64 expiry_time = LLDate(LLTimer::getTotalSeconds()).secondsSinceEpoch() - PERMISSION_ENTRY_EXPIRY_TIME;
auto it = mPermissionsList.begin();
while (it != mPermissionsList.end())
{
if (it->second.type == PERM_TYPE::PERM_NONE && it->second.time.secondsSinceEpoch() < expiry_time)
{
LL_DEBUGS("PermissionsTracker") << "Erasing list entry for source " << it->first << LL_ENDL;
it = mPermissionsList.erase(it);
}
else
{
++it;
}
}
}
void PermissionsTracker::warnFollowcam()
{
std::string followcamList;
for (auto entry : mPermissionsList)
{
if (entry.second.type & PermissionsTracker::PERM_FOLLOWCAM)
{
if (entry.second.attachmentID.notNull())
{
std::string attachment_point = "???";
gAgentAvatarp->getAttachedPointName(entry.second.attachmentID, attachment_point);
LLSD args;
args["ATTACHMENT_POINT"] = attachment_point;
std::string verb = "select?name=" + LLURI::escape(entry.second.objectName);
followcamList += LLSLURL("inventory", entry.second.attachmentID, verb.c_str()).getSLURLString() + " " +
LLTrans::getString("WornOnAttachmentPoint", args) + "\n";
}
else
{
followcamList += LLSLURL("objectim", entry.first, "").getSLURLString() +
"?name=" + LLURI::escape(entry.second.objectName) +
"&owner=" + entry.second.ownerID.asString();
LLSD args;
std::string slurl = args["slurl"].asString();
if (slurl.empty())
{
LLViewerRegion* region = LLWorld::instance().getRegionFromPosAgent(gAgentAvatarp->getPositionAgent());
if(region)
{
LLSLURL region_slurl(region->getName(), gAgentAvatarp->getPositionAgent());
slurl = region_slurl.getLocationString();
}
}
followcamList += "&slurl=" + LLURI::escape(slurl) + "\n";
}
}
}
if (followcamList.empty())
{
return;
}
LLSD args;
args["SOURCES"] = followcamList;
LLNotificationsUtil::add("WarnScriptedCamera", args);
}
void PermissionsTracker::objectPropertiesCallback(LLMessageSystem* msg)
{
LL_DEBUGS("PermissionsTracker") << "Received ObjectProperties message." << LL_ENDL;
// if we weren't looking for any IDs, ignore this callback
if (mRequestedIDs.empty())
{
LL_DEBUGS("PermissionsTracker") << "No objects in request list." << LL_ENDL;
return;
}
// we might have received more than one answer in one block
S32 num = msg->getNumberOfBlocksFast(_PREHASH_ObjectData);
for (S32 index = 0; index < num; ++index)
{
LLUUID source_id;
msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, source_id, index);
auto iter = std::find(mRequestedIDs.begin(), mRequestedIDs.end(), source_id);
// if this is one of the objects we were looking for, process the data
if (iter != mRequestedIDs.end())
{
// get the name of the object
std::string object_name;
msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, object_name, index);
LLUUID object_owner;
msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, object_owner, index);
LL_DEBUGS("PermissionsTracker") << "Received object name " << object_name
<< " and owner " << object_owner.asString() << " for source " << source_id << LL_ENDL;
// remove the object from the lookup list and add it to the known names list
mRequestedIDs.erase(iter);
mPermissionsList[source_id].objectName = object_name;
mPermissionsList[source_id].ownerID = object_owner;
LLAvatarName avatar_name;
if (LLAvatarNameCache::get(object_owner, &avatar_name))
{
LL_DEBUGS("PermissionsTracker") << "Found cached entry for owner " << object_owner.asString()
<< ": " << avatar_name.getCompleteName() << LL_ENDL;
mPermissionsList[source_id].ownerName = avatar_name.getCompleteName();
}
else
{
if (mAvatarNameCacheConnections.find(object_owner) != mAvatarNameCacheConnections.end())
{
boost::signals2::connection cb_connection = LLAvatarNameCache::get(object_owner, boost::bind(&PermissionsTracker::avatarNameCallback, this, _1, _2));
mAvatarNameCacheConnections.insert(std::make_pair(object_owner, cb_connection));
LL_DEBUGS("PermissionsTracker") << "Requesting avatar name for owner " << object_owner.asString() << LL_ENDL;
}
}
}
}
}
void PermissionsTracker::avatarNameCallback(const LLUUID& avatar_id, const LLAvatarName& avatar_name)
{
LL_DEBUGS("PermissionsTracker") << "Received avatar name " << avatar_name.getCompleteName() << LL_ENDL;
auto iter = mAvatarNameCacheConnections.find(avatar_id);
if (iter != mAvatarNameCacheConnections.end())
{
if (iter->second.connected())
{
iter->second.disconnect();
}
mAvatarNameCacheConnections.erase(iter);
}
for (auto entry : mPermissionsList)
{
if (entry.second.ownerID == avatar_id)
{
LL_DEBUGS("PermissionsTracker") << "Saved avatar name " << avatar_name.getCompleteName()<< " for source " << entry.first.asString() << LL_ENDL;
entry.second.ownerName = avatar_name.getCompleteName();
}
}
}

View File

@ -0,0 +1,86 @@
/**
* @file permissionstracker.h
* @brief Permissions Tracker declaration
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
* Copyright (C) 2022, Zi Ree @ Second Life
*
* 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$
*/
#ifndef PERMISSIONSTRACKER_H
#define PERMISSIONSTRACKER_H
#include "llfloater.h"
#include "llsingleton.h"
// --------------------------------------------------------------------------
// PermissionsTracker: holds a list of requested script permissions to be
// referred to e.g. when trying to reset the camera view and a script is
// holding a follow cam which micht prevent it from working.
// --------------------------------------------------------------------------
class PermissionsTracker
: public LLSingleton<PermissionsTracker>
{
LLSINGLETON(PermissionsTracker);
~PermissionsTracker();
public:
enum PERM_TYPE
{
PERM_NONE = 0,
PERM_FOLLOWCAM = 1,
};
struct PermissionsEntry
{
LLUUID ownerID; // agent who owns the requesting object
LLUUID attachmentID; // attachment ID in inventory for attached objects
std::string ownerName;
std::string objectName;
LLDate time; // time when the permission was granted
U32 type; // what kind of permissions were granted
};
std::map<LLUUID, PermissionsEntry> mPermissionsList; // UUID of the requesting object
void addPermissionsEntry(
const LLUUID& source_id,
PermissionsTracker::PERM_TYPE permission_type); // called in llviewermessage.cpp
void removePermissionsEntry(
const LLUUID& source_id,
PermissionsTracker::PERM_TYPE permission_type); // called in llviewermessage.cpp
void purgePermissionsEntries();
void objectPropertiesCallback(LLMessageSystem* msg);
void avatarNameCallback(const LLUUID& avatar_id, const LLAvatarName& av_name);
void warnFollowcam(); // Warn the user if a script is holding followcam parameters
std::vector<LLUUID> mRequestedIDs; // list of object IDs we requested named for
typedef std::map<LLUUID, boost::signals2::connection> avatar_name_cache_connection_map_t;
avatar_name_cache_connection_map_t mAvatarNameCacheConnections;
};
#endif // PERMISSIONSTRACKER_H

View File

@ -4839,8 +4839,15 @@ Bitte kopieren Sie diese in Ihr Inventar und versuchen Sie es erneut.
Test-Ergebnis für gip-Level 6 Datei-Komprimierung für [FILE] mit Größe [SIZE] KB:
Packen: [PACK_TIME]s [PSIZE]KB
Entpacken: [UNPACK_TIME]s [USIZE]KB
<tag>fail</tag>
</notification>
<tag>fail</tag>
</notification>
<notification label="Eingabe MFA-Token" name="PromptMFAToken">
[MESSAGE]
<form name="form">
<button name="continue" text="Fortsetzen"/>
<button name="cancel" text="Abbrechen"/>
</form>
</notification>
<notification name="NoValidEnvSettingFound">
Keine gültige Einstellung für die Umgebung ausgewählt.
@ -5544,4 +5551,9 @@ Falls Sie diesen Nutzungsbestimmungen nicht zustimmen, sollten keinerlei finanzi
URL auf Standard zurücksetzen?
<usetemplate name="okcancelbuttons" notext="Nächstes Mal erinnern" yestext="Zurücksetzen"/>
</notification>
<notification name="WarnScriptedCamera">
Zurücksetzen der Kamera könnte durch folgende Objekte verhindert werden:
[SOURCES]
</notification>
</notifications>

View File

@ -249,6 +249,7 @@ http://secondlife.com/viewer-access-faq
Stellen Sie sicher, dass Sie die richtigen Informationen eingegeben haben:
* Benutzername (wie robertschmidt12 oder warme.sonne)
* Kennwort
* Zwei-Faktor-Token (falls aktiviert)
Stellen Sie außerdem sicher, dass die Umschaltsperre deaktiviert ist.
</string>
<string name="LoginFailedPasswordChanged">
@ -358,6 +359,10 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="LoginFailedLoggingOutSession">
Das System hat begonnen, Ihre letzte Sitzung abzumelden.
Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
</string>
<string name="LoginFailedAuthenticationMFARequired">
Um die Anmeldung fortzusetzen, geben Sie bitte ein neues Token aus Ihrer Multifaktor-Authentifizierungs-App ein.
Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
</string>
<string name="AgentLostConnection">
In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.

View File

@ -13728,6 +13728,27 @@ Unpacking: [UNPACK_TIME]s [USIZE]KB
<tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
label="Prompt for MFA Token"
name="PromptMFAToken"
type="alertmodal">
[MESSAGE]
<tag>confirm</tag>
<form name="form">
<input name="token" type="text" width="400" />
<button
default="true"
index="0"
name="continue"
text="Continue"/>
<button
index="1"
name="cancel"
text="Cancel"/>
</form>
</notification>
<notification
icon="notify.tga"
name="NoValidEnvSettingFound"
@ -13790,4 +13811,14 @@ Reset the URL to default?
notext="Remind me next time"
yestext="Reset"/>
</notification>
<notification
icon="notifytip.tga"
name="WarnScriptedCamera"
type="notifytip">
Camera reset might be inhibited by the following objects:
[SOURCES]
</notification>
</notifications>

View File

@ -159,6 +159,7 @@ http://secondlife.com/viewer-access-faq</string>
Please check to make sure you entered the right
* Username (like bobsmith12 or steller.sunshine)
* Password
* Second Factor Token (if enabled)
Also, please make sure your Caps Lock key is off.</string>
<string name="LoginFailedPasswordChanged">As a security precaution your password has been changed.
Please go to your account page at http://secondlife.com/password
@ -218,7 +219,8 @@ Please try logging in again in a minute.</string>
Please try logging in again in a minute.</string>
<string name="LoginFailedLoggingOutSession">The system has begun logging out your last session.
Please try logging in again in a minute.</string>
<string name="LoginFailedAuthenticationMFARequired">To continue logging in, enter a new token from your multifactor authentication app.
If you feel this is an error, please contact support@secondlife.com</string>
<!-- Disconnection -->
<string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string>

View File

@ -1,406 +1,368 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Model Preview" title="CHARGEMENT DU MODELE">
<string name="status_idle"/>
<string name="status_parse_error">
Erreur : Problème d&apos;analyse de fichier .dae ; reportez-vous au journal pour plus de détails.
</string>
<string name="status_bind_shape_orientation">
Avertissement : la matrice de formes de reliure n&apos;est pas dans l&apos;orientation standard X-avant.
</string>
<string name="status_material_mismatch">
Erreur : le matériau du modèle ne correspond pas à un sous-ensemble du modèle de référence.
</string>
<string name="status_reading_file">
Chargement...
</string>
<string name="status_generating_meshes">
Génération des maillages...
</string>
<string name="status_vertex_number_overflow">
Erreur : valeur de sommet supérieure à 65534. Opération abandonnée.
</string>
<string name="bad_element">
Erreur : élément non valide
</string>
<string name="high">
Élevé
</string>
<string name="medium">
Moyen
</string>
<string name="low">
Faible
</string>
<string name="lowest">
Le plus faible
</string>
<string name="mesh_status_good">
Bon à publier !
</string>
<string name="mesh_status_na">
N/A
</string>
<string name="mesh_status_none">
Aucun
</string>
<string name="mesh_status_submesh_mismatch">
Un nombre différent de faces d&apos;application de texture est associé aux niveaux de détail.
</string>
<string name="mesh_status_mesh_mismatch">
Un nombre différent d&apos;instances de maillage est associé aux niveaux de détail.
</string>
<string name="mesh_status_too_many_vertices">
Trop de sommets pour le niveau de détail.
</string>
<string name="mesh_status_missing_lod">
Niveau de détail requis manquant.
</string>
<string name="mesh_status_invalid_material_list">
Les options du niveau de détail ne sont pas une sous-ensemble d&apos;un modèle de référence.
</string>
<string name="phys_status_vertex_limit_exceeded">
Certaines enveloppes physiques dépassent les limites de sommets.
</string>
<string name="layer_all">
Tout
</string>
<string name="decomposing">
Analyse...
</string>
<string name="simplifying">
Simplification...
</string>
<string name="tbd">
TBD
</string>
<panel name="left_panel">
<panel name="model_name_representation_panel">
<text name="name_label">
Nom du modèle :
</text>
<text name="model_category_label">
Ce modèle représente...
</text>
<combo_box name="model_category_combo">
<combo_item label="Choisir une option..." name="Choose one"/>
<combo_item label="Silhouette de l&apos;avatar" name="Avatar shape"/>
<combo_item label="Éléments attachés aux avatars" name="Avatar attachment"/>
<combo_item label="Objet mobile (véhicule, animal)" name="Moving object (vehicle, animal)"/>
<combo_item label="Éléments pour la construction" name="Building Component"/>
<combo_item label="Important, immobile etc." name="Large, non moving etc"/>
<combo_item label="Plus petit, immobile etc." name="Smaller, non-moving etc"/>
<combo_item label="Aucun" name="Not really any of these"/>
<string name="no_havok">téléchargement du maillage avec physique</string>
<string name="status_parse_error">Erreur : Problème d&apos;analyse de fichier .dae ; reportez-vous au journal pour plus de détails.</string>
<string name="status_bind_shape_orientation">Avertissement : la matrice de formes de reliure n&apos;est pas dans l&apos;orientation standard X-avant.</string>
<string name="status_material_mismatch">Erreur : le matériau du modèle ne correspond pas à un sous-ensemble du modèle de référence.</string>
<string name="status_lod_model_mismatch">Error: Le modèle LOD n'a pas de parent.</string>
<string name="status_reading_file">Chargement...</string>
<string name="status_generating_meshes">Génération des maillages...</string>
<string name="status_vertex_number_overflow">Erreur : valeur de sommet supérieure à 65534. Opération abandonnée.</string>
<string name="bad_element">Erreur : élément non valide</string>
<string name="high">Élevé</string>
<string name="medium">Moyen</string>
<string name="low">Faible</string>
<string name="lowest">Le plus faible</string>
<string name="mesh_status_good">Bon à publier !</string>
<string name="mesh_status_na">N/A</string>
<string name="mesh_status_none">Aucun</string>
<string name="mesh_status_submesh_mismatch">Un nombre différent de faces d&apos;application de texture est associé aux niveaux de détail.</string>
<string name="mesh_status_mesh_mismatch">Un nombre différent d&apos;instances de maillage est associé aux niveaux de détail.</string>
<string name="mesh_status_too_many_vertices">Trop de sommets pour le niveau de détail.</string>
<string name="mesh_status_missing_lod">Niveau de détail requis manquant.</string>
<string name="mesh_status_invalid_material_list">Les options du niveau de détail ne sont pas une sous-ensemble d&apos;un modèle de référence.</string>
<string name="phys_status_vertex_limit_exceeded">Certaines enveloppes physiques dépassent les limites de sommets.</string>
<string name="phys_status_hull_limit_exceeded">Certains modèles dépassent la limite de la coque (256) ; essayez de "simplifier"..</string>
<string name="phys_status_degenerate_triangles">Maillage physique trop dense ; supprimez les petits et fins triangles (voir aperçu).</string>
<string name="phys_status_no_havok">Cette version ne contient pas de support Havok et n'est pas recommandée pour le chargement de physiques dans Second Life. Les résultats peuvent être imprévisibles.</string>
<string name="phys_status_too_thin">Une ou plusieurs dimensions sont inférieures à 0,5 m, seules les formes physiques basées sur la coque (analysées) fonctionneront correctement.</string>
<string name="phys_status_unknown_error">Une erreur inconnue a été détectée.</string>
<string name="layer_all">Tout</string>
<string name="decomposing">Analyse...</string>
<string name="simplifying">Simplification...</string>
<string name="TooManyJoint">Le skinning est désactivé en raison d'un trop grand nombre d'articulations : [JOINTS], maximum : [MAX]</string>
<string name="UnrecognizedJoint">Riggé à une articulation au nom inconnu [NAME]</string>
<string name="UnknownJoints">Skinning désactivé à cause de [COUNT] articulation inconnues.</string>
<string name="ModelLoaded">Modèle [MODEL_NAME] chargé</string>
<string name="IncompleteTC">Les données des coordonnées de la texture ne sont pas complètes.</string>
<panel name="left_panel">
<panel name="model_name_representation_panel">
<text name="name_label">
Nom du modèle :
</text>
<text name="model_category_label">
Ce modèle représente...
</text>
<combo_box name="model_category_combo">
<combo_item label="Choisir une option..." name="Choose one"/>
<combo_item label="Silhouette de l&apos;avatar" name="Avatar shape"/>
<combo_item label="Éléments attachés aux avatars" name="Avatar attachment"/>
<combo_item label="Objet mobile (véhicule, animal)" name="Moving object (vehicle, animal)"/>
<combo_item label="Éléments pour la construction" name="Building Component"/>
<combo_item label="Important, immobile etc." name="Large, non moving etc"/>
<combo_item label="Plus petit, immobile etc." name="Smaller, non-moving etc"/>
<combo_item label="Aucun" name="Not really any of these"/>
</combo_box>
</panel>
<tab_container name="import_tab">
<panel label="Niveau de détail" name="lod_panel" title="Niveau de détail">
<text initial_value="Source" name="source" value="Source"/>
<text initial_value="Triangles" name="triangles" value="Triangles"/>
<text initial_value="Sommets" name="vertices" value="Sommets"/>
<text initial_value="Élevé" name="high_label" value="Élevé"/>
<combo_box name="lod_source_high">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
</combo_box>
<button label="Parcourir..." name="lod_browse_high"/>
<combo_box name="lod_mode_high">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="high_triangles" value="0"/>
<text initial_value="0" name="high_vertices" value="0"/>
<text initial_value="Moyen" name="medium_label" value="Moyen"/>
<combo_box name="lod_source_medium">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
</combo_box>
<button label="Parcourir..." name="lod_browse_medium"/>
<combo_box name="lod_mode_medium">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="medium_triangles" value="0"/>
<text initial_value="0" name="medium_vertices" value="0"/>
<text initial_value="Faible" name="low_label" value="Faible"/>
<combo_box name="lod_source_low">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
</combo_box>
<button label="Parcourir..." name="lod_browse_low"/>
<combo_box name="lod_mode_low">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="low_triangles" value="0"/>
<text initial_value="0" name="low_vertices" value="0"/>
<text initial_value="Le plus faible" name="lowest_label" value="Le plus faible"/>
<combo_box name="lod_source_lowest">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
</combo_box>
<button label="Parcourir..." name="lod_browse_lowest"/>
<combo_box name="lod_mode_lowest">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="lowest_triangles" value="0"/>
<text initial_value="0" name="lowest_vertices" value="0"/>
<check_box label="Génération de normales" name="gen_normals"/>
<text initial_value="Angle pli :" name="crease_label" value="Angle pli :"/>
<spinner name="crease_angle" value="75"/>
</panel>
<tab_container name="import_tab">
<panel label="Niveau de détail" name="lod_panel" title="Niveau de détail">
<text initial_value="Source" name="source" value="Source"/>
<text initial_value="Triangles" name="triangles" value="Triangles"/>
<text initial_value="Sommets" name="vertices" value="Sommets"/>
<text initial_value="Élevé" name="high_label" value="Élevé"/>
<combo_box name="lod_source_high">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
<panel label="Propriétés physiques" name="physics_panel">
<panel name="physics geometry">
<text name="first_step_name">
Étape 1 : Niveau de détail
</text>
<combo_box name="physics_lod_combo" tool_tip="Niveau de détail à utiliser pour la forme des propriétés physiques.">
<combo_item name="choose_one">
Choisir une option...
</combo_item>
<combo_item name="physics_high">
Élevé
</combo_item>
<combo_item name="physics_medium">
Moyen
</combo_item>
<combo_item name="physics_low">
Faible
</combo_item>
<combo_item name="physics_lowest">
Le plus faible
</combo_item>
<combo_item name="physics_cube">
Cube
</combo_item>
<combo_item name="physics_hex">
Hexagone
</combo_item>
<combo_item name="physics_ud">
Défini par l'utilisateur
</combo_item>
<combo_item name="load_from_file">
Du fichier
</combo_item>
</combo_box>
<button label="Parcourir..." name="lod_browse_high"/>
<combo_box name="lod_mode_high">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="high_triangles" value="0"/>
<text initial_value="0" name="high_vertices" value="0"/>
<text initial_value="Moyen" name="medium_label" value="Moyen"/>
<combo_box name="lod_source_medium">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
</combo_box>
<button label="Parcourir..." name="lod_browse_medium"/>
<combo_box name="lod_mode_medium">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="medium_triangles" value="0"/>
<text initial_value="0" name="medium_vertices" value="0"/>
<text initial_value="Faible" name="low_label" value="Faible"/>
<combo_box name="lod_source_low">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
</combo_box>
<button label="Parcourir..." name="lod_browse_low"/>
<combo_box name="lod_mode_low">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="low_triangles" value="0"/>
<text initial_value="0" name="low_vertices" value="0"/>
<text initial_value="Le plus faible" name="lowest_label" value="Le plus faible"/>
<combo_box name="lod_source_lowest">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
</combo_box>
<button label="Parcourir..." name="lod_browse_lowest"/>
<combo_box name="lod_mode_lowest">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="lowest_triangles" value="0"/>
<text initial_value="0" name="lowest_vertices" value="0"/>
<check_box label="Génération de normales" name="gen_normals"/>
<text initial_value="Angle pli :" name="crease_label" value="Angle pli :"/>
<spinner name="crease_angle" value="75"/>
<button label="Parcourir..." name="physics_browse"/>
</panel>
<panel label="Propriétés physiques" name="physics_panel">
<panel name="physics geometry">
<text name="first_step_name">
Étape 1 : Niveau de détail
</text>
<combo_box name="physics_lod_combo" tool_tip="Niveau de détail à utiliser pour la forme des propriétés physiques.">
<combo_item name="choose_one">
Choisir une option...
</combo_item>
<combo_item name="physics_high">
Élevé
</combo_item>
<combo_item name="physics_medium">
Moyen
</combo_item>
<combo_item name="physics_low">
Faible
</combo_item>
<combo_item name="physics_lowest">
Le plus faible
</combo_item>
<combo_item name="physics_cube">
Cube
</combo_item>
<combo_item name="physics_hex">
Hexagone
</combo_item>
<combo_item name="physics_ud">
Défini par l'utilisateur
</combo_item>
<combo_item name="load_from_file">
Du fichier
</combo_item>
</combo_box>
<button label="Parcourir..." name="physics_browse"/>
</panel>
<panel name="physics analysis">
<text name="method_label">
Étape 2 : Analyser
</text>
<text name="analysis_method_label">
Moyen :
</text>
<text name="quality_label">
Qualité :
</text>
<text name="smooth_method_label">
Lissage :
</text>
<check_box label="Fermer les trous" name="Close Holes (Slow)"/>
<button label="Analyser" name="Decompose"/>
<button label="Annuler" name="decompose_cancel"/>
</panel>
<panel name="physics simplification">
<text name="second_step_label">
Étape 3 : Simplifier
</text>
<text name="simp_method_header">
Moyen :
</text>
<text name="pass_method_header">
Passes :
</text>
<text name="Detail Scale label">
Échelle détail :
</text>
<text name="Retain%_label">
Retenue :
</text>
<combo_box name="Combine Quality" value="1"/>
<button label="Simplifier" name="Simplify"/>
<button label="Annuler" name="simplify_cancel"/>
</panel>
<panel name="physics info">
<text name="results_text">
Résultats :
</text>
<text name="physics_triangles">
Triangles : [TRIANGLES],
</text>
<text name="physics_points">
Sommets : [POINTS]
</text>
<text name="physics_hulls">
Enveloppes : [HULLS]
</text>
</panel>
<panel name="physics analysis">
<text name="method_label">
Étape 2 : Analyser
</text>
<text name="analysis_method_label">
Moyen :
</text>
<text name="quality_label">
Qualité :
</text>
<text name="smooth_method_label">
Lissage :
</text>
<check_box label="Fermer les trous" name="Close Holes (Slow)"/>
<button label="Analyser" name="Decompose"/>
<button label="Annuler" name="decompose_cancel"/>
</panel>
<panel label="Option de chargement" name="modifiers_panel">
<text name="scale_label">
Échelle (1 = aucune) :
<panel name="physics simplification">
<text name="second_step_label">
Étape 3 : Simplifier
</text>
<text name="dimensions_label">
Dimensions :
<text name="simp_method_header">
Moyen :
</text>
<text name="import_dimensions">
[X] X [Y] X [Z]
<text name="pass_method_header">
Passes :
</text>
<check_box label="Inclure les textures" name="upload_textures"/>
<text name="Detail Scale label">
Échelle détail :
</text>
<text name="Retain%_label">
Retenue :
</text>
<combo_box name="Combine Quality" value="1"/>
<button label="Simplifier" name="Simplify"/>
<button label="Annuler" name="simplify_cancel"/>
</panel>
<panel label="Outrepasser" title="Avatar" name="rigging_panel">
<check_box label="Inclure pondération de la peau :" name="upload_skin"/>
<check_box label="Inclure position des articulations :" name="upload_joints"/>
<check_box label="Verrouiller l’échelle si la position des articulations est définie" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
Décalage Z (élever/abaisser l&apos;avatar) :
<panel name="physics info">
<text name="results_text">
Résultats :
</text>
<text name="skin_too_many_joints">
Trop d'articulations texturées
<text name="physics_triangles">
Triangles : [TRIANGLES],
</text>
<text name="skin_unknown_joint">
Le modèle a des articulations inconnues
<text name="physics_points">
Sommets : [POINTS]
</text>
<text name="joints_descr">
Articulations :
<text name="physics_hulls">
Enveloppes : [HULLS]
</text>
<text name="conflicts_description">
[CONFLICTS] Conflits dans la/les articulations [JOINTS_COUNT]
</text>
<text name="pos_overrides_descr">
Position annulée pour l'articulation '[JOINT]':
</text>
<scroll_list name="pos_overrides_list">
<scroll_list.columns label="Modèle" name="model_name"/>
<scroll_list.columns label="X" name="axis_x"/>
<scroll_list.columns label="Y" name="axis_y"/>
<scroll_list.columns label="Z" name="axis_z"/>
</scroll_list>
</panel>
<panel label="Journal" name="logs_panel">
<check_box label="Afficher le journal détaillé" name="verbose_logging"/>
</panel>
<panel label="Réglages aperçu" name="mesh_preview_settings_panel">
<text name="mesh_upload_behaviour_label">
Chargement des modèles :
</text>
<check_box label="Activation automatique des poids" tool_tip="Régler automatiquement le poids des mesh avec les informations de rigging" name="mesh_preview_auto_weights"/>
<check_box label="Visualisation automatique des poids" tool_tip="Visualiser automatiquement les poids dans l'aperçu des meshes avec les info de rigging" name="mesh_preview_auto_show_weights"/>
<text name="mesh_preview_ud_preset_label">
Physique défini par l'utilisateur :
</text>
<line_editor name="ud_physics" tool_tip="Chemin d'accès complet vers un fichier Collada à utiliser pour les propriétés physiques."/>
<text name="mesh_preview_colors_label">
Couleurs de l'aperçu des modèles :
</text>
<text name="user_label">
Général :
</text>
<color_swatch label="Arrière-plan" tool_tip="Couleur d'arrière-plan pour l'uploader" name="mesh_preview_canvas_color"/>
<color_swatch label="Arêtes du modèle" tool_tip="Couleur des arêtes du modèle dans l'aperçu de l'uploader" name="mesh_preview_edge_color"/>
<text name="physics_settings_label">
Physiques :
</text>
<color_swatch label="Arêtes du physique" tool_tip="Couleur des arêtes pour les triangles du physique dans l'aperçu de l'uploader" name="mesh_preview_physics_edge_color"/>
<color_swatch label="Physique" tool_tip="Couleur de remplissage pour les physiques dans l'aperçu de l'uploader" name="mesh_preview_physics_fill_color"/>
<text name="physics_issues_setting_label">
Pb des physiques :
</text>
<color_swatch label="Mauvaises arêtes" tool_tip="Couleur des arêtes pour les triangles dégénérés (fin) dans l'aperçu de l'uploader" name="mesh_preview_degenerate_edge_color"/>
<color_swatch label="Mauvais triangles" tool_tip="Couleur de remplissage pour les triangles dégénérés (fin) dans l'aperçu de l'uploader" name="mesh_degenerate_fill_color"/>
</panel>
</tab_container>
<panel name="weights_and_warning_panel">
<button label="Calculer les poids et les frais" name="calculate_btn" tool_tip="Calculer les poids et les frais."/>
<button label="Annuler" name="cancel_btn"/>
<button label="Charger" name="ok_btn" tool_tip="Charger dans le simulateur"/>
<button label="Effacer les paramètres / réinitialiser" name="reset_btn"/>
<text name="upload_fee">
Frais de chargt : [FEE] L$
</panel>
<panel label="Option de chargement" name="modifiers_panel">
<text name="scale_label">
Échelle (1 = aucune) :
</text>
<text name="prim_weight">
Impact terrain : [EQ]
<text name="dimensions_label">
Dimensions :
</text>
<text name="download_weight">
Chargement : [ST]
<text name="import_dimensions">
[X] X [Y] X [Z]
</text>
<text name="physics_weight">
Physique : [PH]
<check_box label="Inclure les textures" name="upload_textures"/>
</panel>
<panel label="Outrepasser" title="Avatar" name="rigging_panel">
<check_box label="Inclure pondération de la peau :" name="upload_skin"/>
<check_box label="Inclure position des articulations :" name="upload_joints"/>
<check_box label="Verrouiller l’échelle si la position des articulations est définie" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
Décalage Z (élever/abaisser l&apos;avatar) :
</text>
<text name="server_weight">
Serveur : [SIM]
<text name="skin_too_many_joints">
Trop d'articulations texturées
</text>
<panel name="price_breakdown_panel">
<text name="price_breakdown_title">
Répartition des coûts
</text>
<text name="price_breakdown_labels">
<text name="skin_unknown_joint">
Le modèle a des articulations inconnues
</text>
<text name="joints_descr">
Articulations :
</text>
<text name="conflicts_description">
[CONFLICTS] Conflits dans la/les articulations [JOINTS_COUNT]
</text>
<text name="pos_overrides_descr">
Position annulée pour l'articulation '[JOINT]':
</text>
<scroll_list name="pos_overrides_list">
<scroll_list.columns label="Modèle" name="model_name"/>
<scroll_list.columns label="X" name="axis_x"/>
<scroll_list.columns label="Y" name="axis_y"/>
<scroll_list.columns label="Z" name="axis_z"/>
</scroll_list>
</panel>
<panel label="Journal" name="logs_panel">
<check_box label="Afficher le journal détaillé" name="verbose_logging"/>
</panel>
<panel label="Réglages aperçu" name="mesh_preview_settings_panel">
<text name="mesh_upload_behaviour_label">
Chargement des modèles :
</text>
<check_box label="Activation automatique des poids" tool_tip="Régler automatiquement le poids des mesh avec les informations de rigging" name="mesh_preview_auto_weights"/>
<check_box label="Visualisation automatique des poids" tool_tip="Visualiser automatiquement les poids dans l'aperçu des meshes avec les info de rigging" name="mesh_preview_auto_show_weights"/>
<text name="mesh_preview_ud_preset_label">
Physique défini par l'utilisateur :
</text>
<line_editor name="ud_physics" tool_tip="Chemin d'accès complet vers un fichier Collada à utiliser pour les propriétés physiques."/>
<text name="mesh_preview_colors_label">
Couleurs de l'aperçu des modèles :
</text>
<text name="user_label">
Général :
</text>
<color_swatch label="Arrière-plan" tool_tip="Couleur d'arrière-plan pour l'uploader" name="mesh_preview_canvas_color"/>
<color_swatch label="Arêtes du modèle" tool_tip="Couleur des arêtes du modèle dans l'aperçu de l'uploader" name="mesh_preview_edge_color"/>
<text name="physics_settings_label">
Physiques :
</text>
<color_swatch label="Arêtes du physique" tool_tip="Couleur des arêtes pour les triangles du physique dans l'aperçu de l'uploader" name="mesh_preview_physics_edge_color"/>
<color_swatch label="Physique" tool_tip="Couleur de remplissage pour les physiques dans l'aperçu de l'uploader" name="mesh_preview_physics_fill_color"/>
<text name="physics_issues_setting_label">
Pb des physiques :
</text>
<color_swatch label="Mauvaises arêtes" tool_tip="Couleur des arêtes pour les triangles dégénérés (fin) dans l'aperçu de l'uploader" name="mesh_preview_degenerate_edge_color"/>
<color_swatch label="Mauvais triangles" tool_tip="Couleur de remplissage pour les triangles dégénérés (fin) dans l'aperçu de l'uploader" name="mesh_degenerate_fill_color"/>
</panel>
</tab_container>
<panel name="weights_and_warning_panel">
<button label="Calculer les poids et les frais" name="calculate_btn" tool_tip="Calculer les poids et les frais."/>
<button label="Annuler" name="cancel_btn"/>
<button label="Charger" name="ok_btn" tool_tip="Charger dans le simulateur"/>
<button label="Effacer les paramètres / réinitialiser" name="reset_btn"/>
<text name="upload_fee">
Frais de chargt : [FEE] L$
</text>
<text name="prim_weight">
Impact terrain : [EQ]
</text>
<text name="download_weight">
Chargement : [ST]
</text>
<text name="physics_weight">
Physique : [PH]
</text>
<text name="server_weight">
Serveur : [SIM]
</text>
<panel name="price_breakdown_panel">
<text name="price_breakdown_title">
Répartition des coûts
</text>
<text name="price_breakdown_labels">
Chargement :
Physique :
Instances :
Textures :
Modèle :
</text>
</panel>
<!--
<text name="streaming_breakdown_labels">
</text>
</panel>
<!--
<text name="streaming_breakdown_labels">
Streaming/Téléchargement :
Élevé :
Moyen :
Bas :
Le plus bas :
</text>
-->
<panel name="physics_costs_panel">
<text name="physics_breakdown_title">
Coûts du physique
</text>
-->
<panel name="physics_costs_panel">
<text name="physics_breakdown_title">
Coûts du physique
</text>
<text name="physics_breakdown_labels">
<text name="physics_breakdown_labels">
Enveloppe :
Maillage :
Analysé :
</text>
</panel>
<panel name="preview_controls_panel">
<panel name="preview_controls_inner_panel">
<text name="preview_controls_title">
Contrôles de l'aperçu
</text>
<combo_box name="preview_lod_combo" tool_tip="Dargestelltes LOD in der Vorschau">
<combo_item name="high">Élevé</combo_item>
<combo_item name="medium">Moyen</combo_item>
<combo_item name="low">Faible</combo_item>
<combo_item name="lowest">Le plus faible</combo_item>
</combo_box>
</panel>
<check_box label="Arêtes" name="show_edges"/>
<check_box label="Textures" name="show_textures"/>
<check_box label="Guide UV" name="show_uv_guide"/>
<check_box label="Physique" name="show_physics"/>
<text name="exploder_label" width="105">
Aperçu :
</text>
<slider name="physics_explode" width="75" />
<check_box label="Poids" name="show_skin_weight"/>
<check_box label="Positions articul." name="show_joint_positions"/>
<check_box label="Surcharge pos. articulations" name="show_joint_overrides"/>
</panel>
<text name="warning_title">
Remarque :
</text>
<text name="warning_message">
Vous n&apos;avez pas la permission de charger des modèles de maillage. [[VURL] Savoir comment] obtenir la permission.
</text>
<text name="status">
[STATUS]
</text>
</panel>
<panel name="preview_controls_panel">
<panel name="preview_controls_inner_panel">
<text name="preview_controls_title">
Contrôles de l'aperçu
</text>
<combo_box name="preview_lod_combo" tool_tip="Dargestelltes LOD in der Vorschau">
<combo_item name="high">Élevé</combo_item>
<combo_item name="medium">Moyen</combo_item>
<combo_item name="low">Faible</combo_item>
<combo_item name="lowest">Le plus faible</combo_item>
</combo_box>
</panel>
<check_box label="Arêtes" name="show_edges"/>
<check_box label="Textures" name="show_textures"/>
<check_box label="Guide UV" name="show_uv_guide"/>
<check_box label="Physique" name="show_physics"/>
<text name="exploder_label" width="105">
Aperçu :
</text>
<slider name="physics_explode" width="75" />
<check_box label="Poids" name="show_skin_weight"/>
<check_box label="Positions articul." name="show_joint_positions"/>
<check_box label="Surcharge pos. articulations" name="show_joint_overrides"/>
</panel>
<text name="warning_title">
Remarque :
</text>
<text name="warning_message">
Vous n&apos;avez pas la permission de charger des modèles de maillage. [[VURL] Savoir comment] obtenir la permission.
</text>
<text name="status">
[STATUS]
</text>
</panel>
<text name="lod_label">
Aperçu :
</text>
</panel>
<text name="lod_label">
Aperçu :
</text>
</floater>

View File

@ -5389,4 +5389,9 @@ Veuillez noter que "Utiliser l'environnement partagé" et "Basé sur le cycle jo
Remettre l'URL par défaut ?
<usetemplate name="okcancelbuttons" notext="Rappeler plus tard" yestext="Réinitialiser"/>
</notification>
<notification name="WarnScriptedCamera">
La réinitialisation de la caméra peut être empêchée par les objets suivants :
[SOURCES]
</notification>
</notifications>

View File

@ -5160,6 +5160,13 @@ Wynik testu kompresji pliku dla gzip na poziomie 6 z [FILE] o rozmiarze [SIZE] K
Pakowanie: [PACK_TIME]s [PSIZE]KB
Rozpakowywanie: [UNPACK_TIME]s [USIZE]KB
</notification>
<notification name="PromptMFAToken">
[MESSAGE]
<form name="form">
<button name="continue" text="Kontynuuj" />
<button name="cancel" text="Anuluj" />
</form>
</notification>
<notification name="NoValidEnvSettingFound">
Nie wybrano prawidłowego ustawienia otoczenia.
@ -5185,4 +5192,9 @@ Pamiętaj, że nie można wybrać "otoczenia współdzielonego" i "bazowanego na
Zresetować adres URL do domyślnego?
<usetemplate name="okcancelbuttons" notext="Przypomnij mi potem" yestext="Resetuj" />
</notification>
<notification name="WarnScriptedCamera">
Resetowanie kamery może być zablokowane przez następujące obiekty:
[SOURCES]
</notification>
</notifications>

View File

@ -232,6 +232,7 @@ http://secondlife.com/viewer-access-faq
Upewnij się, że wpisano poprawnie:
* Login (np. bobsmith12 czy steller.sunshine)
* Hasło
* Token weryfikacji dwuetapowej (gdy włączona)
Sprawdź też, czy klawisz Caps Lock nie jest wciśnięty.
</string>
<string name="LoginFailedPasswordChanged">
@ -341,6 +342,10 @@ Spróbuj zalogować się ponownie za minutę.
<string name="LoginFailedLoggingOutSession">
System rozpoczął wylogowywanie Twojej ostatniej sesji.
Spróbuj zalogować się ponownie za minutę.
</string>
<string name="LoginFailedAuthenticationMFARequired">
Wprowadź nowy token z aplikacji do uwierzytelniania wieloskładnikowego.
Jeśli myślisz, że to błąd skontaktuj się z support@secondlife.com
</string>
<string name="AgentLostConnection">
Ten region może mieć problemy. Sprawdź podłączenie do Internetu.

View File

@ -5298,16 +5298,19 @@ https://wiki.firestormviewer.org/fs_voice
Диспетчер анимаций (AO): [AO_MESSAGE]
<usetemplate ignoretext="Предупредить меня, когда к функции Диспетчера анимаций (AO) обращается скриптовый объект" name="notifyignore"/>
</notification>
<notification name="AttachedRiggedObjectToHUD">
Предмет с названием "[NAME]" является ригованым мешем, но прикреплен на экран в "[HUD_POINT]". Это значит, что для вас он будет отображаться правильно, но все остальные вообще не смогут его увидеть. Возможно, вы захотите снять его и снова прикрепить к обычной точке крепления на теле.
<usetemplate ignoretext="Предупреждать меня когда ригованные вещи прикрепляются на экран пользователя." name="notifyignore"/>
</notification>
<notification name="WarnForceLoginURL">
URL-адрес заставки входа в систему переопределен в целях тестирования.
Сбросить URL по умолчанию?
<usetemplate name="okcancelbuttons" notext="Напомни мне в следующий раз" yestext="Сбросить"/>
</notification>
<notification name="WarnScriptedCamera">
Сброс камеры может быть заблокирован следующими объектами:
[SOURCES]
</notification>
</notifications>

View File

@ -208,6 +208,15 @@ std::string LLGridManager::getAppSLURLBase(const std::string& grid_name)
{
return "myappslurl";
}
std::string LLGridManager::getGridId(const std::string& grid)
{
return std::string();
}
//LLPointer<LLSecAPIHandler> getSecHandler(const std::string& handler_type)
//{
// return nullptr;
//}
//-----------------------------------------------------------------------------
#include "../llviewercontrol.h"
@ -240,6 +249,7 @@ bool llHashedUniqueID(unsigned char* id)
//-----------------------------------------------------------------------------
#include "../llappviewer.h"
void LLAppViewer::forceQuit(void) {}
bool LLAppViewer::isUpdaterMissing() { return true; }
LLAppViewer * LLAppViewer::sInstance = 0;
//-----------------------------------------------------------------------------
@ -248,6 +258,8 @@ LLAppViewer * LLAppViewer::sInstance = 0;
static std::string gTOSType;
static LLEventPump * gTOSReplyPump = NULL;
LLPointer<LLSecAPIHandler> gSecAPIHandler;
//static
LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key, BOOL focus)
{
@ -365,6 +377,7 @@ namespace tut
gSavedSettings.declareString("ClientSettingsFile", "test_settings.xml", "", LLControlVariable::PERSIST_NO);
gSavedSettings.declareString("NextLoginLocation", "", "", LLControlVariable::PERSIST_NO);
gSavedSettings.declareBOOL("LoginLastLocation", FALSE, "", LLControlVariable::PERSIST_NO);
gSavedSettings.declareBOOL("CmdLineSkipUpdater", TRUE, "", LLControlVariable::PERSIST_NO);
LLSD authenticator = LLSD::emptyMap();
LLSD identifier = LLSD::emptyMap();

View File

@ -62,6 +62,7 @@ LLPointer<LLCertificateStore> LLSecAPIBasicHandler::getCertificateStore(const st
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) {}
void LLSecAPIBasicHandler::syncProtectedMap() {}
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; }

View File

@ -250,26 +250,34 @@ void LLLogin::Impl::loginCoro(std::string uri, LLSD login_params)
// Since sSyncPoint is an LLEventMailDrop, we DEFINITELY want to
// consume the posted event.
// <FS:ND> Disable updater (n.b. this might not beed needed anymore)
// LLCoros::OverrideConsuming oc(true);
// // Timeout should produce the isUndefined() object passed here.
// LL_DEBUGS("LLLogin") << "Login failure, waiting for sync from updater" << LL_ENDL;
// LLSD updater = llcoro::suspendUntilEventOnWithTimeout(sSyncPoint, 10, LLSD());
// if (updater.isUndefined())
// {
// LL_WARNS("LLLogin") << "Failed to hear from updater, proceeding with fail.login"
// << LL_ENDL;
// }
// else
// {
// LL_DEBUGS("LLLogin") << "Got responses from updater and login.cgi" << LL_ENDL;
// }
// // Let the fail.login handler deal with empty updater response.
// LLSD responses(mAuthResponse["responses"]);
// responses["updater"] = updater;
// sendProgressEvent("offline", "fail.login", responses);
sendProgressEvent("offline", "fail.login", mAuthResponse["responses"]);
// </FS:ND>
LLCoros::OverrideConsuming oc(true);
LLSD responses(mAuthResponse["responses"]);
LLSD updater;
if (printable_params["wait_for_updater"].asBoolean())
{
std::string reason_response = responses["data"]["reason"].asString();
if (reason_response == "update") // No point waiting if not an update
{
// Timeout should produce the isUndefined() object passed here.
LL_INFOS("LLLogin") << "Login failure, waiting for sync from updater" << LL_ENDL;
updater = llcoro::suspendUntilEventOnWithTimeout(sSyncPoint, 10, LLSD());
if (updater.isUndefined())
{
LL_WARNS("LLLogin") << "Failed to hear from updater, proceeding with fail.login"
<< LL_ENDL;
}
else
{
LL_DEBUGS("LLLogin") << "Got responses from updater and login.cgi" << LL_ENDL;
}
}
}
// Let the fail.login handler deal with empty updater response.
responses["updater"] = updater;
sendProgressEvent("offline", "fail.login", responses);
}
return; // Done!
}