218 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <div class="modal-overlay" id="identifyModal">
 | |
|     <div class="modal-container">
 | |
|         <div class="modal-header">
 | |
|             <h2>Identify Yourself</h2>
 | |
|             <p class="modal-description">Enter your secret password to access the key management system.</p>
 | |
|         </div>
 | |
|         <form class="modal-form" id="identifyForm" onsubmit="return handleIdentify(event)">
 | |
|             <div class="form-group">
 | |
|                 <label for="secret">Secret Password</label>
 | |
|                 <input type="password" id="secret" name="secret" required 
 | |
|                        placeholder="Enter your secret password"
 | |
|                        autocomplete="current-password">
 | |
|                 <div class="error-message" id="errorMessage"></div>
 | |
|             </div>
 | |
|             <div class="modal-buttons">
 | |
|                 <button type="button" class="btn btn-secondary" onclick="closeIdentifyModal()">Cancel</button>
 | |
|                 <button type="submit" class="btn btn-primary" id="identifyButton">Identify</button>
 | |
|             </div>
 | |
|         </form>
 | |
|     </div>
 | |
| </div>
 | |
| 
 | |
| <script>
 | |
|     function showIdentifyModal() {
 | |
|         document.getElementById('identifyModal').style.display = 'block';
 | |
|         document.getElementById('secret').focus();
 | |
|     }
 | |
| 
 | |
|     function closeIdentifyModal() {
 | |
|         document.getElementById('identifyModal').style.display = 'none';
 | |
|         document.getElementById('identifyForm').reset();
 | |
|         document.getElementById('errorMessage').style.display = 'none';
 | |
|     }
 | |
| 
 | |
