diff --git a/dist/urbm-2026.06.14.r005-x86_64-1.txz.sha256 b/dist/urbm-2026.06.14.r005-x86_64-1.txz.sha256 deleted file mode 100644 index 5137013..0000000 --- a/dist/urbm-2026.06.14.r005-x86_64-1.txz.sha256 +++ /dev/null @@ -1 +0,0 @@ -0d947c4dd0796e1ae0a48aa4f0199d1581f338fe093116879028a7f71f4a12cd urbm-2026.06.14.r005-x86_64-1.txz diff --git a/dist/urbm-2026.06.14.r005-x86_64-1.txz b/dist/urbm-2026.06.15.r001-x86_64-1.txz similarity index 55% rename from dist/urbm-2026.06.14.r005-x86_64-1.txz rename to dist/urbm-2026.06.15.r001-x86_64-1.txz index 83d094e..b85a800 100644 Binary files a/dist/urbm-2026.06.14.r005-x86_64-1.txz and b/dist/urbm-2026.06.15.r001-x86_64-1.txz differ diff --git a/dist/urbm-2026.06.15.r001-x86_64-1.txz.sha256 b/dist/urbm-2026.06.15.r001-x86_64-1.txz.sha256 new file mode 100644 index 0000000..f255b1e --- /dev/null +++ b/dist/urbm-2026.06.15.r001-x86_64-1.txz.sha256 @@ -0,0 +1 @@ +ac221002f02d50e7220ce4a0ef84acb02a0f7d5d81f9992c82cd4a3484dbe720 urbm-2026.06.15.r001-x86_64-1.txz diff --git a/dist/urbm.plg b/dist/urbm.plg index 898bf1d..475fa67 100644 --- a/dist/urbm.plg +++ b/dist/urbm.plg @@ -2,13 +2,16 @@ - + - + ]> +### 2026.06.15.r001 +- Require repository passwords to be entered twice and reject mismatched values before saving secrets or configuration. + ### 2026.06.14.r005 - Remove automatic repository subdirectory creation. The selected or entered path is used directly as the Restic repository location. diff --git a/plugin/urbm.plg b/plugin/urbm.plg index 5ac5a67..737b28b 100644 --- a/plugin/urbm.plg +++ b/plugin/urbm.plg @@ -2,13 +2,16 @@ - + ]> +### 2026.06.15.r001 +- Require repository passwords to be entered twice and reject mismatched values before saving secrets or configuration. + ### 2026.06.14.r005 - Remove automatic repository subdirectory creation. The selected or entered path is used directly as the Restic repository location. diff --git a/webgui/URBM.page b/webgui/URBM.page index 7ca1bc2..accba9d 100644 --- a/webgui/URBM.page +++ b/webgui/URBM.page @@ -9,12 +9,12 @@ Tag="URBM Unraid Restic Backup Manager backup snapshots restore" - +
- -

URBM 2026.06.14.r005

Restic Backup Manager für Unraid

+ +

URBM 2026.06.15.r001

Restic Backup Manager für Unraid

