@@ -232,6 +232,34 @@ func TestSetManifest(t *testing.T) {
232232 require .Equal (codes .InvalidArgument , status .Code (err ))
233233 })
234234
235+ t .Run ("insecure manifest rejected" , func (t * testing.T ) {
236+ require := require .New (t )
237+
238+ // Default coordinator does not allow insecure manifests.
239+ coordinator := newCoordinator ()
240+ m := newInsecureManifest (t )
241+ manifestBytes , err := json .Marshal (m )
242+ require .NoError (err )
243+ req := & userapi.SetManifestRequest {Manifest : manifestBytes }
244+ _ , err = coordinator .SetManifest (t .Context (), req )
245+ require .Error (err )
246+ require .Equal (codes .InvalidArgument , status .Code (err ))
247+ require .ErrorContains (err , "insecure" )
248+ })
249+
250+ t .Run ("insecure manifest accepted when allowed" , func (t * testing.T ) {
251+ require := require .New (t )
252+
253+ coordinator := newCoordinatorAllowInsecure ()
254+ m := newInsecureManifest (t )
255+ manifestBytes , err := json .Marshal (m )
256+ require .NoError (err )
257+ req := & userapi.SetManifestRequest {Manifest : manifestBytes }
258+ resp , err := coordinator .SetManifest (t .Context (), req )
259+ require .NoError (err )
260+ require .NotNil (resp )
261+ })
262+
235263 t .Run ("atomic manifest update" , func (t * testing.T ) {
236264 require := require .New (t )
237265
@@ -404,7 +432,7 @@ func TestRecovery(t *testing.T) {
404432 fs := afero .NewMemMapFs ()
405433 store := aferostore .New (& afero.Afero {Fs : fs })
406434 hist := history .NewWithStore (slog .Default (), store )
407- auth := stateguard .New (hist , prometheus .NewRegistry (), logger )
435+ auth := stateguard .New (hist , prometheus .NewRegistry (), logger , false )
408436 discovery := & stubDiscovery {
409437 peers : tc .peers ,
410438 err : tc .peersErr ,
@@ -438,7 +466,7 @@ func TestRecovery(t *testing.T) {
438466 }
439467
440468 // Simulate a restarted Coordinator.
441- a .guard = stateguard .New (hist , prometheus .NewRegistry (), slog .Default ())
469+ a .guard = stateguard .New (hist , prometheus .NewRegistry (), slog .Default (), false )
442470 _ , err = a .GetManifests (t .Context (), nil )
443471 require .ErrorContains (err , ErrNeedsRecovery .Error ())
444472 _ , err = a .Recover (rpcContext (t .Context (), seedShareOwnerKey ), recoverReq )
@@ -460,7 +488,7 @@ func TestRecoveryFlow(t *testing.T) {
460488 fs := afero .NewMemMapFs ()
461489 store := aferostore .New (& afero.Afero {Fs : fs })
462490 hist := history .NewWithStore (slog .Default (), store )
463- auth := stateguard .New (hist , prometheus .NewRegistry (), logger )
491+ auth := stateguard .New (hist , prometheus .NewRegistry (), logger , false )
464492 a := New (logger , auth , & stubDiscovery {})
465493
466494 // 2. A manifest is set and the returned seed is recorded.
@@ -496,7 +524,7 @@ func TestRecoveryFlow(t *testing.T) {
496524 // 3. A new Coordinator is created with the existing history.
497525 // GetManifests and SetManifest are expected to fail.
498526
499- a .guard = stateguard .New (hist , prometheus .NewRegistry (), slog .Default ())
527+ a .guard = stateguard .New (hist , prometheus .NewRegistry (), slog .Default (), false )
500528 _ , err = a .SetManifest (t .Context (), req )
501529 require .ErrorContains (err , ErrNeedsRecovery .Error ())
502530
@@ -539,7 +567,7 @@ func TestUserAPIConcurrent(t *testing.T) {
539567 fs := afero .NewBasePathFs (afero .NewOsFs (), t .TempDir ())
540568 store := aferostore .New (& afero.Afero {Fs : fs })
541569 hist := history .NewWithStore (slog .Default (), store )
542- auth := stateguard .New (hist , prometheus .NewRegistry (), logger )
570+ auth := stateguard .New (hist , prometheus .NewRegistry (), logger , false )
543571 coordinator := New (logger , auth , & stubDiscovery {})
544572
545573 setReq := & userapi.SetManifestRequest {
@@ -853,14 +881,32 @@ func newCoordinatorWithRegistry(reg *prometheus.Registry) *Server {
853881 fs := afero .NewMemMapFs ()
854882 store := aferostore .New (& afero.Afero {Fs : fs })
855883 hist := history .NewWithStore (slog .Default (), store )
856- auth := stateguard .New (hist , reg , logger )
884+ auth := stateguard .New (hist , reg , logger , false )
857885 return New (logger , auth , & stubDiscovery {})
858886}
859887
888+ func newCoordinatorAllowInsecure () * Server {
889+ logger := slog .Default ()
890+ fs := afero .NewMemMapFs ()
891+ store := aferostore .New (& afero.Afero {Fs : fs })
892+ hist := history .NewWithStore (slog .Default (), store )
893+ auth := stateguard .New (hist , prometheus .NewRegistry (), logger , true )
894+ return New (logger , auth , & stubDiscovery {})
895+ }
896+
897+ func newInsecureManifest (t * testing.T ) * manifest.Manifest {
898+ t .Helper ()
899+ mnfst := & manifest.Manifest {}
900+ mnfst .ReferenceValues .SNP = []manifest.SNPReferenceValues {
901+ {Platform : "Metal-QEMU-Insecure" },
902+ }
903+ return mnfst
904+ }
905+
860906func newCoordinatorWithWatcher (t * testing.T , hist * history.History ) * Server {
861907 t .Helper ()
862908 logger := slog .Default ()
863- auth := stateguard .New (hist , prometheus .NewRegistry (), logger )
909+ auth := stateguard .New (hist , prometheus .NewRegistry (), logger , false )
864910 coordinator := New (logger , auth , & stubDiscovery {})
865911
866912 ctx , cancel := context .WithCancel (t .Context ())
0 commit comments