Decouple request and response via WebSocket
This commit is contained in:
		
							parent
							
								
									08be6e68bc
								
							
						
					
					
						commit
						2093bf2429
					
				
					 12 changed files with 369 additions and 146 deletions
				
			
		|  | @ -148,32 +148,60 @@ | |||
|                         document.getElementById("csr").innerHTML = csrPem; | ||||
|                         progressBar.style.width = "75%"; | ||||
|                         progressBar.setAttribute("aria-valuenow", "3"); | ||||
|                         progressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); | ||||
|                         progressBar.innerHTML = i18n.t('keygen.generated', {seconds: seconds}) + ', ' + i18n.t('certificate.waiting'); | ||||
|                         postData("/sign/", {"csr": csrPem, "commonName": subject}, csrfToken) | ||||
|                             .then(data => { | ||||
|                                 document.getElementById("crt").innerHTML = data["certificate"]; | ||||
|                                 let certificates = [] | ||||
|                                 certificates.push(forge.pki.certificateFromPem(data["certificate"])); | ||||
| 
 | ||||
|                                 for (let certificatePemData of data["ca_chain"]) { | ||||
|                                     certificates.push(forge.pki.certificateFromPem(certificatePemData)); | ||||
|                                 const request_id = data["request_id"] | ||||
|                                 const webSocket = new WebSocket( | ||||
|                                     "wss://" + window.location.toString().substring( | ||||
|                                     "https://".length | ||||
|                                     ).split("/")[0] + "/ws/") | ||||
|                                 webSocket.onopen = function () { | ||||
|                                     webSocket.send(JSON.stringify({"request_id": request_id})) | ||||
|                                 } | ||||
|                                 webSocket.onmessage = function (event) { | ||||
|                                     handleCertificateResponse(JSON.parse(event.data)); | ||||
|                                 } | ||||
|                                 webSocket.onclose = function (event) { | ||||
|                                     if (event.wasClean) { | ||||
|                                         console.debug("websocket closed cleanly"); | ||||
|                                     } else { | ||||
|                                         console.error("websocket connection died"); | ||||
|                                     } | ||||
|                                 } | ||||
|                                 webSocket.onerror = function (error) { | ||||
|                                     console.error(error.message); | ||||
|                                 } | ||||
| 
 | ||||
|                                 // browsers have trouble importing anything but 3des encrypted PKCS#12 | ||||
|                                 const p12asn1 = forge.pkcs12.toPkcs12Asn1( | ||||
|                                     keys.privateKey, certificates, password, | ||||
|                                     {algorithm: '3des'} | ||||
|                                 ); | ||||
|                                 const p12Der = forge.asn1.toDer(p12asn1).getBytes(); | ||||
|                                 const p12B64 = forge.util.encode64(p12Der); | ||||
| 
 | ||||
|                                 const downloadLink = document.getElementById('download-link'); | ||||
|                                 downloadLink.download = 'client_certificate.p12'; | ||||
|                                 downloadLink.setAttribute('href', 'data:application/x-pkcs12;base64,' + p12B64); | ||||
| 
 | ||||
|                                 document.getElementById('download-wrapper').classList.remove("d-none"); | ||||
|                                 progressBar.style.width = "100%"; | ||||
|                                 progressBar.setAttribute("aria-valuenow", "4"); | ||||
|                             }); | ||||
| 
 | ||||
|                         function handleCertificateResponse(data) { | ||||
|                             document.getElementById("crt").innerHTML = data["certificate"]; | ||||
|                             let certificates = [] | ||||
|                             certificates.push(forge.pki.certificateFromPem(data["certificate"])); | ||||
| 
 | ||||
|                             for (let certificatePemData of data["ca_chain"]) { | ||||
|                                 certificates.push(forge.pki.certificateFromPem(certificatePemData)); | ||||
|                             } | ||||
| 
 | ||||
|                             // browsers have trouble importing anything but 3des encrypted PKCS#12 | ||||
|                             const p12asn1 = forge.pkcs12.toPkcs12Asn1( | ||||
|                                 keys.privateKey, certificates, password, | ||||
|                                 {algorithm: '3des'} | ||||
|                             ); | ||||
|                             const p12Der = forge.asn1.toDer(p12asn1).getBytes(); | ||||
|                             const p12B64 = forge.util.encode64(p12Der); | ||||
| 
 | ||||
|                             const downloadLink = document.getElementById('download-link'); | ||||
|                             downloadLink.download = 'client_certificate.p12'; | ||||
|                             downloadLink.setAttribute('href', 'data:application/x-pkcs12;base64,' + p12B64); | ||||
| 
 | ||||
|                             document.getElementById('download-wrapper').classList.remove("d-none"); | ||||
|                             progressBar.classList.remove("progress-bar-animated", 'progress-bar-striped'); | ||||
|                             progressBar.style.width = "100%"; | ||||
|                             progressBar.innerHTML = i18n.t('keygen.generated', {seconds: seconds}) + ', ' + i18n.t('certificate.received'); | ||||
|                             progressBar.setAttribute("aria-valuenow", "4"); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  |  | |||
		Reference in a new issue