|
11 | 11 | use std::{borrow, error, fmt, io, ops};
|
12 | 12 | use std::str::FromStr;
|
13 | 13 | use bytes::Bytes;
|
| 14 | +use serde::de::Error; |
14 | 15 | use serde::{Deserialize, Serialize};
|
15 | 16 | use crate::crypto::keys::KeyIdentifier;
|
16 | 17 | use crate::resources::addr::{MaxLenPrefix, Prefix};
|
@@ -95,7 +96,19 @@ impl FromStr for SlurmFile {
|
95 | 96 | type Err = serde_json::Error;
|
96 | 97 |
|
97 | 98 | fn from_str(s: &str) -> Result<Self, Self::Err> {
|
98 |
| - serde_json::from_str(s) |
| 99 | + let slurm: Result<SlurmFile, serde_json::Error> = serde_json::from_str(s); |
| 100 | + if let Ok(s) = &slurm { |
| 101 | + if s.version == SlurmVersion::v1() && |
| 102 | + (s.assertions.aspa.is_some() || s.filters.aspa.is_some()) { |
| 103 | + return Err(Self::Err::custom( |
| 104 | + "ASPA field present in SLURM v1")); |
| 105 | + } else if s.version == SlurmVersion::v2() && |
| 106 | + (s.assertions.aspa.is_none() || s.filters.aspa.is_none()) { |
| 107 | + return Err(Self::Err::custom( |
| 108 | + "ASPA field not present in SLURM v2")); |
| 109 | + } |
| 110 | + } |
| 111 | + slurm |
99 | 112 | }
|
100 | 113 | }
|
101 | 114 |
|
@@ -1474,6 +1487,25 @@ mod test {
|
1474 | 1487 | "##
|
1475 | 1488 | ).is_err()
|
1476 | 1489 | );
|
| 1490 | + |
| 1491 | + // wrong SLURM version. |
| 1492 | + assert!( |
| 1493 | + SlurmFile::from_str( |
| 1494 | + r##" |
| 1495 | + { |
| 1496 | + "slurmVersion": 2, |
| 1497 | + "validationOutputFilters": { |
| 1498 | + "prefixFilters": [], |
| 1499 | + "bgpsecFilters": [] |
| 1500 | + }, |
| 1501 | + "locallyAddedAssertions": { |
| 1502 | + "prefixAssertions": [], |
| 1503 | + "bgpsecAssertions": [] |
| 1504 | + } |
| 1505 | + } |
| 1506 | + "## |
| 1507 | + ).is_err() |
| 1508 | + ); |
1477 | 1509 | }
|
1478 | 1510 | }
|
1479 | 1511 |
|
0 commit comments