mirror of
				https://github.com/spring-projects/spring-security.git
				synced 2025-10-25 19:58:48 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			109 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
|  * Copyright 2002-2024 the original author or authors.
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  *      https://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| import webauthn from "./webauthn-core.js";
 | |
| 
 | |
| function setVisibility(element, value) {
 | |
|   if (!element) {
 | |
|     return;
 | |
|   }
 | |
|   element.style.display = value ? "block" : "none";
 | |
| }
 | |
| 
 | |
| function setError(ui, msg) {
 | |
|   resetPopups(ui);
 | |
|   const error = ui.getError();
 | |
|   if (!error) {
 | |
|     return;
 | |
|   }
 | |
|   error.textContent = msg;
 | |
|   setVisibility(error, true);
 | |
| }
 | |
| 
 | |
| function setSuccess(ui) {
 | |
|   resetPopups(ui);
 | |
|   const success = ui.getSuccess();
 | |
|   if (!success) {
 | |
|     return;
 | |
|   }
 | |
|   setVisibility(success, true);
 | |
| }
 | |
| 
 | |
| function resetPopups(ui) {
 | |
|   const success = ui.getSuccess();
 | |
|   const error = ui.getError();
 | |
|   setVisibility(success, false);
 | |
|   setVisibility(error, false);
 | |
| }
 | |
| 
 | |
| async function submitDeleteForm(contextPath, form, headers) {
 | |
|   const options = {
 | |
|     method: "DELETE",
 | |
|     headers: {
 | |
|       "Content-Type": "application/json",
 | |
|       ...headers,
 | |
|     },
 | |
|   };
 | |
|   await fetch(form.action, options);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  *
 | |
|  * @param headers headers added to the credentials creation POST request, typically CSRF
 | |
|  * @param contextPath the contextPath from which the app is served
 | |
|  * @param ui contains getRegisterButton(), getSuccess(), getError(), getLabelInput(), getDeleteForms()
 | |
|  * @returns {Promise<void>}
 | |
|  */
 | |
| export async function setupRegistration(headers, contextPath, ui) {
 | |
|   resetPopups(ui);
 | |
| 
 | |
|   if (!window.PublicKeyCredential) {
 | |
|     setError(ui, "WebAuthn is not supported");
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   const queryString = new URLSearchParams(window.location.search);
 | |
|   if (queryString.has("success")) {
 | |
|     setSuccess(ui);
 | |
|   }
 | |
| 
 | |
|   ui.getRegisterButton().addEventListener("click", async () => {
 | |
|     resetPopups(ui);
 | |
|     const label = ui.getLabelInput().value;
 | |
|     try {
 | |
|       await webauthn.register(headers, contextPath, label);
 | |
|       window.location.href = `${contextPath}/webauthn/register?success`;
 | |
|     } catch (err) {
 | |
|       setError(ui, err.message);
 | |
|       console.error(err);
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   ui.getDeleteForms().forEach((form) =>
 | |
|     form.addEventListener("submit", async function (e) {
 | |
|       e.preventDefault();
 | |
|       try {
 | |
|         await submitDeleteForm(contextPath, form, headers);
 | |
|         window.location.href = `${contextPath}/webauthn/register?success`;
 | |
|       } catch (err) {
 | |
|         setError(ui, err.message);
 | |
|       }
 | |
|     }),
 | |
|   );
 | |
| }
 |