@@ -10,6 +10,14 @@ use crate::Result;
10
10
11
11
const SPEC_VERSION : & str = "1.0" ;
12
12
13
+ // Ensure the given spec version matches our spec version.
14
+ //
15
+ // We also need to handle the literal "1.0" here, despite that fact that it is not a valid version
16
+ // according to the SemVer spec, because it is already baked into some of the old roots.
17
+ fn valid_spec_version ( other : & str ) -> bool {
18
+ matches ! ( other, "1.0" | "1.0.0" )
19
+ }
20
+
13
21
fn parse_datetime ( ts : & str ) -> Result < DateTime < Utc > > {
14
22
DateTime :: parse_from_rfc3339 ( ts)
15
23
. map ( |ts| ts. with_timezone ( & Utc ) )
@@ -71,7 +79,7 @@ impl RootMetadata {
71
79
) ) ) ;
72
80
}
73
81
74
- if self . spec_version != SPEC_VERSION {
82
+ if ! valid_spec_version ( & self . spec_version ) {
75
83
return Err ( Error :: Encoding ( format ! (
76
84
"Unknown spec version {}" ,
77
85
self . spec_version
@@ -185,7 +193,7 @@ impl TimestampMetadata {
185
193
) ) ) ;
186
194
}
187
195
188
- if self . spec_version != SPEC_VERSION {
196
+ if ! valid_spec_version ( & self . spec_version ) {
189
197
return Err ( Error :: Encoding ( format ! (
190
198
"Unknown spec version {}" ,
191
199
self . spec_version
@@ -234,7 +242,7 @@ impl SnapshotMetadata {
234
242
) ) ) ;
235
243
}
236
244
237
- if self . spec_version != SPEC_VERSION {
245
+ if ! valid_spec_version ( & self . spec_version ) {
238
246
return Err ( Error :: Encoding ( format ! (
239
247
"Unknown spec version {}" ,
240
248
self . spec_version
@@ -300,7 +308,7 @@ impl TargetsMetadata {
300
308
) ) ) ;
301
309
}
302
310
303
- if self . spec_version != SPEC_VERSION {
311
+ if ! valid_spec_version ( & self . spec_version ) {
304
312
return Err ( Error :: Encoding ( format ! (
305
313
"Unknown spec version {}" ,
306
314
self . spec_version
@@ -576,6 +584,25 @@ mod deserialize_reject_duplicates {
576
584
mod test {
577
585
use super :: * ;
578
586
587
+ #[ test]
588
+ fn spec_version_validation ( ) {
589
+ let valid_spec_versions = [ "1.0.0" , "1.0" ] ;
590
+
591
+ for version in valid_spec_versions {
592
+ assert ! ( valid_spec_version( version) , "{:?} should be valid" , version) ;
593
+ }
594
+
595
+ let invalid_spec_versions = [ "1.0.1" , "1.1.0" , "2.0.0" , "3.0" ] ;
596
+
597
+ for version in invalid_spec_versions {
598
+ assert ! (
599
+ !valid_spec_version( version) ,
600
+ "{:?} should be invalid" ,
601
+ version
602
+ ) ;
603
+ }
604
+ }
605
+
579
606
#[ test]
580
607
fn datetime_formats ( ) {
581
608
// The TUF spec says datetimes should be in ISO8601 format, specifically
0 commit comments