Credential writes now require Electron safeStorage encryption. Legacy plaintext values remain readable for migration and are encrypted during the next successful save. The UI override and status IPC are removed.
This commit is contained in:
@@ -4255,14 +4255,6 @@ function renderSettings() {
|
||||
<input type="checkbox" class="settings-autosave" id="showDropTargetInput" ${globalSettings.showDropTarget ? 'checked' : ''}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="settings-option credential-fallback-option">
|
||||
<div class="settings-option-copy">
|
||||
<label for="allowPlaintextCredentialStorageInput">Unsichere Klartext-Speicherung erlauben</label>
|
||||
<span class="settings-option-description">Nur verwenden, wenn der sichere Betriebssystem-Speicher dauerhaft nicht verfügbar ist. Passwörter und API-Keys liegen dann lesbar in der Konfigurationsdatei.</span>
|
||||
<span class="panel-status" id="secretStoreStatus">Prüfe…</span>
|
||||
</div>
|
||||
<input type="checkbox" class="settings-autosave" id="allowPlaintextCredentialStorageInput" ${globalSettings.allowPlaintextCredentialStorage ? 'checked' : ''}>
|
||||
</div>
|
||||
<div class="settings-section-label">Programmupdate</div>
|
||||
<div class="settings-row program-update-row program-update-card">
|
||||
<div class="program-update-copy">
|
||||
@@ -4870,13 +4862,6 @@ function renderSettings() {
|
||||
document.getElementById('chooseLogFilePathBtn')?.addEventListener('click', chooseLogFilePath);
|
||||
document.getElementById('openLogFolderBtn')?.addEventListener('click', () => window.api.openLogFolder());
|
||||
document.getElementById('manualUpdateCheckBtn')?.addEventListener('click', requestUpdateCheck);
|
||||
window.api.getSecretStoreStatus().then(result => {
|
||||
const badge = document.getElementById('secretStoreStatus');
|
||||
if (!badge) return;
|
||||
const available = result?.status === 'available';
|
||||
badge.textContent = available ? 'Sicher verfügbar' : 'Nicht verfügbar';
|
||||
badge.classList.toggle('active', available);
|
||||
}).catch(() => {});
|
||||
_syncHeaderUpdateState();
|
||||
container.querySelectorAll('.settings-autosave').forEach((input) => {
|
||||
const eventName = input.type === 'checkbox' || input.tagName === 'SELECT' ? 'change' : 'input';
|
||||
@@ -4894,15 +4879,6 @@ function renderSettings() {
|
||||
});
|
||||
if (!confirmed) input.checked = false;
|
||||
}
|
||||
if (input.id === 'allowPlaintextCredentialStorageInput' && input.checked) {
|
||||
const confirmed = await showAppConfirm({
|
||||
title: 'Zugangsdaten unverschlüsselt speichern?',
|
||||
message: 'Passwörter und API-Keys werden dann im Klartext auf diesem PC gespeichert. Andere Benutzer oder Programme mit Dateizugriff können sie lesen.',
|
||||
confirmText: 'Klartext-Speicherung erlauben',
|
||||
danger: true
|
||||
});
|
||||
if (!confirmed) input.checked = false;
|
||||
}
|
||||
markSettingsDirty();
|
||||
});
|
||||
});
|
||||
@@ -5028,7 +5004,6 @@ async function performSaveSettings(options = {}) {
|
||||
})(),
|
||||
resumeQueueOnLaunch: elChk('resumeQueueOnLaunchInput', cur.resumeQueueOnLaunch !== false),
|
||||
autoStartRestoredQueue: elChk('autoStartRestoredQueueInput', !!cur.autoStartRestoredQueue),
|
||||
allowPlaintextCredentialStorage: elChk('allowPlaintextCredentialStorageInput', !!cur.allowPlaintextCredentialStorage),
|
||||
parallelUploadCount: elInt('parallelUploadCountInput', cur.parallelUploadCount ?? 0, 0, 0, 100),
|
||||
scaleParallelUploads: elChk('scaleParallelUploadsInput', !!cur.scaleParallelUploads),
|
||||
removeFromQueueOnDone: elChk('removeFromQueueOnDoneInput', !!cur.removeFromQueueOnDone),
|
||||
|
||||
@@ -474,13 +474,6 @@
|
||||
['Zugangsdaten konnten nicht sicher verschlüsselt werden', 'Credentials could not be encrypted securely'],
|
||||
['Gespeicherte Zugangsdaten konnten nicht entschlüsselt werden', 'Stored credentials could not be decrypted'],
|
||||
['Zugangsdaten gesperrt', 'Credentials locked'],
|
||||
['Unsichere Klartext-Speicherung erlauben', 'Allow insecure plaintext storage'],
|
||||
['Nur verwenden, wenn der sichere Betriebssystem-Speicher dauerhaft nicht verfügbar ist. Passwörter und API-Keys liegen dann lesbar in der Konfigurationsdatei.', 'Use only when secure operating system storage is permanently unavailable. Passwords and API keys will then be readable in the configuration file.'],
|
||||
['Sicher verfügbar', 'Securely available'],
|
||||
['Nicht verfügbar', 'Unavailable'],
|
||||
['Zugangsdaten unverschlüsselt speichern?', 'Store credentials without encryption?'],
|
||||
['Passwörter und API-Keys werden dann im Klartext auf diesem PC gespeichert. Andere Benutzer oder Programme mit Dateizugriff können sie lesen.', 'Passwords and API keys will then be stored as plaintext on this PC. Other users or programs with file access can read them.'],
|
||||
['Klartext-Speicherung erlauben', 'Allow plaintext storage'],
|
||||
['Die Verlaufsdatei ist beschädigt und wurde nicht verändert', 'The history file is damaged and was not changed'],
|
||||
['Verlauf und Aufbewahrung konnten nicht konsistent gespeichert werden', 'History and retention could not be saved consistently'],
|
||||
['Kein Ordnerpfad angegeben', 'No folder path was provided'],
|
||||
|
||||
@@ -3318,16 +3318,6 @@ input[type="checkbox"] {
|
||||
border-color: var(--danger);
|
||||
}
|
||||
|
||||
.settings-option.credential-fallback-option {
|
||||
margin-top: 12px;
|
||||
border-color: color-mix(in srgb, var(--danger) 72%, var(--border));
|
||||
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--danger) 10%, transparent);
|
||||
}
|
||||
|
||||
.settings-option.credential-fallback-option:focus-within {
|
||||
border-color: var(--danger);
|
||||
}
|
||||
|
||||
.settings-option-description,
|
||||
.hint {
|
||||
color: var(--text-dim);
|
||||
|
||||
Reference in New Issue
Block a user