Skip to content

Commit 74397d0

Browse files
committed
refactor: fix unbounded regex and add tests
1 parent 9429c8e commit 74397d0

File tree

2 files changed

+50
-9
lines changed

2 files changed

+50
-9
lines changed

stackslib/src/net/api/getclaritymetadata.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
use clarity::vm::clarity::ClarityConnection;
1717
use clarity::vm::database::clarity_db::ContractDataVarName;
1818
use clarity::vm::database::StoreType;
19-
use clarity::vm::representations::{CONTRACT_NAME_REGEX_STRING, STANDARD_PRINCIPAL_REGEX_STRING};
19+
use clarity::vm::representations::{
20+
CONTRACT_NAME_REGEX_STRING, MAX_STRING_LEN, STANDARD_PRINCIPAL_REGEX_STRING,
21+
};
2022
use clarity::vm::types::QualifiedContractIdentifier;
2123
use clarity::vm::ContractName;
2224
use lazy_static::lazy_static;
@@ -35,10 +37,12 @@ use crate::net::httpcore::{
3537
use crate::net::{Error as NetError, StacksNodeState, TipRequest};
3638

3739
lazy_static! {
38-
static ref CLARITY_NAME_NO_BOUNDARIES_REGEX_STRING: String =
39-
"[a-zA-Z]([a-zA-Z0-9]|[-_!?+<>=/*])*|[-+=/*]|[<>]=?".into();
40+
static ref CLARITY_NAME_NO_BOUNDARIES_REGEX_STRING: String = format!(
41+
"([a-zA-Z]([a-zA-Z0-9]|[-_!?+<>=/*])*|[-+=/*]|[<>]=?){{1,{}}}",
42+
MAX_STRING_LEN
43+
);
4044
static ref METADATA_KEY_REGEX_STRING: String = format!(
41-
r"vm-metadata::(?P<data_type>(\d{{1,2}}))::(?P<var_name>(contract|contract-size|contract-src|contract-data-size|({})))",
45+
r"vm-metadata::(?P<data_type>(\d{{1,2}}))::(?P<var_name>(contract|contract-size|contract-src|contract-data-size|{}))",
4246
*CLARITY_NAME_NO_BOUNDARIES_REGEX_STRING,
4347
);
4448
}

stackslib/src/net/api/tests/getclaritymetadata.rs

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515

1616
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
1717

18-
use clarity::vm::types::{QualifiedContractIdentifier, StacksAddressExtensions};
18+
use clarity::vm::database::{ClaritySerializable, DataMapMetadata, DataVariableMetadata};
19+
use clarity::vm::types::{QualifiedContractIdentifier, StacksAddressExtensions, TypeSignature};
1920
use clarity::vm::{ClarityName, ContractName};
21+
use serde_json::json;
2022
use stacks_common::codec::StacksMessageCodec;
2123
use stacks_common::types::chainstate::StacksAddress;
2224
use stacks_common::types::net::PeerHost;
@@ -211,7 +213,7 @@ fn test_try_make_response() {
211213

212214
let mut requests = vec![];
213215

214-
// query existing
216+
// query existing contract size metadata
215217
let request = StacksHttpRequest::new_getclaritymetadata(
216218
addr.into(),
217219
StacksAddress::from_string("ST2DS4MSWSGJ3W9FBC6BVT0Y92S345HY8N3T6AV7R").unwrap(),
@@ -221,16 +223,51 @@ fn test_try_make_response() {
221223
);
222224
requests.push(request);
223225

226+
// query existing data var metadata
227+
let request = StacksHttpRequest::new_getclaritymetadata(
228+
addr.into(),
229+
StacksAddress::from_string("ST2DS4MSWSGJ3W9FBC6BVT0Y92S345HY8N3T6AV7R").unwrap(),
230+
"hello-world".try_into().unwrap(),
231+
"vm-metadata::5::test-map".to_string(),
232+
TipRequest::UseLatestAnchoredTip,
233+
);
234+
requests.push(request);
235+
236+
// query existing data map metadata
237+
let request = StacksHttpRequest::new_getclaritymetadata(
238+
addr.into(),
239+
StacksAddress::from_string("ST2DS4MSWSGJ3W9FBC6BVT0Y92S345HY8N3T6AV7R").unwrap(),
240+
"hello-world".try_into().unwrap(),
241+
"vm-metadata::6::bar".to_string(),
242+
TipRequest::UseLatestAnchoredTip,
243+
);
244+
requests.push(request);
245+
224246
let mut responses = test_rpc(function_name!(), requests);
225247

226-
// latest data
248+
// contract size metadata
227249
let response = responses.remove(0);
228-
229250
assert_eq!(
230251
response.preamble().get_canonical_stacks_tip_height(),
231252
Some(1)
232253
);
233-
234254
let resp = response.decode_clarity_metadata_response().unwrap();
235255
assert_eq!(resp.data, "1432");
256+
257+
// data map metadata
258+
let response = responses.remove(0);
259+
let resp = response.decode_clarity_metadata_response().unwrap();
260+
let expected = DataMapMetadata {
261+
key_type: TypeSignature::UIntType,
262+
value_type: TypeSignature::UIntType,
263+
};
264+
assert_eq!(resp.data, expected.serialize());
265+
266+
// data var metadata
267+
let response = responses.remove(0);
268+
let resp = response.decode_clarity_metadata_response().unwrap();
269+
let expected = DataVariableMetadata {
270+
value_type: TypeSignature::IntType,
271+
};
272+
assert_eq!(resp.data, expected.serialize());
236273
}

0 commit comments

Comments
 (0)