llpermissions.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:29k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llpermissions.cpp
  3.  * @author Phoenix
  4.  * @brief Permissions for objects and inventory.
  5.  *
  6.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2002-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #include "linden_common.h"
  34. #include "llpermissions.h"
  35. // library includes
  36. #include "message.h"
  37. #include "metapropertyt.h"
  38. #include "llsd.h"
  39. ///----------------------------------------------------------------------------
  40. /// Class LLPermissions
  41. ///----------------------------------------------------------------------------
  42. const LLPermissions LLPermissions::DEFAULT;
  43. // No creator = created by system
  44. LLPermissions::LLPermissions()
  45. {
  46. init(LLUUID::null, LLUUID::null, LLUUID::null, LLUUID::null);
  47. }
  48. // Default to created by system
  49. void LLPermissions::init(const LLUUID& creator, const LLUUID& owner, const LLUUID& last_owner, const LLUUID& group)
  50. {
  51. mCreator = creator;
  52. mOwner = owner;
  53. mLastOwner = last_owner;
  54. mGroup = group;
  55. mMaskBase = PERM_ALL;
  56. mMaskOwner = PERM_ALL;
  57. mMaskEveryone = PERM_ALL;
  58. mMaskGroup = PERM_ALL;
  59. mMaskNextOwner = PERM_ALL;
  60. fixOwnership();
  61. }
  62. void LLPermissions::initMasks(PermissionMask base, PermissionMask owner,
  63.   PermissionMask everyone, PermissionMask group,
  64.   PermissionMask next)
  65. {
  66. mMaskBase = base;
  67. mMaskOwner = owner;
  68. mMaskEveryone = everyone;
  69. mMaskGroup = group;
  70. mMaskNextOwner = next;
  71. fixFairUse();
  72. fix();
  73. }
  74. // ! BACKWARDS COMPATIBILITY ! Override masks for inventory types that
  75. // no longer can have restricted permissions.  This takes care of previous
  76. // version landmarks that could have had no copy/mod/transfer bits set.
  77. void LLPermissions::initMasks(LLInventoryType::EType type)
  78. {
  79. if (LLInventoryType::cannotRestrictPermissions(type))
  80. {
  81. initMasks(PERM_ALL, PERM_ALL, PERM_ALL, PERM_ALL, PERM_ALL);
  82. }
  83. }
  84. BOOL LLPermissions::getOwnership(LLUUID& owner_id, BOOL& is_group_owned) const
  85. {
  86. if(mOwner.notNull())
  87. {
  88. owner_id = mOwner;
  89. is_group_owned = FALSE;
  90. return TRUE;
  91. }
  92. else if(mIsGroupOwned)
  93. {
  94. owner_id = mGroup;
  95. is_group_owned = TRUE;
  96. return TRUE;
  97. }
  98. return FALSE;
  99. }
  100. LLUUID LLPermissions::getSafeOwner() const
  101. {
  102. if(mOwner.notNull())
  103. {
  104. return mOwner;
  105. }
  106. else if(mIsGroupOwned)
  107. {
  108. return mGroup;
  109. }
  110. else
  111. {
  112. llwarns << "LLPermissions::getSafeOwner() called with no valid owner!" << llendl;
  113. LLUUID unused_uuid;
  114. unused_uuid.generate();
  115. return unused_uuid;
  116. }
  117. }
  118. U32 LLPermissions::getCRC32() const
  119. {
  120. U32 rv = mCreator.getCRC32();
  121. rv += mOwner.getCRC32();
  122. rv += mLastOwner.getCRC32();
  123. rv += mGroup.getCRC32();
  124. rv += mMaskBase + mMaskOwner + mMaskEveryone + mMaskGroup;
  125. return rv;
  126. }
  127. void LLPermissions::set(const LLPermissions& from)
  128. {
  129. mCreator = from.mCreator;
  130. mOwner = from.mOwner;
  131. mLastOwner = from.mLastOwner;
  132. mGroup = from.mGroup;
  133. mMaskBase = from.mMaskBase;
  134. mMaskOwner = from.mMaskOwner;
  135. mMaskEveryone = from.mMaskEveryone;
  136. mMaskGroup = from.mMaskGroup;
  137. mMaskNextOwner = from.mMaskNextOwner;
  138. mIsGroupOwned = from.mIsGroupOwned;
  139. }
  140. // Fix hierarchy of permissions. 
  141. void LLPermissions::fix()
  142. {
  143. mMaskOwner &= mMaskBase;
  144. mMaskGroup &= mMaskOwner;
  145. // next owner uses base, since you may want to sell locked objects.
  146. mMaskNextOwner &= mMaskBase;
  147. mMaskEveryone &= mMaskOwner;
  148. mMaskEveryone &= ~PERM_MODIFY;
  149. if(!(mMaskBase & PERM_TRANSFER) && !mIsGroupOwned)
  150. {
  151. mMaskGroup &= ~PERM_COPY;
  152. mMaskEveryone &= ~PERM_COPY;
  153. // Do not set mask next owner to too restrictive because if we
  154. // rez an object, it may require an ownership transfer during
  155. // rez, which will note the overly restrictive perms, and then
  156. // fix them to allow fair use, which may be different than the
  157. // original intention.
  158. }
  159. }
  160. // Correct for fair use - you can never take away the right to move
  161. // stuff you own, and you can never take away the right to transfer
  162. // something you cannot otherwise copy.
  163. void LLPermissions::fixFairUse()
  164. {
  165. mMaskBase |= PERM_MOVE;
  166. if(!(mMaskBase & PERM_COPY))
  167. {
  168. mMaskBase |= PERM_TRANSFER;
  169. }
  170. // (mask next owner == PERM_NONE) iff mask base is no transfer
  171. if(mMaskNextOwner != PERM_NONE)
  172. {
  173. mMaskNextOwner |= PERM_MOVE;
  174. }
  175. }
  176. void LLPermissions::fixOwnership()
  177. {
  178. if(mOwner.isNull() && mGroup.notNull())
  179. {
  180. mIsGroupOwned = true;
  181. }
  182. else
  183. {
  184. mIsGroupOwned = false;
  185. }
  186. }
  187. // Allow accumulation of permissions. Results in the tightest
  188. // permissions possible. In the case of clashing UUIDs, it sets the ID
  189. // to LLUUID::null.
  190. void LLPermissions::accumulate(const LLPermissions& perm)
  191. {
  192. if(perm.mCreator != mCreator)
  193. {
  194. mCreator = LLUUID::null;
  195. }
  196. if(perm.mOwner != mOwner)
  197. {
  198. mOwner = LLUUID::null;
  199. }
  200. if(perm.mLastOwner != mLastOwner)
  201. {
  202. mLastOwner = LLUUID::null;
  203. }
  204. if(perm.mGroup != mGroup)
  205. {
  206. mGroup = LLUUID::null;
  207. }
  208. mMaskBase &= perm.mMaskBase;
  209. mMaskOwner &= perm.mMaskOwner;
  210. mMaskGroup &= perm.mMaskGroup;
  211. mMaskEveryone &= perm.mMaskEveryone;
  212. mMaskNextOwner &= perm.mMaskNextOwner;
  213. fix();
  214. }
  215. // saves last owner, sets current owner, and sets the group.  note
  216. // that this function has to more cleverly apply the fair use
  217. // permissions.
  218. BOOL LLPermissions::setOwnerAndGroup(
  219. const LLUUID& agent,
  220. const LLUUID& owner,
  221. const LLUUID& group,
  222. bool is_atomic)
  223. {
  224. BOOL allowed = FALSE;
  225. if( agent.isNull() || mOwner.isNull()
  226.    || ((agent == mOwner) && ((owner == mOwner) || (mMaskOwner & PERM_TRANSFER)) ) )
  227. {
  228. // ...system can alway set owner
  229. // ...public objects can be claimed by anyone
  230. // ...otherwise, agent must own it and have transfer ability
  231. allowed = TRUE;
  232. }
  233. if (allowed)
  234. {
  235. if(mLastOwner.isNull() || (!mOwner.isNull() && (owner != mLastOwner)))
  236. {
  237. mLastOwner = mOwner;
  238. }
  239. if((mOwner != owner)
  240.    || (mOwner.isNull() && owner.isNull() && (mGroup != group)))
  241. {
  242. mMaskBase = mMaskNextOwner;
  243. mOwner = owner;
  244. // this is a selective use of fair use for atomic
  245. // permissions.
  246. if(is_atomic && !(mMaskBase & PERM_COPY))
  247. {
  248. mMaskBase |= PERM_TRANSFER;
  249. }
  250. }
  251. mGroup = group;
  252. fixOwnership();
  253. // if it's not atomic and we fix fair use, it blows away
  254. //objects as inventory items which have different permissions
  255. //than it's contents. :(
  256. // fixFairUse();
  257. mMaskBase |= PERM_MOVE;
  258. if(mMaskNextOwner != PERM_NONE) mMaskNextOwner |= PERM_MOVE;
  259. fix();
  260. }
  261. return allowed;
  262. }
  263. //Fix for DEV-33917, last owner isn't used much and has little impact on
  264. //permissions so it's reasonably safe to do this, however, for now, 
  265. //limiting the functionality of this routine to objects which are 
  266. //group owned.
  267. void LLPermissions::setLastOwner(const LLUUID& last_owner)
  268. {
  269. if (isGroupOwned())
  270. mLastOwner = last_owner;
  271. }
  272.  
  273. // only call this if you know what you're doing
  274. // there are usually perm-bit consequences when the 
  275. // ownerhsip changes
  276. void LLPermissions::yesReallySetOwner(const LLUUID& owner, bool group_owned)
  277. {
  278. mOwner = owner;
  279. mIsGroupOwned = group_owned;
  280. }
  281. BOOL LLPermissions::deedToGroup(const LLUUID& agent, const LLUUID& group)
  282. {
  283. if(group.notNull() && (agent.isNull() || ((group == mGroup)
  284.   && (mMaskOwner & PERM_TRANSFER)
  285.   && (mMaskGroup & PERM_MOVE))))
  286. {
  287. if(mOwner.notNull())
  288. {
  289. mLastOwner = mOwner;
  290. mOwner.setNull();
  291. }
  292. mMaskBase = mMaskNextOwner;
  293. mMaskGroup = PERM_NONE;
  294. mGroup = group;
  295. mIsGroupOwned = true;
  296. fixFairUse();
  297. fix();
  298. return TRUE;
  299. }
  300. return FALSE;
  301. }
  302. BOOL LLPermissions::setBaseBits(const LLUUID& agent, BOOL set, PermissionMask bits)
  303. {
  304. BOOL ownership = FALSE;
  305. if(agent.isNull())
  306. {
  307. // only the system is always allowed to change base bits
  308. ownership = TRUE;
  309. }
  310. if (ownership)
  311. {
  312. if (set)
  313. {
  314. mMaskBase |= bits; // turn on bits
  315. }
  316. else
  317. {
  318. mMaskBase &= ~bits; // turn off bits
  319. }
  320. fix();
  321. }
  322. return ownership;
  323. }
  324. // Note: If you attempt to set bits that the base bits doesn't allow,
  325. // the function will succeed, but those bits will not be set.
  326. BOOL LLPermissions::setOwnerBits(const LLUUID& agent, BOOL set, PermissionMask bits)
  327. {
  328. BOOL ownership = FALSE;
  329. if(agent.isNull())
  330. {
  331. // ...system always allowed to change things
  332. ownership = TRUE;
  333. }
  334. else if (agent == mOwner)
  335. {
  336. // ...owner bits can only be set by owner
  337. ownership = TRUE;
  338. }
  339. // If we have correct ownership and 
  340. if (ownership)
  341. {
  342. if (set)
  343. {
  344. mMaskOwner |= bits; // turn on bits
  345. }
  346. else
  347. {
  348. mMaskOwner &= ~bits; // turn off bits
  349. }
  350. fix();
  351. }
  352. return (ownership);
  353. }
  354. BOOL LLPermissions::setGroupBits(const LLUUID& agent, const LLUUID& group, BOOL set, PermissionMask bits)
  355. {
  356. BOOL ownership = FALSE;
  357. if((agent.isNull()) || (agent == mOwner)
  358.    || ((group == mGroup) && (!mGroup.isNull())))
  359. {
  360. // The group bits can be set by the system, the owner, or a
  361. // group member.
  362. ownership = TRUE;
  363. }
  364. if (ownership)
  365. {
  366. if (set)
  367. {
  368. mMaskGroup |= bits;
  369. }
  370. else
  371. {
  372. mMaskGroup &= ~bits;
  373. }
  374. fix();
  375. }
  376. return ownership;
  377. }
  378. // Note: If you attempt to set bits that the creator or owner doesn't allow,
  379. // the function will succeed, but those bits will not be set.
  380. BOOL LLPermissions::setEveryoneBits(const LLUUID& agent, const LLUUID& group, BOOL set, PermissionMask bits)
  381. {
  382. BOOL ownership = FALSE;
  383. if((agent.isNull()) || (agent == mOwner)
  384.    || ((group == mGroup) && (!mGroup.isNull())))
  385. {
  386. // The everyone bits can be set by the system, the owner, or a
  387. // group member.
  388. ownership = TRUE;
  389. }
  390. if (ownership)
  391. {
  392. if (set)
  393. {
  394. mMaskEveryone |= bits;
  395. }
  396. else
  397. {
  398. mMaskEveryone &= ~bits;
  399. }
  400. // Fix hierarchy of permissions
  401. fix();
  402. }
  403. return ownership;
  404. }
  405. // Note: If you attempt to set bits that the creator or owner doesn't allow,
  406. // the function will succeed, but those bits will not be set.
  407. BOOL LLPermissions::setNextOwnerBits(const LLUUID& agent, const LLUUID& group, BOOL set, PermissionMask bits)
  408. {
  409. BOOL ownership = FALSE;
  410. if((agent.isNull()) || (agent == mOwner)
  411.    || ((group == mGroup) && (!mGroup.isNull())))
  412. {
  413. // The next owner bits can be set by the system, the owner, or
  414. // a group member.
  415. ownership = TRUE;
  416. }
  417. if (ownership)
  418. {
  419. if (set)
  420. {
  421. mMaskNextOwner |= bits;
  422. }
  423. else
  424. {
  425. mMaskNextOwner &= ~bits;
  426. }
  427. // Fix-up permissions
  428. if(!(mMaskNextOwner & PERM_COPY))
  429. {
  430. mMaskNextOwner |= PERM_TRANSFER;
  431. }
  432. fix();
  433. }
  434. return ownership;
  435. }
  436. BOOL LLPermissions::allowOperationBy(PermissionBit op, const LLUUID& requester, const LLUUID& group) const
  437. {
  438. if(requester.isNull())
  439. {
  440. // ...system making request
  441. // ...not owned
  442. return TRUE;
  443. }
  444. else if (mIsGroupOwned && (mGroup == requester))
  445. {
  446. // group checking ownership permissions
  447. return (mMaskOwner & op);
  448. }
  449. else if (!mIsGroupOwned && (mOwner == requester))
  450. {
  451. // ...owner making request
  452. return (mMaskOwner & op);
  453. }
  454. else if(mGroup.notNull() && (mGroup == group))
  455. {
  456. // group member making request
  457. return ((mMaskGroup & op) || (mMaskEveryone & op));
  458. }
  459. return (mMaskEveryone & op);
  460. }
  461. //
  462. // LLSD support for HTTP messages.
  463. //
  464. LLSD LLPermissions::packMessage() const
  465. {
  466. LLSD result;
  467. result["creator-id"] = mCreator;
  468. result["owner-id"] = mOwner;
  469. result["group-id"] = mGroup;
  470. result["base-mask"] = (S32)mMaskBase;
  471. result["owner-mask"] = (S32)mMaskOwner;
  472. result["group-mask"] = (S32)mMaskGroup;
  473. result["everyone-mask"] = (S32)mMaskEveryone;
  474. result["next-owner-mask"]= (S32)mMaskNextOwner;
  475. result["group-owned"] = (BOOL)mIsGroupOwned;
  476. return result;
  477. }
  478. //
  479. // Messaging support
  480. //
  481. void LLPermissions::packMessage(LLMessageSystem* msg) const
  482. {
  483. msg->addUUIDFast(_PREHASH_CreatorID, mCreator);
  484. msg->addUUIDFast(_PREHASH_OwnerID, mOwner);
  485. msg->addUUIDFast(_PREHASH_GroupID, mGroup);
  486. msg->addU32Fast(_PREHASH_BaseMask, mMaskBase );
  487. msg->addU32Fast(_PREHASH_OwnerMask, mMaskOwner );
  488. msg->addU32Fast(_PREHASH_GroupMask, mMaskGroup );
  489. msg->addU32Fast(_PREHASH_EveryoneMask, mMaskEveryone );
  490. msg->addU32Fast(_PREHASH_NextOwnerMask, mMaskNextOwner );
  491. msg->addBOOLFast(_PREHASH_GroupOwned, (BOOL)mIsGroupOwned);
  492. }
  493. void LLPermissions::unpackMessage(LLSD perms)
  494. {
  495. mCreator = perms["creator-id"];
  496. mOwner = perms["owner-id"];
  497. mGroup = perms["group-id"];
  498. mMaskBase = (U32)perms["base-mask"].asInteger();
  499. mMaskOwner = (U32)perms["owner-mask"].asInteger();
  500. mMaskGroup = (U32)perms["group-mask"].asInteger();
  501. mMaskEveryone = (U32)perms["everyone-mask"].asInteger();
  502. mMaskNextOwner = (U32)perms["next-owner-mask"].asInteger();
  503. mIsGroupOwned = perms["group-owned"].asBoolean();
  504. }
  505. void LLPermissions::unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num)
  506. {
  507. msg->getUUIDFast(block, _PREHASH_CreatorID, mCreator, block_num);
  508. msg->getUUIDFast(block, _PREHASH_OwnerID, mOwner, block_num);
  509. msg->getUUIDFast(block, _PREHASH_GroupID, mGroup, block_num);
  510. msg->getU32Fast(block, _PREHASH_BaseMask, mMaskBase, block_num );
  511. msg->getU32Fast(block, _PREHASH_OwnerMask, mMaskOwner, block_num );
  512. msg->getU32Fast(block, _PREHASH_GroupMask, mMaskGroup, block_num );
  513. msg->getU32Fast(block, _PREHASH_EveryoneMask, mMaskEveryone, block_num );
  514. msg->getU32Fast(block, _PREHASH_NextOwnerMask, mMaskNextOwner, block_num );
  515. BOOL tmp;
  516. msg->getBOOLFast(block, _PREHASH_GroupOwned, tmp, block_num);
  517. mIsGroupOwned = (bool)tmp;
  518. }
  519. //
  520. // File support
  521. //
  522. BOOL LLPermissions::importFile(LLFILE* fp)
  523. {
  524. init(LLUUID::null, LLUUID::null, LLUUID::null, LLUUID::null);
  525. const S32 BUFSIZE = 16384;
  526. // *NOTE: Changing the buffer size will require changing the scanf
  527. // calls below.
  528. char buffer[BUFSIZE]; /* Flawfinder: ignore */
  529. char keyword[256]; /* Flawfinder: ignore */
  530. char valuestr[256]; /* Flawfinder: ignore */
  531. char uuid_str[256]; /* Flawfinder: ignore */
  532. U32 mask;
  533. keyword[0]  = '';
  534. valuestr[0] = '';
  535. while (!feof(fp))
  536. {
  537. if (fgets(buffer, BUFSIZE, fp) == NULL)
  538. {
  539. buffer[0] = '';
  540. }
  541. sscanf( /* Flawfinder: ignore */
  542. buffer,
  543. " %255s %255s",
  544. keyword, valuestr);
  545. if (!strcmp("{", keyword))
  546. {
  547. continue;
  548. }
  549. if (!strcmp("}",keyword))
  550. {
  551. break;
  552. }
  553. else if (!strcmp("creator_mask", keyword))
  554. {
  555. // legacy support for "creator" masks
  556. sscanf(valuestr, "%x", &mask);
  557. mMaskBase = mask;
  558. fixFairUse();
  559. }
  560. else if (!strcmp("base_mask", keyword))
  561. {
  562. sscanf(valuestr, "%x", &mask);
  563. mMaskBase = mask;
  564. //fixFairUse();
  565. }
  566. else if (!strcmp("owner_mask", keyword))
  567. {
  568. sscanf(valuestr, "%x", &mask);
  569. mMaskOwner = mask;
  570. }
  571. else if (!strcmp("group_mask", keyword))
  572. {
  573. sscanf(valuestr, "%x", &mask);
  574. mMaskGroup = mask;
  575. }
  576. else if (!strcmp("everyone_mask", keyword))
  577. {
  578. sscanf(valuestr, "%x", &mask);
  579. mMaskEveryone = mask;
  580. }
  581. else if (!strcmp("next_owner_mask", keyword))
  582. {
  583. sscanf(valuestr, "%x", &mask);
  584. mMaskNextOwner = mask;
  585. }
  586. else if (!strcmp("creator_id", keyword))
  587. {
  588. sscanf(valuestr, "%255s", uuid_str); /* Flawfinder: ignore */
  589. mCreator.set(uuid_str);
  590. }
  591. else if (!strcmp("owner_id", keyword))
  592. {
  593. sscanf(valuestr, "%255s", uuid_str); /* Flawfinder: ignore */
  594. mOwner.set(uuid_str);
  595. }
  596. else if (!strcmp("last_owner_id", keyword))
  597. {
  598. sscanf(valuestr, "%255s", uuid_str); /* Flawfinder: ignore */
  599. mLastOwner.set(uuid_str);
  600. }
  601. else if (!strcmp("group_id", keyword))
  602. {
  603. sscanf(valuestr, "%255s", uuid_str); /* Flawfinder: ignore */
  604. mGroup.set(uuid_str);
  605. }
  606. else if (!strcmp("group_owned", keyword))
  607. {
  608. sscanf(valuestr, "%d", &mask);
  609. if(mask) mIsGroupOwned = true;
  610. else mIsGroupOwned = false;
  611. }
  612. else
  613. {
  614. llinfos << "unknown keyword " << keyword << " in permissions import" << llendl;
  615. }
  616. }
  617. fix();
  618. return TRUE;
  619. }
  620. BOOL LLPermissions::exportFile(LLFILE* fp) const
  621. {
  622. std::string uuid_str;
  623. fprintf(fp, "tpermissions 0n");
  624. fprintf(fp, "t{n");
  625. fprintf(fp, "ttbase_maskt%08xn", mMaskBase);
  626. fprintf(fp, "ttowner_maskt%08xn", mMaskOwner);
  627. fprintf(fp, "ttgroup_maskt%08xn", mMaskGroup);
  628. fprintf(fp, "tteveryone_maskt%08xn", mMaskEveryone);
  629. fprintf(fp, "ttnext_owner_maskt%08xn", mMaskNextOwner);
  630. mCreator.toString(uuid_str);
  631. fprintf(fp, "ttcreator_idt%sn", uuid_str.c_str());
  632. mOwner.toString(uuid_str);
  633. fprintf(fp, "ttowner_idt%sn", uuid_str.c_str());
  634. mLastOwner.toString(uuid_str);
  635. fprintf(fp, "ttlast_owner_idt%sn", uuid_str.c_str());
  636. mGroup.toString(uuid_str);
  637. fprintf(fp, "ttgroup_idt%sn", uuid_str.c_str());
  638. if(mIsGroupOwned)
  639. {
  640. fprintf(fp, "ttgroup_ownedt1n");
  641. }
  642. fprintf(fp,"t}n");
  643. return TRUE;
  644. }
  645. BOOL LLPermissions::importLegacyStream(std::istream& input_stream)
  646. {
  647. init(LLUUID::null, LLUUID::null, LLUUID::null, LLUUID::null);
  648. const S32 BUFSIZE = 16384;
  649. // *NOTE: Changing the buffer size will require changing the scanf
  650. // calls below.
  651. char buffer[BUFSIZE]; /* Flawfinder: ignore */
  652. char keyword[256]; /* Flawfinder: ignore */
  653. char valuestr[256]; /* Flawfinder: ignore */
  654. char uuid_str[256]; /* Flawfinder: ignore */
  655. U32 mask;
  656. keyword[0]  = '';
  657. valuestr[0] = '';
  658. while (input_stream.good())
  659. {
  660. input_stream.getline(buffer, BUFSIZE);
  661. sscanf( /* Flawfinder: ignore */
  662. buffer,
  663. " %255s %255s",
  664. keyword, valuestr);
  665. if (!strcmp("{", keyword))
  666. {
  667. continue;
  668. }
  669. if (!strcmp("}",keyword))
  670. {
  671. break;
  672. }
  673. else if (!strcmp("creator_mask", keyword))
  674. {
  675. // legacy support for "creator" masks
  676. sscanf(valuestr, "%x", &mask);
  677. mMaskBase = mask;
  678. fixFairUse();
  679. }
  680. else if (!strcmp("base_mask", keyword))
  681. {
  682. sscanf(valuestr, "%x", &mask);
  683. mMaskBase = mask;
  684. //fixFairUse();
  685. }
  686. else if (!strcmp("owner_mask", keyword))
  687. {
  688. sscanf(valuestr, "%x", &mask);
  689. mMaskOwner = mask;
  690. }
  691. else if (!strcmp("group_mask", keyword))
  692. {
  693. sscanf(valuestr, "%x", &mask);
  694. mMaskGroup = mask;
  695. }
  696. else if (!strcmp("everyone_mask", keyword))
  697. {
  698. sscanf(valuestr, "%x", &mask);
  699. mMaskEveryone = mask;
  700. }
  701. else if (!strcmp("next_owner_mask", keyword))
  702. {
  703. sscanf(valuestr, "%x", &mask);
  704. mMaskNextOwner = mask;
  705. }
  706. else if (!strcmp("creator_id", keyword))
  707. {
  708. sscanf(valuestr, "%255s", uuid_str); /* Flawfinder: ignore */
  709. mCreator.set(uuid_str);
  710. }
  711. else if (!strcmp("owner_id", keyword))
  712. {
  713. sscanf(valuestr, "%255s", uuid_str); /* Flawfinder: ignore */
  714. mOwner.set(uuid_str);
  715. }
  716. else if (!strcmp("last_owner_id", keyword))
  717. {
  718. sscanf(valuestr, "%255s", uuid_str); /* Flawfinder: ignore */
  719. mLastOwner.set(uuid_str);
  720. }
  721. else if (!strcmp("group_id", keyword))
  722. {
  723. sscanf(valuestr, "%255s", uuid_str); /* Flawfinder: ignore */
  724. mGroup.set(uuid_str);
  725. }
  726. else if (!strcmp("group_owned", keyword))
  727. {
  728. sscanf(valuestr, "%d", &mask);
  729. if(mask) mIsGroupOwned = true;
  730. else mIsGroupOwned = false;
  731. }
  732. else
  733. {
  734. llinfos << "unknown keyword " << keyword << " in permissions import" << llendl;
  735. }
  736. }
  737. fix();
  738. return TRUE;
  739. }
  740. BOOL LLPermissions::exportLegacyStream(std::ostream& output_stream) const
  741. {
  742. std::string uuid_str;
  743. output_stream <<  "tpermissions 0n";
  744. output_stream <<  "t{n";
  745. std::string buffer;
  746. buffer = llformat( "ttbase_maskt%08xn", mMaskBase);
  747. output_stream << buffer;
  748. buffer = llformat( "ttowner_maskt%08xn", mMaskOwner);
  749. output_stream << buffer;
  750. buffer = llformat( "ttgroup_maskt%08xn", mMaskGroup);
  751. output_stream << buffer;
  752. buffer = llformat( "tteveryone_maskt%08xn", mMaskEveryone);
  753. output_stream << buffer;
  754. buffer = llformat( "ttnext_owner_maskt%08xn", mMaskNextOwner);
  755. output_stream << buffer;
  756. mCreator.toString(uuid_str);
  757. output_stream <<  "ttcreator_idt" << uuid_str << "n";
  758. mOwner.toString(uuid_str);
  759. output_stream <<  "ttowner_idt" << uuid_str << "n";
  760. mLastOwner.toString(uuid_str);
  761. output_stream <<  "ttlast_owner_idt" << uuid_str << "n";
  762. mGroup.toString(uuid_str);
  763. output_stream <<  "ttgroup_idt" << uuid_str << "n";
  764. if(mIsGroupOwned)
  765. {
  766. output_stream <<  "ttgroup_ownedt1n";
  767. }
  768. output_stream << "t}n";
  769. return TRUE;
  770. }
  771. // Deleted LLPermissions::exportFileXML() and LLPermissions::importXML()
  772. // because I can't find any non-test code references to it. 2009-05-04 JC
  773. bool LLPermissions::operator==(const LLPermissions &rhs) const
  774. {   
  775. return 
  776. (mCreator == rhs.mCreator) &&
  777. (mOwner == rhs.mOwner) &&
  778. (mLastOwner == rhs.mLastOwner ) &&
  779. (mGroup == rhs.mGroup ) &&
  780. (mMaskBase == rhs.mMaskBase ) &&
  781. (mMaskOwner == rhs.mMaskOwner ) &&
  782. (mMaskGroup == rhs.mMaskGroup ) &&
  783. (mMaskEveryone == rhs.mMaskEveryone ) &&
  784. (mMaskNextOwner == rhs.mMaskNextOwner ) &&
  785. (mIsGroupOwned == rhs.mIsGroupOwned);
  786. }
  787. bool LLPermissions::operator!=(const LLPermissions &rhs) const
  788. {   
  789. return 
  790. (mCreator != rhs.mCreator) ||
  791. (mOwner != rhs.mOwner) ||
  792. (mLastOwner != rhs.mLastOwner ) ||
  793. (mGroup != rhs.mGroup ) ||
  794. (mMaskBase != rhs.mMaskBase ) ||
  795. (mMaskOwner != rhs.mMaskOwner ) ||
  796. (mMaskGroup != rhs.mMaskGroup ) ||
  797. (mMaskEveryone != rhs.mMaskEveryone ) ||
  798. (mMaskNextOwner != rhs.mMaskNextOwner) ||
  799. (mIsGroupOwned != rhs.mIsGroupOwned);
  800. }
  801. std::ostream& operator<<(std::ostream &s, const LLPermissions &perm)
  802. {
  803. s << "{Creator="  << perm.getCreator();
  804. s << ", Owner="  << perm.getOwner();
  805. s << ", Group="  << perm.getGroup();
  806. s << std::hex << ", BaseMask=0x" << perm.getMaskBase();
  807. s << ", OwnerMask=0x" << perm.getMaskOwner();
  808. s << ", EveryoneMask=0x" << perm.getMaskEveryone();
  809. s << ", GroupMask=0x" << perm.getMaskGroup();
  810. s << ", NextOwnerMask=0x" << perm.getMaskNextOwner() << std::dec;
  811. s << "}";
  812. return s;
  813. }
  814. template <>
  815. void LLMetaClassT<LLPermissions>::reflectProperties(LLMetaClass& meta_class)
  816. {
  817. reflectProperty(meta_class, "mCreator", &LLPermissions::mCreator);
  818. reflectProperty(meta_class, "mOwner", &LLPermissions::mOwner);
  819. reflectProperty(meta_class, "mGroup", &LLPermissions::mGroup);
  820. reflectProperty(meta_class, "mIsGroupOwned", &LLPermissions::mIsGroupOwned);
  821. }
  822. // virtual
  823. const LLMetaClass& LLPermissions::getMetaClass() const
  824. {
  825. return LLMetaClassT<LLPermissions>::instance();
  826. }
  827. ///----------------------------------------------------------------------------
  828. /// Class LLAggregatePermissions
  829. ///----------------------------------------------------------------------------
  830. const LLAggregatePermissions LLAggregatePermissions::empty;
  831. LLAggregatePermissions::LLAggregatePermissions()
  832. {
  833. for(S32 i = 0; i < PI_COUNT; ++i)
  834. {
  835. mBits[i] = AP_EMPTY;
  836. }
  837. }
  838. LLAggregatePermissions::EValue LLAggregatePermissions::getValue(PermissionBit bit) const
  839. {
  840. EPermIndex idx = perm2PermIndex(bit);
  841. EValue rv = AP_EMPTY;
  842. if(idx != PI_END)
  843. {
  844. rv = (LLAggregatePermissions::EValue)(mBits[idx]);
  845. }
  846. return rv;
  847. }
  848. // returns the bits compressed into a single byte: 00TTMMCC
  849. // where TT = transfer, MM = modify, and CC = copy
  850. // LSB is to the right
  851. U8 LLAggregatePermissions::getU8() const
  852. {
  853. U8 byte = mBits[PI_TRANSFER];
  854. byte <<= 2;
  855. byte |= mBits[PI_MODIFY];
  856. byte <<= 2;
  857. byte |= mBits[PI_COPY];
  858. return byte;
  859. }
  860. BOOL LLAggregatePermissions::isEmpty() const
  861. {
  862. for(S32 i = 0; i < PI_END; ++i)
  863. {
  864. if(mBits[i] != AP_EMPTY)
  865. {
  866. return FALSE;
  867. }
  868. }
  869. return TRUE;
  870. }
  871. void LLAggregatePermissions::aggregate(PermissionMask mask)
  872. {
  873. BOOL is_allowed = mask & PERM_COPY;
  874. aggregateBit(PI_COPY, is_allowed);
  875. is_allowed = mask & PERM_MODIFY;
  876. aggregateBit(PI_MODIFY, is_allowed);
  877. is_allowed = mask & PERM_TRANSFER;
  878. aggregateBit(PI_TRANSFER, is_allowed);
  879. }
  880. void LLAggregatePermissions::aggregate(const LLAggregatePermissions& ag)
  881. {
  882. for(S32 idx = PI_COPY; idx != PI_END; ++idx)
  883. {
  884. aggregateIndex((EPermIndex)idx, ag.mBits[idx]);
  885. }
  886. }
  887. void LLAggregatePermissions::aggregateBit(EPermIndex idx, BOOL allowed)
  888. {
  889. //if(AP_SOME == mBits[idx]) return; // P4 branch prediction optimization
  890. switch(mBits[idx])
  891. {
  892. case AP_EMPTY:
  893. mBits[idx] = allowed ? AP_ALL : AP_NONE;
  894. break;
  895. case AP_NONE:
  896. mBits[idx] = allowed ? AP_SOME: AP_NONE;
  897. break;
  898. case AP_SOME:
  899. // no-op
  900. break;
  901. case AP_ALL:
  902. mBits[idx] = allowed ? AP_ALL : AP_SOME;
  903. break;
  904. default:
  905. llwarns << "Bad aggregateBit " << (S32)idx << " "
  906. << (allowed ? "true" : "false") << llendl;
  907. break;
  908. }
  909. }
  910. void LLAggregatePermissions::aggregateIndex(EPermIndex idx, U8 bits)
  911. {
  912. switch(mBits[idx])
  913. {
  914. case AP_EMPTY:
  915. mBits[idx] = bits;
  916. break;
  917. case AP_NONE:
  918. switch(bits)
  919. {
  920. case AP_SOME:
  921. case AP_ALL:
  922. mBits[idx] = AP_SOME;
  923. break;
  924. case AP_EMPTY:
  925. case AP_NONE:
  926. default:
  927. // no-op
  928. break;
  929. }
  930. break;
  931. case AP_SOME:
  932. // no-op
  933. break;
  934. case AP_ALL:
  935. switch(bits)
  936. {
  937. case AP_NONE:
  938. case AP_SOME:
  939. mBits[idx] = AP_SOME;
  940. break;
  941. case AP_EMPTY:
  942. case AP_ALL:
  943. default:
  944. // no-op
  945. break;
  946. }
  947. break;
  948. default:
  949. llwarns << "Bad aggregate index " << (S32)idx << " "
  950. <<  (S32)bits << llendl;
  951. break;
  952. }
  953. }
  954. // static
  955. LLAggregatePermissions::EPermIndex LLAggregatePermissions::perm2PermIndex(PermissionBit bit)
  956. {
  957. EPermIndex idx = PI_END; // past any good value.
  958. switch(bit)
  959. {
  960. case PERM_COPY:
  961. idx = PI_COPY;
  962. break;
  963. case PERM_MODIFY:
  964. idx = PI_MODIFY;
  965. break;
  966. case PERM_TRANSFER:
  967. idx = PI_TRANSFER;
  968. break;
  969. default:
  970. break;
  971. }
  972. return idx;
  973. }
  974. void LLAggregatePermissions::packMessage(LLMessageSystem* msg, const char* field) const
  975. {
  976. msg->addU8Fast(field, getU8());
  977. }
  978. void LLAggregatePermissions::unpackMessage(LLMessageSystem* msg, const char* block, const char* field, S32 block_num)
  979. {
  980. const U8 TWO_BITS = 0x3; // binary 00000011
  981. U8 bits = 0;
  982. msg->getU8Fast(block, field, bits, block_num);
  983. mBits[PI_COPY] = bits & TWO_BITS;
  984. bits >>= 2;
  985. mBits[PI_MODIFY] = bits & TWO_BITS;
  986. bits >>= 2;
  987. mBits[PI_TRANSFER] = bits & TWO_BITS;
  988. }
  989. const std::string AGGREGATE_VALUES[4] =
  990. {
  991. std::string( "Empty" ),
  992. std::string( "None" ),
  993. std::string( "Some" ),
  994. std::string( "All" )
  995. };
  996. std::ostream& operator<<(std::ostream &s, const LLAggregatePermissions &perm)
  997. {
  998. s << "{PI_COPY=" << AGGREGATE_VALUES[perm.mBits[LLAggregatePermissions::PI_COPY]];
  999. s << ", PI_MODIFY=" << AGGREGATE_VALUES[perm.mBits[LLAggregatePermissions::PI_MODIFY]];
  1000. s << ", PI_TRANSFER=" << AGGREGATE_VALUES[perm.mBits[LLAggregatePermissions::PI_TRANSFER]];
  1001. s << "}";
  1002. return s;
  1003. }
  1004. // This converts a permissions mask into a string for debugging use.
  1005. void mask_to_string(U32 mask, char* str)
  1006. {
  1007. if (mask & PERM_MOVE)
  1008. {
  1009. *str = 'V';
  1010. }
  1011. else
  1012. {
  1013. *str = ' ';
  1014. }
  1015. str++;
  1016. if (mask & PERM_MODIFY)
  1017. {
  1018. *str = 'M';
  1019. }
  1020. else
  1021. {
  1022. *str = ' ';
  1023. }
  1024. str++;
  1025. if (mask & PERM_COPY)
  1026. {
  1027. *str = 'C';
  1028. }
  1029. else
  1030. {
  1031. *str = ' ';
  1032. }
  1033. str++;
  1034. if (mask & PERM_TRANSFER)
  1035. {
  1036. *str = 'T';
  1037. }
  1038. else
  1039. {
  1040. *str = ' ';
  1041. }
  1042. str++;
  1043. *str = '';
  1044. }
  1045. std::string mask_to_string(U32 mask)
  1046. {
  1047. char str[16];
  1048. mask_to_string(mask, str);
  1049. return std::string(str);
  1050. }
  1051. ///----------------------------------------------------------------------------
  1052. /// exported functions
  1053. ///----------------------------------------------------------------------------
  1054. static const std::string PERM_CREATOR_ID_LABEL("creator_id");
  1055. static const std::string PERM_OWNER_ID_LABEL("owner_id");
  1056. static const std::string PERM_LAST_OWNER_ID_LABEL("last_owner_id");
  1057. static const std::string PERM_GROUP_ID_LABEL("group_id");
  1058. static const std::string PERM_IS_OWNER_GROUP_LABEL("is_owner_group");
  1059. static const std::string PERM_BASE_MASK_LABEL("base_mask");
  1060. static const std::string PERM_OWNER_MASK_LABEL("owner_mask");
  1061. static const std::string PERM_GROUP_MASK_LABEL("group_mask");
  1062. static const std::string PERM_EVERYONE_MASK_LABEL("everyone_mask");
  1063. static const std::string PERM_NEXT_OWNER_MASK_LABEL("next_owner_mask");
  1064. LLSD ll_create_sd_from_permissions(const LLPermissions& perm)
  1065. {
  1066. LLSD rv;
  1067. rv[PERM_CREATOR_ID_LABEL] = perm.getCreator();
  1068. rv[PERM_OWNER_ID_LABEL] = perm.getOwner();
  1069. rv[PERM_LAST_OWNER_ID_LABEL] = perm.getLastOwner();
  1070. rv[PERM_GROUP_ID_LABEL] = perm.getGroup();
  1071. rv[PERM_IS_OWNER_GROUP_LABEL] = perm.isGroupOwned();
  1072. rv[PERM_BASE_MASK_LABEL] = (S32)perm.getMaskBase();
  1073. rv[PERM_OWNER_MASK_LABEL] = (S32)perm.getMaskOwner();
  1074. rv[PERM_GROUP_MASK_LABEL] = (S32)perm.getMaskGroup();
  1075. rv[PERM_EVERYONE_MASK_LABEL] = (S32)perm.getMaskEveryone();
  1076. rv[PERM_NEXT_OWNER_MASK_LABEL] = (S32)perm.getMaskNextOwner();
  1077. return rv;
  1078. }
  1079. LLPermissions ll_permissions_from_sd(const LLSD& sd_perm)
  1080. {
  1081. LLPermissions rv;
  1082. rv.init(
  1083. sd_perm[PERM_CREATOR_ID_LABEL].asUUID(),
  1084. sd_perm[PERM_OWNER_ID_LABEL].asUUID(),
  1085. sd_perm[PERM_LAST_OWNER_ID_LABEL].asUUID(),
  1086. sd_perm[PERM_GROUP_ID_LABEL].asUUID());
  1087. // We do a cast to U32 here since LLSD does not attempt to
  1088. // represent unsigned ints.
  1089. PermissionMask mask;
  1090. mask = (U32)(sd_perm[PERM_BASE_MASK_LABEL].asInteger());
  1091. rv.setMaskBase(mask);
  1092. mask = (U32)(sd_perm[PERM_OWNER_MASK_LABEL].asInteger());
  1093. rv.setMaskOwner(mask);
  1094. mask = (U32)(sd_perm[PERM_EVERYONE_MASK_LABEL].asInteger());
  1095. rv.setMaskEveryone(mask);
  1096. mask = (U32)(sd_perm[PERM_GROUP_MASK_LABEL].asInteger());
  1097. rv.setMaskGroup(mask);
  1098. mask = (U32)(sd_perm[PERM_NEXT_OWNER_MASK_LABEL].asInteger());
  1099. rv.setMaskNext(mask);
  1100. rv.fix();
  1101. return rv;
  1102. }