Verbindung wird hergestellt...
@@ -32,4 +32,4 @@ $pluginRoot = '/plugins/urbm';
- + diff --git a/webgui/assets/urbm.js b/webgui/assets/urbm.js index b36f331..bc01285 100644 --- a/webgui/assets/urbm.js +++ b/webgui/assets/urbm.js @@ -29,6 +29,7 @@ enabled: 'Aktiviert automatische geplante Läufe. Deaktivierte Jobs können weiterhin gespeichert, aber nicht automatisch ausgeführt werden.', location: 'Restic-Ziel. Lokal: /mnt/user/backups/job1. SFTP: user@server:/backup/job1. Bei SMB/NFS mit Mount wird hier der Mount-Pfad verwendet.', password: 'Passwort zur Restic-Verschlüsselung. Beispiel: eine lange zufällige Passphrase. Leer lassen, wenn ein vorhandenes Passwort unverändert bleiben soll.', + passwordConfirm: 'Wiederhole das Repository-Passwort exakt. URBM speichert das Passwort nur, wenn beide Eingaben übereinstimmen.', managed: 'Wenn aktiv, mountet URBM SMB/NFS vor dem Job selbst. Wenn aus, muss der angegebene Pfad bereits durch Unraid oder Unassigned Devices gemountet sein.', remote: 'Adresse der Netzwerkfreigabe. SMB-Beispiel: //192.168.1.20/backup. NFS-Beispiel: 192.168.1.20:/volume1/backup.', mountPoint: 'Lokaler Einhängepunkt auf Unraid. Beispiel: /mnt/remotes/backup-nas. Erlaubt sind Pfade unter /mnt/remotes oder /mnt/disks.', @@ -420,7 +421,7 @@ content.innerHTML = `

Repository ${repo.id?'bearbeiten':'erstellen'}

-
Restic-Verschlüsselung

Das Passwort wird von URBM geschützt gespeichert. ${repo.id?'Leer lassen, um das vorhandene Passwort zu behalten.':'Bewahre dieses Passwort sicher auf; ohne das Passwort können Backups nicht wiederhergestellt werden.'}

+
Restic-Verschlüsselung

Das Passwort wird von URBM geschützt gespeichert. ${repo.id?'Beide Felder leer lassen, um das vorhandene Passwort zu behalten.':'Bewahre dieses Passwort sicher auf; ohne das Passwort können Backups nicht wiederhergestellt werden.'}

${button('Speichern','submit-repo','primary')}${button('Abbrechen','cancel-form')}
`; enhanceTooltips(content); renderRepositorySpecific(repo.type || 'local', repo); @@ -586,9 +587,11 @@ if(managed&&!value('remote')) throw new Error('Für eine verwaltete Einbindung ist eine Netzwerkfreigabe erforderlich.'); const usesCredential=type==='sftp'||(type==='smb'&&managed); const credentialRef=usesCredential&&(value('hasCredential')==='true'||Boolean(f.get('credential')))?value('credentialRef'):''; const repo={schemaVersion:1,id:value('id')||id('repo'),name:value('name'),type,location,passwordRef:value('passwordRef'),credentialRef,mount:managed?{managed:true,remote:value('remote'),mountPoint:value('mountPoint')}:null,options:type==='sftp'?{knownHostsPath:value('knownHostsPath')}: {}}; - if(!value('id')&&!f.get('password')) throw new Error('Für ein neues Repository ist ein Passwort erforderlich.'); + const password=String(f.get('password')||''); const passwordConfirm=String(f.get('passwordConfirm')||''); + if(!value('id')&&!password) throw new Error('Für ein neues Repository ist ein Passwort erforderlich.'); + if(password!==passwordConfirm) throw new Error('Die beiden Repository-Passwörter stimmen nicht überein.'); if (volatileLocation(repo) && !confirm('WARNUNG: Dieses Ziel liegt unter /tmp oder /run und geht nach einem Unraid-Neustart verloren. Trotzdem speichern?')) return; - if(f.get('password')) await api(`/v1/secrets/${encodeURIComponent(repo.passwordRef)}`,{method:'PUT',body:JSON.stringify({type:'restic-password',value:f.get('password')})}); + if(password) await api(`/v1/secrets/${encodeURIComponent(repo.passwordRef)}`,{method:'PUT',body:JSON.stringify({type:'restic-password',value:password})}); if(f.get('credential')) await api(`/v1/secrets/${encodeURIComponent(repo.credentialRef)}`,{method:'PUT',body:JSON.stringify({type:type==='sftp'?'sftp-private-key':'smb-credential',value:f.get('credential')})}); state.config.repositories=state.config.repositories.filter(r=>r.id!==repo.id).concat(repo); await saveConfig();