@@ -14,6 +14,7 @@ const {
1414const {
1515 ERR_MANIFEST_ASSERT_INTEGRITY ,
1616 ERR_MANIFEST_INTEGRITY_MISMATCH ,
17+ ERR_MANIFEST_INVALID_RESOURCE_FIELD ,
1718 ERR_MANIFEST_UNKNOWN_ONERROR ,
1819} = require ( 'internal/errors' ) . codes ;
1920const debug = require ( 'internal/util/debuglog' ) . debuglog ( 'policy' ) ;
@@ -83,41 +84,50 @@ class Manifest {
8384 if ( RegExpPrototype . test ( kRelativeURLStringPattern , url ) ) {
8485 url = new URL ( url , manifestURL ) . href ;
8586 }
86- const integrity = manifestEntries [ i ] [ 1 ] . integrity ;
87+ let integrity = manifestEntries [ i ] [ 1 ] . integrity ;
88+ if ( ! integrity ) integrity = null ;
8789 if ( integrity != null ) {
8890 debug ( `Manifest contains integrity for url ${ originalURL } ` ) ;
91+ if ( typeof integrity === 'string' ) {
92+ const sri = Object . freeze ( SRI . parse ( integrity ) ) ;
93+ if ( url in integrities ) {
94+ const old = integrities [ url ] ;
95+ let mismatch = false ;
8996
90- const sri = Object . freeze ( SRI . parse ( integrity ) ) ;
91- if ( url in integrities ) {
92- const old = integrities [ url ] ;
93- let mismatch = false ;
94-
95- if ( old . length !== sri . length ) {
96- mismatch = true ;
97- } else {
98- compare:
99- for ( var sriI = 0 ; sriI < sri . length ; sriI ++ ) {
100- for ( var oldI = 0 ; oldI < old . length ; oldI ++ ) {
101- if ( sri [ sriI ] . algorithm === old [ oldI ] . algorithm &&
102- BufferEquals ( sri [ sriI ] . value , old [ oldI ] . value ) &&
103- sri [ sriI ] . options === old [ oldI ] . options ) {
104- continue compare;
97+ if ( old . length !== sri . length ) {
98+ mismatch = true ;
99+ } else {
100+ compare:
101+ for ( var sriI = 0 ; sriI < sri . length ; sriI ++ ) {
102+ for ( var oldI = 0 ; oldI < old . length ; oldI ++ ) {
103+ if ( sri [ sriI ] . algorithm === old [ oldI ] . algorithm &&
104+ BufferEquals ( sri [ sriI ] . value , old [ oldI ] . value ) &&
105+ sri [ sriI ] . options === old [ oldI ] . options ) {
106+ continue compare;
107+ }
105108 }
109+ mismatch = true ;
110+ break compare;
106111 }
107- mismatch = true ;
108- break compare;
109112 }
110- }
111113
112- if ( mismatch ) {
113- throw new ERR_MANIFEST_INTEGRITY_MISMATCH ( url ) ;
114+ if ( mismatch ) {
115+ throw new ERR_MANIFEST_INTEGRITY_MISMATCH ( url ) ;
116+ }
114117 }
118+ integrities [ url ] = sri ;
119+ } else if ( integrity === true ) {
120+ integrities [ url ] = true ;
121+ } else {
122+ throw new ERR_MANIFEST_INVALID_RESOURCE_FIELD ( url , 'integrity' ) ;
115123 }
116- integrities [ url ] = sri ;
117124 }
118125
119- const dependencyMap = manifestEntries [ i ] [ 1 ] . dependencies ;
120- if ( dependencyMap ) {
126+ let dependencyMap = manifestEntries [ i ] [ 1 ] . dependencies ;
127+ if ( dependencyMap === null || dependencyMap === undefined ) {
128+ dependencyMap = { } ;
129+ }
130+ if ( typeof dependencyMap === 'object' && ! Array . isArray ( dependencyMap ) ) {
121131 dependencies [ url ] = new SafeMap ( Object . entries ( dependencyMap ) . map (
122132 ( [ from , to ] ) => {
123133 if ( to === true ) {
@@ -131,6 +141,10 @@ class Manifest {
131141 return [ from , new URL ( to ) . href ] ;
132142 } )
133143 ) ;
144+ } else if ( dependencyMap === true ) {
145+ dependencies [ url ] = true ;
146+ } else {
147+ throw new ERR_MANIFEST_INVALID_RESOURCE_FIELD ( url , 'dependencies' ) ;
134148 }
135149 }
136150 Object . freeze ( integrities ) ;
@@ -142,11 +156,13 @@ class Manifest {
142156
143157 getRedirects ( requester ) {
144158 const dependencies = kDependencies . get ( this ) ;
145- if ( ! dependencies [ requester ] ) return null ;
146- return {
147- map : dependencies [ requester ] ,
148- reaction : kReactions . get ( this )
149- } ;
159+ if ( dependencies && requester in dependencies ) {
160+ return {
161+ map : dependencies [ requester ] ,
162+ reaction : kReactions . get ( this )
163+ } ;
164+ }
165+ return null ;
150166 }
151167
152168 assertIntegrity ( url , content ) {
@@ -156,6 +172,7 @@ class Manifest {
156172
157173 if ( integrities && url in integrities ) {
158174 const integrityEntries = integrities [ url ] ;
175+ if ( integrityEntries === true ) return true ;
159176 // Avoid clobbered Symbol.iterator
160177 for ( var i = 0 ; i < integrityEntries . length ; i ++ ) {
161178 const {
0 commit comments