|     async function handleIdentify(event) {
 | |
|         event.preventDefault();
 | |
|         
 | |
|         const secret = document.getElementById('secret').value;
 | |
|         const errorMessage = document.getElementById('errorMessage');
 | |
|         const identifyButton = document.getElementById('identifyButton');
 | |
|         
 | |
|         // Disable button during processing
 | |
|         identifyButton.disabled = true;
 | |
|         identifyButton.textContent = 'Processing...';
 | |
|         
 | |
|         try {
 | |
|             if (!window.kvs) {
 | |
|                 throw new Error('Key management system not initialized');
 | |
|             }
 | |
| 
 | |
|             // Set the password in session storage
 | |
|             window.kvs.setPassword(secret);
 | |
|             
 | |
|             // Try to generate/retrieve the private key to verify the password
 | |
|             await window.kvs.generate_private_key();
 | |
|             
 | |
|             // If successful, close the modal
 | |
|             closeIdentifyModal();
 | |
|             
 | |
|             // Dispatch an event to notify that identification was successful
 | |
|             window.dispatchEvent(new CustomEvent('userIdentified'));
 | |
|             
 | |
|         } catch (error) {
 | |
|             console.error('Identification error:', error);
 | |
|             errorMessage.textContent = error.message || 'Invalid secret password';
 | |
|             errorMessage.style.display = 'block';
 | |
|             window.kvs.clearSession();
 | |
|         } finally {
 | |
|             // Re-enable button
 | |
|             identifyButton.disabled = false;
 | |
|             identifyButton.textContent = 'Identify';
 | |
|         }
 | |
|         
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     // Check session validity periodically
 | |
|     const sessionCheckInterval = setInterval(() => {
 | |
|         if (window.kvs && !window.kvs.isSessionValid()) {
 | |
|             window.kvs.clearSession();
 | |
|             showIdentifyModal();
 | |
|         }
 | |
|     }, 60000); // Check every minute
 | |
| 
 | |
|     // Cleanup interval when page unloads
 | |
|     window.addEventListener('unload', () => {
 | |
|         clearInterval(sessionCheckInterval);
 | |
|     });
 | |
| 
 | |
|     // Initial check when the page loads
 | |
|     window.addEventListener('DOMContentLoaded', () => {
 | |
|         if (!window.kvs || !window.kvs.isSessionValid()) {
 | |
|             showIdentifyModal();
 | |
|         }
 | |
|     });
 | |
| </script>
 | |
| 
 | |
| <style>
 | |
|     .modal-overlay {
 | |
|         display: none;
 | |
|         position: fixed;
 | |
|         top: 0;
 | |
|         left: 0;
 | |
|         width: 100%;
 | |
|         height: 100%;
 | |
|         background: rgba(0, 0, 0, 0.5);
 | |
|         z-index: 1000;
 | |
|         backdrop-filter: blur(3px);
 | |
|     }
 | |
| 
 | |
|     .modal-container {
 | |
|         position: fixed;
 | |
|         top: 50%;
 | |
|         left: 50%;
 | |
|         transform: translate(-50%, -50%);
 | |
|         background: white;
 | |
|         padding: 2rem;
 | |
|         border-radius: 8px;
 | |
|         box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
 | |
|         z-index: 1001;
 | |
|         width: 90%;
 | |
|         max-width: 400px;
 | |
|     }
 | |
| 
 | |
|     .modal-header {
 | |
|         margin-bottom: 1.5rem;
 | |
|         text-align: center;
 | |
|     }
 | |
| 
 | |
|     .modal-description {
 | |
|         color: #666;
 | |
|         margin-top: 0.5rem;
 | |
|         font-size: 0.9rem;
 | |
|     }
 | |
| 
 | |
|     .modal-form {
 | |
|         display: flex;
 | |
|         flex-direction: column;
 | |
|         gap: 1rem;
 | |
|     }
 | |
| 
 | |
|     .form-group {
 | |
|         display: flex;
 | |
|         flex-direction: column;
 | |
|         gap: 0.5rem;
 | |
|     }
 | |
| 
 | |
|     .form-group label {
 | |
|         font-weight: bold;
 | |
|         color: #333;
 | |
|     }
 | |
| 
 | |
|     .form-group input {
 | |
|         padding: 0.75rem;
 | |
|         border: 1px solid #ddd;
 | |
|         border-radius: 4px;
 | |
|         font-size: 1rem;
 | |
|         transition: border-color 0.2s;
 | |
|     }
 | |
| 
 | |
|     .form-group input:focus {
 | |
|         border-color: #007bff;
 | |
|         outline: none;
 | |
|         box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
 | |
|     }
 | |
| 
 | |
|     .modal-buttons {
 | |
|         display: flex;
 | |
|         justify-content: flex-end;
 | |
|         gap: 1rem;
 | |
|         margin-top: 1.5rem;
 | |
|     }
 | |
| 
 | |
|     .btn {
 | |
|         padding: 0.75rem 1.5rem;
 | |
|         border: none;
 | |
|         border-radius: 4px;
 | |
|         cursor: pointer;
 | |
|         font-size: 1rem;
 | |
|         transition: all 0.2s;
 | |
|         font-weight: 500;
 | |
|     }
 | |
| 
 | |
|     .btn:disabled {
 | |
|         opacity: 0.7;
 | |
|         cursor: not-allowed;
 | |
|     }
 | |
| 
 | |
|     .btn-primary {
 | |
|         background-color: #007bff;
 | |
|         color: white;
 | |
|     }
 | |
| 
 | |
|     .btn-primary:hover:not(:disabled) {
 | |
|         background-color: #0056b3;
 | |
|     }
 | |
| 
 | |
|     .btn-secondary {
 | |
|         background-color: #6c757d;
 | |
|         color: white;
 | |
|     }
 | |
| 
 | |
|     .btn-secondary:hover:not(:disabled) {
 | |
|         background-color: #545b62;
 | |
|     }
 | |
| 
 | |
|     .error-message {
 | |
|         color: #dc3545;
 | |
|         font-size: 0.875rem;
 | |
|         margin-top: 0.5rem;
 | |
|         display: none;
 | |
|         padding: 0.5rem;
 | |
|         background-color: #fff5f5;
 | |
|         border-radius: 4px;
 | |
|         border: 1px solid #ffebee;
 | |
|     }
 | |
| </style>
 |