You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					108 lines
				
				3.2 KiB
			
		
		
			
		
	
	
					108 lines
				
				3.2 KiB
			| 
											3 years ago
										 | const fs = require('fs') | ||
|  | const fse = require('fs-extra') | ||
|  | const crypto = require('crypto') | ||
|  | const swaggerUiAssetPath = require('swagger-ui-dist').getAbsoluteFSPath() | ||
|  | const resolve = require('path').resolve | ||
|  | 
 | ||
|  | fse.emptyDirSync(resolve('./static')) | ||
|  | 
 | ||
|  | // since the original swagger-ui-dist folder contains non UI files
 | ||
|  | const filesToCopy = ['favicon-16x16.png', | ||
|  |   'favicon-32x32.png', | ||
|  |   'index.html', | ||
|  |   'oauth2-redirect.html', | ||
|  |   'swagger-ui-bundle.js', | ||
|  |   'swagger-ui-bundle.js.map', | ||
|  |   'swagger-ui-standalone-preset.js', | ||
|  |   'swagger-ui-standalone-preset.js.map', | ||
|  |   'swagger-ui.css', | ||
|  |   'swagger-ui.css.map', | ||
|  |   'swagger-ui.js', | ||
|  |   'swagger-ui.js.map'] | ||
|  | filesToCopy.forEach(filename => { | ||
|  |   fse.copySync(`${swaggerUiAssetPath}/${filename}`, resolve(`./static/${filename}`)) | ||
|  | }) | ||
|  | 
 | ||
|  | const newIndex = fs.readFileSync(resolve('./static/index.html'), 'utf8') | ||
|  |   .replace(/<script>(.*)<\/script>/gs, ` | ||
|  |   <script> | ||
|  |   window.onload = function () { | ||
|  |     function resolveUrl (url) { | ||
|  |         const anchor = document.createElement('a') | ||
|  |         anchor.href = url | ||
|  |         return anchor.href | ||
|  |     } | ||
|  | 
 | ||
|  |     function resolveConfig (cb) { | ||
|  |       return fetch( | ||
|  |         resolveUrl('./uiConfig').replace('static/uiConfig', 'uiConfig') | ||
|  |       ) | ||
|  |         .then(res => res.json()) | ||
|  |         .then((config) => { | ||
|  |           const resConfig = Object.assign({}, { | ||
|  |             dom_id: '#swagger-ui', | ||
|  |             deepLinking: true, | ||
|  |             presets: [ | ||
|  |               SwaggerUIBundle.presets.apis, | ||
|  |               SwaggerUIStandalonePreset | ||
|  |             ], | ||
|  |             plugins: [ | ||
|  |               SwaggerUIBundle.plugins.DownloadUrl | ||
|  |             ], | ||
|  |             layout: "StandaloneLayout" | ||
|  |           }, config, { | ||
|  |             url: resolveUrl('./json').replace('static/json', 'json'), | ||
|  |             oauth2RedirectUrl: resolveUrl('./oauth2-redirect.html') | ||
|  |           }); | ||
|  |           return cb(resConfig); | ||
|  |         }) | ||
|  |      } | ||
|  | 
 | ||
|  |     // Begin Swagger UI call region
 | ||
|  |     const buildUi = function (config) { | ||
|  |       const ui = SwaggerUIBundle(config) | ||
|  |       window.ui = ui | ||
|  | 
 | ||
|  |       fetch(resolveUrl('./initOAuth').replace('static/initOAuth', 'initOAuth')) | ||
|  |         .then(res => res.json()) | ||
|  |         .then((config) => { | ||
|  |           ui.initOAuth(config); | ||
|  |       }); | ||
|  |        | ||
|  |     } | ||
|  |     // End Swagger UI call region
 | ||
|  | 
 | ||
|  |     resolveConfig(buildUi); | ||
|  |   } | ||
|  |   </script> | ||
|  |   `)
 | ||
|  | 
 | ||
|  | fse.writeFileSync(resolve('./static/index.html'), newIndex) | ||
|  | 
 | ||
|  | const sha = { | ||
|  |   script: [], | ||
|  |   style: [] | ||
|  | } | ||
|  | function computeCSPHashes (path) { | ||
|  |   const scriptRegex = /<script>(.*)<\/script>/gs | ||
|  |   const styleRegex = /<style>(.*)<\/style>/gs | ||
|  |   const indexSrc = fs.readFileSync(resolve(path)).toString('utf8') | ||
|  |   let result = scriptRegex.exec(indexSrc) | ||
|  |   while (result !== null) { | ||
|  |     const hash = crypto.createHash('sha256') | ||
|  |     hash.update(result[1]) | ||
|  |     sha.script.push(`'sha256-${hash.digest().toString('base64')}'`) | ||
|  |     result = scriptRegex.exec(indexSrc) | ||
|  |   } | ||
|  |   result = styleRegex.exec(indexSrc) | ||
|  |   while (result !== null) { | ||
|  |     const hash = crypto.createHash('sha256') | ||
|  |     hash.update(result[1]) | ||
|  |     sha.style.push(`'sha256-${hash.digest().toString('base64')}'`) | ||
|  |     result = styleRegex.exec(indexSrc) | ||
|  |   } | ||
|  | } | ||
|  | computeCSPHashes('./static/index.html') | ||
|  | computeCSPHashes('./static/oauth2-redirect.html') | ||
|  | fse.writeFileSync(resolve('./static/csp.json'), JSON.stringify(sha)) |