git.delta.rocks / unique-network / refs/commits / edfed085aa44

difftreelog

CORE-346 Fix tokenURI permissions checks

Trubnikov Sergey2022-05-27parent: #fdc1b22.patch.diff
in: master

2 files changed

modifiedpallets/nonfungible/src/erc.rsdiffbeforeafterboth
162 #[solidity(rename_selector = "tokenURI")]162 #[solidity(rename_selector = "tokenURI")]
163 fn token_uri(&self, token_id: uint256) -> Result<string> {163 fn token_uri(&self, token_id: uint256) -> Result<string> {
164 let key = pallet_common::eth::KEY_TOKEN_URI.clone();164 let key = pallet_common::eth::KEY_TOKEN_URI.clone();
165 let permission = get_token_permission::<T>(self.id, &key)?;
166 if !permission.collection_admin {165 if !has_token_permission::<T>(self.id, &key) {
167 return Err("Operation is not allowed".into());166 return Err("No tokenURI permission".into());
168 }167 }
169168
170 self.consume_store_reads(1)?;169 self.consume_store_reads(1)?;
423 let a = token_property_permissions422 let a = token_property_permissions
424 .get(key)423 .get(key)
425 .map(|p| p.clone())424 .map(|p| p.clone())
426 .ok_or_else(|| Error::Revert("No permission for tokenURI".into()))?;425 .ok_or_else(|| Error::Revert("No permission".into()))?;
427 Ok(a)426 Ok(a)
428}427}
428
429fn has_token_permission<T: Config>(
430 collection_id: CollectionId,
431 key: &PropertyKey,
432) -> bool {
433 if let Ok(token_property_permissions) = CollectionPropertyPermissions::<T>::try_get(collection_id) {
434 return token_property_permissions.contains_key(key);
435 }
436
437 false
438}
429439
430#[solidity_interface(name = "ERC721UniqueExtensions")]440#[solidity_interface(name = "ERC721UniqueExtensions")]
431impl<T: Config> NonfungibleHandle<T> {441impl<T: Config> NonfungibleHandle<T> {
modifiedprimitives/data-structs/src/lib.rsdiffbeforeafterboth
--- a/primitives/data-structs/src/lib.rs
+++ b/primitives/data-structs/src/lib.rs
@@ -761,6 +761,10 @@
 		self.0.get(key)
 	}
 
+	pub fn contains_key(&self, key: &PropertyKey) -> bool {
+		self.0.contains_key(key)
+	}
+
 	fn check_property_key(key: &PropertyKey) -> Result<(), PropertiesError> {
 		if key.is_empty() {
 			return Err(PropertiesError::EmptyPropertyKey);