feat: add paired Chrome bridge authentication
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
'use strict';
|
||||
|
||||
const PAIRING_STORAGE_KEY = 'aptPairingSecret';
|
||||
const PAIRING_SECRET_PATTERN = /^[A-Za-z0-9_-]{43}$/;
|
||||
|
||||
const pairingForm = document.getElementById('pairingForm');
|
||||
const pairingSecretInput = document.getElementById('pairingSecret');
|
||||
const pairingStatus = document.getElementById('pairingStatus');
|
||||
const currentState = document.getElementById('currentState');
|
||||
const forgetBtn = document.getElementById('forgetBtn');
|
||||
|
||||
function setStatus(message, type) {
|
||||
pairingStatus.textContent = message;
|
||||
pairingStatus.className = `status ${type}`;
|
||||
}
|
||||
|
||||
function renderPairingState(paired) {
|
||||
currentState.textContent = paired ? 'Paired on this Chrome profile.' : 'Not paired.';
|
||||
currentState.className = paired ? 'paired' : 'unpaired';
|
||||
forgetBtn.disabled = !paired;
|
||||
}
|
||||
|
||||
async function refreshPairingState() {
|
||||
const stored = await chrome.storage.local.get(PAIRING_STORAGE_KEY);
|
||||
const candidate = stored && stored[PAIRING_STORAGE_KEY];
|
||||
renderPairingState(PAIRING_SECRET_PATTERN.test(typeof candidate === 'string' ? candidate : ''));
|
||||
}
|
||||
|
||||
pairingForm.addEventListener('submit', async (event) => {
|
||||
event.preventDefault();
|
||||
const candidate = pairingSecretInput.value.trim();
|
||||
pairingSecretInput.value = '';
|
||||
|
||||
if (!PAIRING_SECRET_PATTERN.test(candidate)) {
|
||||
setStatus('That secret is not valid. Generate a new pairing secret in APT and paste it exactly.', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await chrome.storage.local.set({ [PAIRING_STORAGE_KEY]: candidate });
|
||||
setStatus('Pairing saved. You can now use Send to APT from an Alta tab.', 'success');
|
||||
renderPairingState(true);
|
||||
} catch {
|
||||
setStatus('Chrome could not save the pairing. Try again.', 'error');
|
||||
}
|
||||
});
|
||||
|
||||
forgetBtn.addEventListener('click', async () => {
|
||||
try {
|
||||
await chrome.storage.local.remove(PAIRING_STORAGE_KEY);
|
||||
renderPairingState(false);
|
||||
setStatus('Pairing forgotten. Revoke or rotate it in APT as well.', 'success');
|
||||
} catch {
|
||||
setStatus('Chrome could not forget the pairing. Try again.', 'error');
|
||||
}
|
||||
});
|
||||
|
||||
refreshPairingState().catch(() => {
|
||||
renderPairingState(false);
|
||||
setStatus('Chrome could not read pairing state.', 'error');
|
||||
});
|
||||
Reference in New Issue
Block a user