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