bool FSExportPermsCheck::canExportAsset(LLUUID asset_id, std::string* name, std::string* description) { bool exportable = false; LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; LLAssetIDMatches asset_id_matches(asset_id); gInventory.collectDescendentsIf(LLUUID::null, cats, items, LLInventoryModel::INCLUDE_TRASH, asset_id_matches); if (items.size()) { // use the name of the first match (*name) = items[0]->getName(); (*description) = items[0]->getDescription(); for (S32 i = 0; i < items.size(); ++i) { if (!exportable) { LLPermissions perms = items[i]->getPermissions(); #ifdef OPENSIM if (LLGridManager::getInstance()->isInOpenSim()) { switch (LFSimFeatureHandler::instance().exportPolicy()) { case EXPORT_ALLOWED: exportable = (perms.getMaskOwner() & PERM_EXPORT) == PERM_EXPORT; break; /// TODO: Once enough grids adopt a version supporting exports, get consensus /// on whether we should allow full perm exports anymore. case EXPORT_UNDEFINED: exportable = (perms.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED; break; case EXPORT_DENIED: default: exportable = perms.getCreator() == gAgentID; break; } } #endif if (LLGridManager::getInstance()->isInSecondLife() && (perms.getCreator() == gAgentID)) { exportable = true; } } } } return exportable; }
bool is_asset_exportable(const LLUUID& asset_id) { if (asset_id.isNull()) return true; // Don't permission-check null textures LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; LLAssetIDMatches asset_id_matches(asset_id); gInventory.collectDescendentsIf(LLUUID::null, cats, items, true, asset_id_matches, false); for (int i = 0; i < items.count(); ++i) { if (perms_allow_export(items[i]->getPermissions())) return true; } return false; }
// So far, only Second Life forces TPVs to verify the creator for textures... // which sucks, because there is no other way to check for the texture // permissions or creator than to try and find the asset(s) corresponding to // the texture in the inventory and check the permissions/creator on the said // asset(s), meaning that if you created the texture and subsequently deleted // it from your inventory, you will not be able to export it any more !!! // The "must be creator" stuff also goes against the usage in Linden Lab's own // official viewers, since those allow you to save full perm textures (such as // the textures in the Library), whoever is the actual creator... Go figure ! LLUUID LLObjectBackup::validateTextureID(LLUUID asset_id) { if (!gHippoGridManager->getConnectedGrid()->isSecondLife()) { // If we are not in Second Life, don't bother. return asset_id; } LLUUID texture = LL_TEXTURE_PLYWOOD; if (asset_id == texture || asset_id == LL_TEXTURE_BLANK || asset_id == LL_TEXTURE_INVISIBLE || asset_id == LL_TEXTURE_TRANSPARENT || asset_id == LL_TEXTURE_MEDIA) { // Allow to export a few default SL textures. return asset_id; } LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; LLAssetIDMatches asset_id_matches(asset_id); gInventory.collectDescendentsIf(LLUUID::null, cats, items, LLInventoryModel::INCLUDE_TRASH, asset_id_matches); if (items.count()) { for (S32 i = 0; i < items.count(); i++) { const LLPermissions item_permissions = items[i]->getPermissions(); if (validatePerms(&item_permissions)) { texture = asset_id; } } } if (texture != asset_id) { mNonExportedTextures |= TEXTURE_BAD_PERM; } return texture; }
//static bool LLObjectBackup::validateTexturePerms(const LLUUID& asset_id) { if (LFSimFeatureHandler::instance().exportPolicy() == ep_full_perm) { // If we are not in Second Life and we don't have export-permission // support, don't bother and unconditionally accept the texture export // (legacy behaviour). return true; } if (asset_id == LL_TEXTURE_PLYWOOD || asset_id == LL_TEXTURE_BLANK || asset_id == LL_TEXTURE_INVISIBLE || asset_id == LL_TEXTURE_TRANSPARENT || asset_id == LL_TEXTURE_MEDIA) { // Allow to export a few default SL textures. return true; } LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; LLAssetIDMatches asset_id_matches(asset_id); gInventory.collectDescendentsIf(LLUUID::null, cats, items, LLInventoryModel::INCLUDE_TRASH, asset_id_matches); S32 count = items.size(); if (count > 0) { for (S32 i = 0; i < count; ++i) { const LLPermissions item_permissions = items[i]->getPermissions(); if (validatePerms(&item_permissions)) { return true; } } } return false; }
const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, BOOL copyable_only) { LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; LLAssetIDMatches asset_id_matches(asset_id); gInventory.collectDescendentsIf(LLUUID::null, cats, items, LLInventoryModel::INCLUDE_TRASH, asset_id_matches); if (items.count()) { // search for copyable version first for (S32 i = 0; i < items.count(); i++) { LLInventoryItem* itemp = items[i]; LLPermissions item_permissions = itemp->getPermissions(); if (item_permissions.allowCopyBy(gAgent.getID(), gAgent.getGroupID())) { return itemp->getUUID(); } } // otherwise just return first instance, unless copyable requested if (copyable_only) { return LLUUID::null; } else { return items[0]->getUUID(); } } return LLUUID::null; }
// So far, only Second Life forces TPVs to verify the creator for textures... // which sucks, because there is no other way to check for the texture // permissions or creator than to try and find the asset(s) corresponding to // the texture in the inventory and check the permissions/creator on the said // asset(s), meaning that if you created the texture and subsequently deleted // it from your inventory, you will not be able to export it any more !!! // The "must be creator" stuff also goes against the usage in Linden Lab's own // official viewers, since those allow you to save full perm textures (such as // the textures in the Library), whoever is the actual creator... Go figure ! LLUUID LLObjectBackup::validateTextureID(LLUUID asset_id) { if (gHippoGridManager->getConnectedGrid()->getPlatform() != HippoGridInfo::PLATFORM_SECONDLIFE) { // If we are not in Second Life, don't bother. return asset_id; } LLUUID texture = LLUUID(gSavedSettings.getString("DefaultObjectTexture")); LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; LLAssetIDMatches asset_id_matches(asset_id); gInventory.collectDescendentsIf(LLUUID::null, cats, items, LLInventoryModel::INCLUDE_TRASH, asset_id_matches); if (items.count()) { for (S32 i = 0; i < items.count(); i++) { const LLPermissions item_permissions = items[i]->getPermissions(); if (validatePerms(&item_permissions)) { texture = asset_id; } } } if (texture != asset_id) { mNonExportedTextures |= TEXTURE_BAD_PERM; } return texture; }
bool FSExportPermsCheck::canExportNode(LLSelectNode* node, bool dae) { if (!node) { LL_WARNS("export") << "No node, bailing!" << LL_ENDL; return false; } bool exportable = false; LLViewerObject* object = node->getObject(); if (LLGridManager::getInstance()->isInSecondLife()) { LLUUID creator(node->mPermissions->getCreator()); exportable = (object->permYouOwner() && gAgentID == creator); if (!exportable) { // Megaprim check F32 max_object_size = LLWorld::getInstance()->getRegionMaxPrimScale(); LLVector3 vec = object->getScale(); if (vec.mV[VX] > max_object_size || vec.mV[VY] > max_object_size || vec.mV[VZ] > max_object_size) exportable = (creator == LLUUID("7ffd02d0-12f4-48b4-9640-695708fd4ae4") // Zwagoth Klaar || creator == gAgentID); } } #ifdef OPENSIM else if (LLGridManager::getInstance()->isInOpenSim()) { switch (LFSimFeatureHandler::instance().exportPolicy()) { case EXPORT_ALLOWED: { exportable = node->mPermissions->allowExportBy(gAgent.getID()); break; } /// TODO: Once enough grids adopt a version supporting exports, get consensus /// on whether we should allow full perm exports anymore. case EXPORT_UNDEFINED: { exportable = (object->permYouOwner() && object->permModify() && object->permCopy() && object->permTransfer()); break; } case EXPORT_DENIED: default: exportable = (object->permYouOwner() && gAgentID == node->mPermissions->getCreator()); } } #endif // OPENSIM // We've got perms on the object itself, let's check for sculptmaps and meshes! if (exportable) { LLVOVolume *volobjp = NULL; if (object->getPCode() == LL_PCODE_VOLUME) { volobjp = (LLVOVolume *)object; } if (volobjp && volobjp->isSculpted()) { const LLSculptParams *sculpt_params = (const LLSculptParams *)object->getParameterEntry(LLNetworkData::PARAMS_SCULPT); if (LLGridManager::getInstance()->isInSecondLife()) { if(volobjp->isMesh()) { if (dae) { LLSD mesh_header = gMeshRepo.getMeshHeader(sculpt_params->getSculptTexture()); exportable = mesh_header["creator"].asUUID() == gAgentID; } else { // can not export mesh to oxp LL_INFOS("export") << "Mesh can not be exported to oxp." << LL_ENDL; return false; } } else if (sculpt_params) { LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(sculpt_params->getSculptTexture()); if (imagep->mComment.find("a") != imagep->mComment.end()) { exportable = (LLUUID(imagep->mComment["a"]) == gAgentID); } if (!exportable) { LLUUID asset_id = sculpt_params->getSculptTexture(); LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; LLAssetIDMatches asset_id_matches(asset_id); gInventory.collectDescendentsIf(LLUUID::null, cats, items, LLInventoryModel::INCLUDE_TRASH, asset_id_matches); for (S32 i = 0; i < items.size(); ++i) { const LLPermissions perms = items[i]->getPermissions(); exportable = perms.getCreator() == gAgentID; } } if (!exportable) LL_INFOS("export") << "Sculpt map has failed permissions check." << LL_ENDL; } } #ifdef OPENSIM else if (LLGridManager::getInstance()->isInOpenSim()) { if (sculpt_params && !volobjp->isMesh()) { LLUUID asset_id = sculpt_params->getSculptTexture(); LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; LLAssetIDMatches asset_id_matches(asset_id); gInventory.collectDescendentsIf(LLUUID::null, cats, items, LLInventoryModel::INCLUDE_TRASH, asset_id_matches); for (S32 i = 0; i < items.size(); ++i) { const LLPermissions perms = items[i]->getPermissions(); switch (LFSimFeatureHandler::instance().exportPolicy()) { case EXPORT_ALLOWED: exportable = (perms.getMaskOwner() & PERM_EXPORT) == PERM_EXPORT; break; /// TODO: Once enough grids adopt a version supporting exports, get consensus /// on whether we should allow full perm exports anymore. case EXPORT_UNDEFINED: exportable = (perms.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED; break; case EXPORT_DENIED: default: exportable = perms.getCreator() == gAgentID; } if (!exportable) LL_INFOS("export") << "Sculpt map has failed permissions check." << LL_ENDL; } } else { exportable = true; } } #endif // OPENSIM } else { exportable = true; } } return exportable; }