-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsettings.js
More file actions
210 lines (182 loc) · 6.39 KB
/
settings.js
File metadata and controls
210 lines (182 loc) · 6.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
/**
* Settings Manager for Browser Authenticator
*/
// Display a status message
function showStatus(message, duration = 3000) {
const statusElement = document.getElementById('statusMessage');
statusElement.textContent = message;
statusElement.classList.add('fade-in');
setTimeout(() => {
statusElement.textContent = '';
statusElement.classList.remove('fade-in');
}, duration);
}
// Get settings from storage
async function getSettings() {
return new Promise((resolve, reject) => {
chrome.storage.sync.get('settings', (data) => {
if (chrome.runtime.lastError) {
reject(chrome.runtime.lastError);
} else {
resolve(data.settings || {
codeLength: 6,
refreshPeriod: 30,
algorithm: 'SHA-1',
autoBackup: false
});
}
});
});
}
// Save settings to storage
async function saveSettings(settings) {
return new Promise((resolve, reject) => {
chrome.storage.sync.set({ settings }, () => {
if (chrome.runtime.lastError) {
reject(chrome.runtime.lastError);
} else {
resolve();
}
});
});
}
// Export accounts as JSON file
async function exportAccounts() {
try {
const data = await new Promise((resolve, reject) => {
chrome.storage.sync.get('accounts', (data) => {
if (chrome.runtime.lastError) {
reject(chrome.runtime.lastError);
} else {
resolve(data.accounts || {});
}
});
});
// Create a downloadable blob
const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });
const url = URL.createObjectURL(blob);
// Create a link to download and click it
const a = document.createElement('a');
a.href = url;
a.download = `authenticator-backup-${new Date().toISOString().slice(0, 10)}.json`;
document.body.appendChild(a);
a.click();
// Clean up
setTimeout(() => {
document.body.removeChild(a);
URL.revokeObjectURL(url);
}, 100);
showStatus('Accounts exported successfully!');
return true;
} catch (error) {
console.error('Export error:', error);
showStatus('Export failed. Please check console.', 5000);
return false;
}
}
// Import accounts from JSON file
async function importAccountsFromFile(file) {
try {
const content = await new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = (event) => resolve(event.target.result);
reader.onerror = (error) => reject(error);
reader.readAsText(file);
});
const importedAccounts = JSON.parse(content);
// Validate imported data (must be an object)
if (typeof importedAccounts !== 'object' || importedAccounts === null || Array.isArray(importedAccounts)) {
throw new Error('Invalid backup format');
}
// Get current accounts
const data = await new Promise((resolve, reject) => {
chrome.storage.sync.get('accounts', (data) => {
if (chrome.runtime.lastError) {
reject(chrome.runtime.lastError);
} else {
resolve(data);
}
});
});
const currentAccounts = data.accounts || {};
// Merge imported accounts with current accounts
const mergedAccounts = { ...currentAccounts, ...importedAccounts };
// Save merged accounts
await new Promise((resolve, reject) => {
chrome.storage.sync.set({ accounts: mergedAccounts }, () => {
if (chrome.runtime.lastError) {
reject(chrome.runtime.lastError);
} else {
resolve();
}
});
});
const importedCount = Object.keys(importedAccounts).length;
showStatus(`${importedCount} account(s) imported successfully!`);
return true;
} catch (error) {
console.error('Import error:', error);
showStatus('Import failed. Invalid file or format.', 5000);
return false;
}
}
// Initialize the settings page
document.addEventListener('DOMContentLoaded', async () => {
console.log('Settings page loaded');
const codeLengthSelect = document.getElementById('codeLength');
const refreshPeriodSelect = document.getElementById('refreshPeriod');
const algorithmSelect = document.getElementById('algorithm');
const autoBackupToggle = document.getElementById('autoBackupToggle');
try {
// Load current settings
const settings = await getSettings();
console.log('Settings loaded:', settings);
// Set form values from loaded settings
codeLengthSelect.value = settings.codeLength || 6;
refreshPeriodSelect.value = settings.refreshPeriod || 30;
algorithmSelect.value = settings.algorithm || 'SHA-1';
autoBackupToggle.checked = settings.autoBackup || false;
// Save settings button
document.getElementById('saveSettingsButton').addEventListener('click', async () => {
try {
const newSettings = {
codeLength: parseInt(codeLengthSelect.value),
refreshPeriod: parseInt(refreshPeriodSelect.value),
algorithm: algorithmSelect.value,
autoBackup: autoBackupToggle.checked
};
await saveSettings(newSettings);
showStatus('Settings saved successfully!');
// Optional: go back to main popup after saving
setTimeout(() => {
window.location.href = 'popup.html';
}, 1500);
} catch (error) {
console.error('Error saving settings:', error);
showStatus('Failed to save settings. Please try again.', 5000);
}
});
// Back button
document.getElementById('backFromSettingsButton').addEventListener('click', () => {
window.location.href = 'popup.html';
});
// Export accounts button
document.getElementById('exportButton').addEventListener('click', exportAccounts);
// Import accounts button
document.getElementById('importButton').addEventListener('click', () => {
document.getElementById('importFile').click();
});
// File input change handler
document.getElementById('importFile').addEventListener('change', async (event) => {
const file = event.target.files[0];
if (file) {
await importAccountsFromFile(file);
// Reset the file input
event.target.value = null;
}
});
} catch (error) {
console.error('Error initializing settings page:', error);
showStatus('Failed to load settings. Check console for details.', 10000);
}
});