...
This commit is contained in:
299
poc/logintest.html
Normal file
299
poc/logintest.html
Normal file
@@ -0,0 +1,299 @@
|
||||
{% include 'components/header.html' %}
|
||||
|
||||
<body>
|
||||
{% include 'components/nav.html' %}
|
||||
<main>
|
||||
<div class="container">
|
||||
<h1>Identity Test Page</h1>
|
||||
|
||||
<div class="card">
|
||||
<div id="status" class="status unauthenticated">
|
||||
Not identified
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<button class="btn-identify" onclick="showIdentifyModal()">Identify</button>
|
||||
<button class="btn-clear" onclick="clearAllAndReload()">Clear All & Reload</button>
|
||||
</div>
|
||||
|
||||
<div id="keyInfo" class="key-info" style="display: none;">
|
||||
<h3>Key Information</h3>
|
||||
<div class="key-details">
|
||||
<div id="keyStatus"></div>
|
||||
<div id="publicKey" class="public-key"></div>
|
||||
<div id="generateKeySection" style="display: none;" class="generate-key-section">
|
||||
<div class="warning-message">
|
||||
⚠️ No private key found. You need to generate a private key to use the system.
|
||||
<strong>WARNING: Losing your private key will result in permanent loss of access to your digital life in ThreeFold.</strong>
|
||||
</div>
|
||||
<button onclick="generatePrivateKey()" class="btn-generate">Generate Private Key</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="testActions" class="test-actions" style="display: none;">
|
||||
<h3>Test Actions</h3>
|
||||
<div class="test-container">
|
||||
<div class="test-group">
|
||||
<input type="text" id="testKey" placeholder="Key name">
|
||||
<input type="text" id="testValue" placeholder="Value">
|
||||
<button onclick="setTestValue()">Set Value</button>
|
||||
<div id="setResult" class="set-result"></div>
|
||||
</div>
|
||||
<div class="test-group">
|
||||
<input type="text" id="retrieveKey" placeholder="Key to retrieve">
|
||||
<button onclick="getTestValue()">Get Value</button>
|
||||
<div id="retrievedValue" class="retrieved-value"></div>
|
||||
</div>
|
||||
<div class="test-group">
|
||||
<button onclick="listAllValues()" class="btn-list">List All Values</button>
|
||||
<div id="allValues" class="all-values"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Identity Modal -->
|
||||
<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';
|
||||
}
|
||||
|
||||
function clearAllAndReload() {
|
||||
sessionStorage.clear();
|
||||
location.reload();
|
||||
}
|
||||
|
||||
async function generatePrivateKey() {
|
||||
try {
|
||||
const privateKey = await window.kvs.generateNewPrivateKey();
|
||||
const publicKey = window.kvs.getPublicKey(privateKey);
|
||||
const publicKeyBase58 = bs58.encode(publicKey);
|
||||
|
||||
document.getElementById('generateKeySection').style.display = 'none';
|
||||
document.getElementById('keyStatus').textContent = '🔑 New private key generated';
|
||||
document.getElementById('publicKey').innerHTML =
|
||||
`<strong>Public Key (Base58):</strong><br>${publicKeyBase58}`;
|
||||
} catch (error) {
|
||||
console.error('Error generating private key:', error);
|
||||
document.getElementById('keyStatus').textContent =
|
||||
'❌ Error generating private key: ' + error.message;
|
||||
}
|
||||
}
|
||||
|
||||
async function updateStatus() {
|
||||
const status = document.getElementById('status');
|
||||
const keyInfo = document.getElementById('keyInfo');
|
||||
const testActions = document.getElementById('testActions');
|
||||
const keyStatus = document.getElementById('keyStatus');
|
||||
const generateKeySection = document.getElementById('generateKeySection');
|
||||
const publicKeyDiv = document.getElementById('publicKey');
|
||||
|
||||
if (window.kvs.isSessionValid()) {
|
||||
try {
|
||||
status.className = 'status authenticated';
|
||||
status.textContent = 'Identified successfully';
|
||||
|
||||
keyInfo.style.display = 'block';
|
||||
testActions.style.display = 'block';
|
||||
|
||||
const hasKey = await window.kvs.hasPrivateKey();
|
||||
if (!hasKey) {
|
||||
generateKeySection.style.display = 'block';
|
||||
keyStatus.textContent = '⚠️ No private key found';
|
||||
publicKeyDiv.innerHTML = '';
|
||||
testActions.style.display = 'none';
|
||||
} else {
|
||||
generateKeySection.style.display = 'none';
|
||||
const privateKey = await window.kvs.getPrivateKey();
|
||||
const publicKey = window.kvs.getPublicKey(privateKey);
|
||||
const publicKeyBase58 = bs58.encode(publicKey);
|
||||
|
||||
keyStatus.textContent = '🔑 Private key loaded';
|
||||
publicKeyDiv.innerHTML = `<strong>Public Key (Base58):</strong><br>${publicKeyBase58}`;
|
||||
}
|
||||
} catch (error) {
|
||||
status.className = 'status unauthenticated';
|
||||
status.textContent = 'Error accessing keys: ' + error.message;
|
||||
keyInfo.style.display = 'none';
|
||||
testActions.style.display = 'none';
|
||||
}
|
||||
} else {
|
||||
status.className = 'status unauthenticated';
|
||||
status.textContent = 'Not identified';
|
||||
keyInfo.style.display = 'none';
|
||||
testActions.style.display = 'none';
|
||||
showIdentifyModal();
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
async function setTestValue() {
|
||||
const key = document.getElementById('testKey').value;
|
||||
const value = document.getElementById('testValue').value;
|
||||
const setResult = document.getElementById('setResult');
|
||||
const retrieveKey = document.getElementById('retrieveKey');
|
||||
|
||||
if (!key || !value) {
|
||||
setResult.innerHTML = '<div class="error">Please enter both key and value</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await window.kvs.set(key, value);
|
||||
setResult.innerHTML = '<div class="success">Value set successfully!</div>';
|
||||
document.getElementById('testKey').value = '';
|
||||
document.getElementById('testValue').value = '';
|
||||
|
||||
// Auto-fill the retrieve key field
|
||||
retrieveKey.value = key;
|
||||
// Automatically get the value
|
||||
await getTestValue();
|
||||
// Refresh the list if it's visible
|
||||
const allValues = document.getElementById('allValues');
|
||||
if (allValues.innerHTML !== '') {
|
||||
await listAllValues();
|
||||
}
|
||||
} catch (error) {
|
||||
setResult.innerHTML = `<div class="error">Error setting value: ${error.message}</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
async function getTestValue() {
|
||||
const key = document.getElementById('retrieveKey').value;
|
||||
const retrievedValueDiv = document.getElementById('retrievedValue');
|
||||
|
||||
if (!key) {
|
||||
retrievedValueDiv.innerHTML = '<div class="error">Please enter a key to retrieve</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const value = await window.kvs.get(key);
|
||||
retrievedValueDiv.innerHTML = value ?
|
||||
`<div class="success">Retrieved value: ${value}</div>` :
|
||||
'<div class="info">No value found for this key</div>';
|
||||
} catch (error) {
|
||||
retrievedValueDiv.innerHTML = `<div class="error">Error: ${error.message}</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
async function listAllValues() {
|
||||
const allValuesDiv = document.getElementById('allValues');
|
||||
try {
|
||||
const results = await window.kvs.listAll();
|
||||
if (results.length === 0) {
|
||||
allValuesDiv.innerHTML = '<div class="no-values">No stored values found</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
const html = results.map(({key, value, encrypted}) => `
|
||||
<div class="stored-value ${encrypted ? 'encrypted' : 'not-encrypted'}">
|
||||
<div class="stored-key">${key}</div>
|
||||
<div class="stored-value-content">${value}</div>
|
||||
<div class="encryption-status">
|
||||
${encrypted ?
|
||||
'<span class="status-icon">🔒</span> Encrypted' :
|
||||
'<span class="status-icon">⚠️</span> Not encrypted'}
|
||||
</div>
|
||||
</div>
|
||||
`).join('');
|
||||
|
||||
allValuesDiv.innerHTML = html;
|
||||
} catch (error) {
|
||||
allValuesDiv.innerHTML = `<div class="error">Error listing values: ${error.message}</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
// Check session validity periodically
|
||||
const sessionCheckInterval = setInterval(() => {
|
||||
if (window.kvs && !window.kvs.isSessionValid()) {
|
||||
window.kvs.clearSession();
|
||||
updateStatus();
|
||||
}
|
||||
}, 60000); // Check every minute
|
||||
|
||||
// Cleanup interval when page unloads
|
||||
window.addEventListener('unload', () => {
|
||||
clearInterval(sessionCheckInterval);
|
||||
});
|
||||
|
||||
// Initial check when the page loads
|
||||
window.addEventListener('DOMContentLoaded', () => {
|
||||
updateStatus();
|
||||
});
|
||||
|
||||
// Update status when user is identified
|
||||
window.addEventListener('userIdentified', updateStatus);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Reference in New Issue
Block a user