@@ -230,6 +230,34 @@ func TestSetManifest(t *testing.T) {
230230 require .Equal (codes .InvalidArgument , status .Code (err ))
231231 })
232232
233+ t .Run ("insecure manifest rejected" , func (t * testing.T ) {
234+ require := require .New (t )
235+
236+ // Default coordinator does not allow insecure manifests.
237+ coordinator := newCoordinator ()
238+ m := newInsecureManifest (t )
239+ manifestBytes , err := json .Marshal (m )
240+ require .NoError (err )
241+ req := & userapi.SetManifestRequest {Manifest : manifestBytes }
242+ _ , err = coordinator .SetManifest (t .Context (), req )
243+ require .Error (err )
244+ require .Equal (codes .InvalidArgument , status .Code (err ))
245+ require .ErrorContains (err , "insecure" )
246+ })
247+
248+ t .Run ("insecure manifest accepted when allowed" , func (t * testing.T ) {
249+ require := require .New (t )
250+
251+ coordinator := newCoordinatorAllowInsecure ()
252+ m := newInsecureManifest (t )
253+ manifestBytes , err := json .Marshal (m )
254+ require .NoError (err )
255+ req := & userapi.SetManifestRequest {Manifest : manifestBytes }
256+ resp , err := coordinator .SetManifest (t .Context (), req )
257+ require .NoError (err )
258+ require .NotNil (resp )
259+ })
260+
233261 t .Run ("atomic manifest update" , func (t * testing.T ) {
234262 require := require .New (t )
235263
@@ -366,7 +394,7 @@ func TestRecovery(t *testing.T) {
366394 fs := afero .NewMemMapFs ()
367395 store := aferostore .New (& afero.Afero {Fs : fs })
368396 hist := history .NewWithStore (slog .Default (), store )
369- auth := stateguard .New (hist , prometheus .NewRegistry (), logger )
397+ auth := stateguard .New (hist , prometheus .NewRegistry (), logger , false )
370398 discovery := & stubDiscovery {
371399 peers : tc .peers ,
372400 err : tc .peersErr ,
@@ -400,7 +428,7 @@ func TestRecovery(t *testing.T) {
400428 }
401429
402430 // Simulate a restarted Coordinator.
403- a .guard = stateguard .New (hist , prometheus .NewRegistry (), slog .Default ())
431+ a .guard = stateguard .New (hist , prometheus .NewRegistry (), slog .Default (), false )
404432 _ , err = a .GetManifests (t .Context (), nil )
405433 require .ErrorContains (err , ErrNeedsRecovery .Error ())
406434 _ , err = a .Recover (rpcContext (t .Context (), seedShareOwnerKey ), recoverReq )
@@ -422,7 +450,7 @@ func TestRecoveryFlow(t *testing.T) {
422450 fs := afero .NewMemMapFs ()
423451 store := aferostore .New (& afero.Afero {Fs : fs })
424452 hist := history .NewWithStore (slog .Default (), store )
425- auth := stateguard .New (hist , prometheus .NewRegistry (), logger )
453+ auth := stateguard .New (hist , prometheus .NewRegistry (), logger , false )
426454 a := New (logger , auth , & stubDiscovery {})
427455
428456 // 2. A manifest is set and the returned seed is recorded.
@@ -458,7 +486,7 @@ func TestRecoveryFlow(t *testing.T) {
458486 // 3. A new Coordinator is created with the existing history.
459487 // GetManifests and SetManifest are expected to fail.
460488
461- a .guard = stateguard .New (hist , prometheus .NewRegistry (), slog .Default ())
489+ a .guard = stateguard .New (hist , prometheus .NewRegistry (), slog .Default (), false )
462490 _ , err = a .SetManifest (t .Context (), req )
463491 require .ErrorContains (err , ErrNeedsRecovery .Error ())
464492
@@ -501,7 +529,7 @@ func TestUserAPIConcurrent(t *testing.T) {
501529 fs := afero .NewBasePathFs (afero .NewOsFs (), t .TempDir ())
502530 store := aferostore .New (& afero.Afero {Fs : fs })
503531 hist := history .NewWithStore (slog .Default (), store )
504- auth := stateguard .New (hist , prometheus .NewRegistry (), logger )
532+ auth := stateguard .New (hist , prometheus .NewRegistry (), logger , false )
505533 coordinator := New (logger , auth , & stubDiscovery {})
506534
507535 setReq := & userapi.SetManifestRequest {
@@ -815,14 +843,32 @@ func newCoordinatorWithRegistry(reg *prometheus.Registry) *Server {
815843 fs := afero .NewMemMapFs ()
816844 store := aferostore .New (& afero.Afero {Fs : fs })
817845 hist := history .NewWithStore (slog .Default (), store )
818- auth := stateguard .New (hist , reg , logger )
846+ auth := stateguard .New (hist , reg , logger , false )
819847 return New (logger , auth , & stubDiscovery {})
820848}
821849
850+ func newCoordinatorAllowInsecure () * Server {
851+ logger := slog .Default ()
852+ fs := afero .NewMemMapFs ()
853+ store := aferostore .New (& afero.Afero {Fs : fs })
854+ hist := history .NewWithStore (slog .Default (), store )
855+ auth := stateguard .New (hist , prometheus .NewRegistry (), logger , true )
856+ return New (logger , auth , & stubDiscovery {})
857+ }
858+
859+ func newInsecureManifest (t * testing.T ) * manifest.Manifest {
860+ t .Helper ()
861+ mnfst := & manifest.Manifest {}
862+ mnfst .ReferenceValues .SNP = []manifest.SNPReferenceValues {
863+ {Platform : "Metal-QEMU-SNP-Insecure" },
864+ }
865+ return mnfst
866+ }
867+
822868func newCoordinatorWithWatcher (t * testing.T , hist * history.History ) * Server {
823869 t .Helper ()
824870 logger := slog .Default ()
825- auth := stateguard .New (hist , prometheus .NewRegistry (), logger )
871+ auth := stateguard .New (hist , prometheus .NewRegistry (), logger , false )
826872 coordinator := New (logger , auth , & stubDiscovery {})
827873
828874 ctx , cancel := context .WithCancel (t .Context ())
0 commit comments