@@ -11,24 +11,25 @@ const HTTP_OK = 200;
1111const Errors = {
1212 invalidMetadataErr : 'The SAML metadata is invalid.' ,
1313 urlInvalidErr : 'The SAML metadata URL is invalid.' ,
14+ uuidInvalidError : 'The profile is invalid.' ,
1415} ;
1516const ResponseObj = require ( './../response' ) ;
1617
1718module . exports = ( app , auth ) => {
1819 router . get ( '/' , ( req , res ) => {
19- const storedMetadataUrls = Storage . get ( 'metadataUrls' ) || [ ] ;
20-
2120 // Migrate metadataUrls to include a profileUuid. This makes
2221 // profile deletes/edits a little safer since they will no longer be
2322 // based on the iteration index.
2423 let migrated = false ;
25-
26- storedMetadataUrls . forEach ( ( metadata ) => {
24+ const storedMetadataUrls = ( Storage . get ( 'metadataUrls' ) || [ ] ) . map ( ( metadata ) => {
2725 if ( metadata . profileUuid === undefined ) {
2826 migrated = true ;
2927 metadata . profileUuid = uuidv4 ( ) ;
3028 }
29+
30+ return metadata ;
3131 } ) ;
32+
3233 if ( migrated ) {
3334 Storage . set ( 'metadataUrls' , storedMetadataUrls ) ;
3435 }
@@ -59,7 +60,11 @@ module.exports = (app, auth) => {
5960 } ) ;
6061
6162 router . post ( '/' , ( req , res ) => {
63+ const profileUuid = req . body . profileUuid ;
64+ const profileName = req . body . profileName ;
6265 const metadataUrl = req . body . metadataUrl ;
66+ let storedMetadataUrls = Storage . get ( 'metadataUrls' ) || [ ] ;
67+ let profile ;
6368
6469 if ( ! metadataUrl ) {
6570 Storage . set ( 'metadataUrlValid' , false ) ;
@@ -71,23 +76,44 @@ module.exports = (app, auth) => {
7176 } ) ) ;
7277 }
7378
74- const origin = req . body . origin ;
75- const metaDataResponseObj = Object . assign ( { } , ResponseObj , { defaultMetadataUrl : metadataUrl } ) ;
79+ // If a profileUuid is passed, validate it and update storage
80+ // with the submitted profile name.
81+ if ( profileUuid ) {
82+ profile = storedMetadataUrls . find ( ( metadata ) => metadata . profileUuid === profileUuid ) ;
7683
77- let storedMetadataUrls = Storage . get ( 'metadataUrls' ) || [ ] ;
78- const profileName = req . body . profileName === '' ? metadataUrl : req . body . profileName ;
79- const profile = storedMetadataUrls . find ( ( profile ) => profile . url === metadataUrl ) ;
84+ if ( ! profile ) {
85+ return res . status ( 404 ) . json ( Object . assign ( { } , ResponseObj , {
86+ error : Errors . uuidInvalidErr ,
87+ uuidUrlValid : false ,
88+ } ) ) ;
89+ }
90+
91+ if ( profile . url !== metadataUrl ) {
92+ return res . status ( 422 ) . json ( Object . assign ( { } , ResponseObj , {
93+ error : Errors . urlInvalidErr ,
94+ metadataUrlValid : false ,
95+ } ) ) ;
96+ }
8097
81- storedMetadataUrls = storedMetadataUrls . map ( ( storedMetadataUrl ) => {
82- if ( profileName && storedMetadataUrl . url === metadataUrl && storedMetadataUrl . name !== profileName ) {
83- storedMetadataUrl . name = profileName ;
98+ if ( profileName ) {
99+ storedMetadataUrls = storedMetadataUrls . map ( ( metadata ) => {
100+ if ( metadata . profileUuid === profileUuid && metadata . name !== profileName ) {
101+ metadata . name = profileName ;
102+ }
103+
104+ return metadata ;
105+ } ) ;
106+ Storage . set ( 'metadataUrls' , storedMetadataUrls ) ;
84107 }
108+ } else {
109+ profile = storedMetadataUrls . find ( ( metadata ) => metadata . url === metadataUrl ) ;
110+ }
85111
86- return storedMetadataUrl ;
87- } ) ;
88- Storage . set ( 'metadataUrls' , storedMetadataUrls ) ;
89112 app . set ( 'metadataUrl' , metadataUrl ) ;
90113
114+ const origin = req . body . origin ;
115+ const metaDataResponseObj = Object . assign ( { } , ResponseObj , { defaultMetadataUrl : metadataUrl } ) ;
116+
91117 const xmlReq = https . get ( metadataUrl , ( xmlRes ) => {
92118 let xml = '' ;
93119
@@ -141,18 +167,22 @@ module.exports = (app, auth) => {
141167
142168 if ( cert && issuer && entryPoint ) {
143169 Storage . set ( 'previousMetadataUrl' , metadataUrl ) ;
144- const metadataUrls = Storage . get ( 'metadataUrls' ) || [ ] ;
145-
146- Storage . set (
147- 'metadataUrls' ,
148- profile ? metadataUrls : metadataUrls . concat ( [
149- {
150- name : profileName || metadataUrl ,
151- profileUuid : uuidv4 ( ) ,
152- url : metadataUrl ,
153- } ,
154- ] )
155- ) ;
170+
171+ // Add a profile for this URL if one does not already exist
172+ if ( ! profile ) {
173+ const metadataUrls = Storage . get ( 'metadataUrls' ) || [ ] ;
174+
175+ Storage . set (
176+ 'metadataUrls' ,
177+ metadataUrls . concat ( [
178+ {
179+ name : profileName || metadataUrl ,
180+ profileUuid : uuidv4 ( ) ,
181+ url : metadataUrl ,
182+ } ,
183+ ] )
184+ ) ;
185+ }
156186
157187 app . set ( 'entryPointUrl' , config . auth . entryPoint ) ;
158188 auth . configure ( config . auth ) ;
0 commit comments