reorder policy validation logic, guarantee only Replace policy ToScript is checked
This commit is contained in:
20
src/main.rs
20
src/main.rs
@@ -615,9 +615,16 @@ async fn repair(config:RepairConfig)->Result<(),RepairError>{
|
||||
|
||||
for policy in &policies{
|
||||
let from_script=script_from_hash.get(policy.FromScriptHash.as_str());
|
||||
|
||||
if let Some(&from_script)=from_script{
|
||||
if policy.Policy==Policy::Replace&&policy.ToScriptID==from_script.ID{
|
||||
// if not unique
|
||||
if let Some(old_policy)=policy_from_hash.insert(policy.FromScriptHash.as_str(),policy){
|
||||
println!("Policy is not unique! hash={} {:?} {:?}",policy.FromScriptHash,policy.ID,old_policy.ID);
|
||||
policies_not_unique.push(submissions_api::types::GetScriptPolicyRequest{
|
||||
ScriptPolicyID:policy.ID,
|
||||
});
|
||||
}else if policy.Policy==Policy::Replace{
|
||||
// validate replace policies
|
||||
if policy.ToScriptID==from_script.ID{
|
||||
// invalid policy. Reset the policy to None
|
||||
println!("Invalid policy {:?}, queueing update...",policy.ID);
|
||||
update_policies.push(submissions_api::types::UpdateScriptPolicyRequest{
|
||||
@@ -627,14 +634,7 @@ async fn repair(config:RepairConfig)->Result<(),RepairError>{
|
||||
Policy:Some(Policy::None),
|
||||
});
|
||||
}else{
|
||||
// if not unique
|
||||
if let Some(old_policy)=policy_from_hash.insert(policy.FromScriptHash.as_str(),policy){
|
||||
println!("Policy is not unique! hash={} {:?} {:?}",policy.FromScriptHash,policy.ID,old_policy.ID);
|
||||
policies_not_unique.push(submissions_api::types::GetScriptPolicyRequest{
|
||||
ScriptPolicyID:policy.ID,
|
||||
});
|
||||
}else{
|
||||
// if policy is replace, but destination script is not allowed
|
||||
// destination script must exist and be allowed
|
||||
if let Some(&to_script)=script_from_id.get(&policy.ToScriptID){
|
||||
check_policy_exists.push((policy,to_script));
|
||||
}else{
|
||||
|
||||
Reference in New Issue
Block a user