Implement borg v2 compatibility for most commands.

Adjust available encryptions for borg v2.
Use `-r` for all/most commands. Implement `rinfo`.
Use `ssh://` style URL as a placeholder.
Implement compatibility for `borg extract`.
Adjust for beta3, use --match-archives for deletions

Co-authored-by: real-yfprojects <real-yfprojects@users.noreply.github.com>
Co-authored-by: Manu <manu@snapdragon.cc>
This commit is contained in:
real-yfprojects 2023-01-20 17:01:12 +01:00 committed by Manu
parent fa3a6cf7e6
commit 2b2d61baa5
17 changed files with 377 additions and 311 deletions

View File

@ -1,279 +1,278 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AddRepository</class>
<widget class="QDialog" name="AddRepository">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>464</width>
<height>274</height>
</rect>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="verticalSpacing">
<number>0</number>
</property>
<item row="2" column="0">
<widget class="QLabel" name="errorText">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text">
<string/>
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
<property name="scaledContents">
<bool>false</bool>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<property name="wordWrap">
<class>AddRepository</class>
<widget class="QDialog" name="AddRepository">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>466</width>
<height>274</height>
</rect>
</property>
<property name="modal">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tabWidgetPage1">
<attribute name="title">
<string>General</string>
</attribute>
<layout class="QFormLayout" name="repoDataFormLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item row="0" column="1">
<widget class="QLabel" name="title">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Initialize New Backup Repository</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="repoLabel">
<property name="text">
<string>Repository URL:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<item>
<widget class="QLineEdit" name="repoURL">
<property name="placeholderText">
<string>ssh://abc123@abc123.repo.borgbase.com/./repo</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="chooseLocalFolderButton">
<property name="toolTip">
<string>Choose a local folder</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset>
<normaloff>:/icons/folder-open.svg</normaloff>:/icons/folder-open.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="useRemoteRepoButton">
<property name="toolTip">
<string>Choose a remote repository</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset>
<normaloff>:/icons/globe.svg</normaloff>:/icons/globe.svg</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Borg passphrase:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="passwordLineEdit">
<property name="enabled">
<bool>true</bool>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="confirmLineEdit">
<property name="enabled">
<bool>true</bool>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="confirmLabel">
<property name="text">
<string>Confirm passphrase:</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="passwordLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabWidgetPage2">
<attribute name="title">
<string>Advanced</string>
</attribute>
<layout class="QFormLayout" name="advancedFormLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>SSH Key:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="sshComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Automatically choose SSH Key (default)</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="verticalSpacing">
<number>0</number>
</property>
<item row="2" column="0">
<widget class="QLabel" name="errorText">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text">
<string />
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
<property name="scaledContents">
<bool>false</bool>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</item>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="encryptionLabel">
<property name="text">
<string>Encryption:</string>
</property>
</item>
<item row="1" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tabWidgetPage1">
<attribute name="title">
<string>General</string>
</attribute>
<layout class="QFormLayout" name="repoDataFormLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item row="0" column="1">
<widget class="QLabel" name="title">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Initialize New Backup Repository</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="repoLabel">
<property name="text">
<string>Repository URL:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<item>
<widget class="QLineEdit" name="repoURL">
<property name="placeholderText">
<string>ssh://abc123@abc123.repo.borgbase.com/./repo</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="chooseLocalFolderButton">
<property name="toolTip">
<string>Choose a local folder</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset>
<normaloff>:/icons/folder-open.svg</normaloff>:/icons/folder-open.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="useRemoteRepoButton">
<property name="toolTip">
<string>Choose a remote repository</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset>
<normaloff>:/icons/globe.svg</normaloff>:/icons/globe.svg</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Borg passphrase:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="passwordLineEdit">
<property name="enabled">
<bool>true</bool>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="confirmLineEdit">
<property name="enabled">
<bool>true</bool>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="confirmLabel">
<property name="text">
<string>Confirm passphrase:</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="passwordLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabWidgetPage2">
<attribute name="title">
<string>Advanced</string>
</attribute>
<layout class="QFormLayout" name="advancedFormLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>SSH Key:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="sshComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Automatically choose SSH Key (default)</string>
</property>
</item>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="encryptionLabel">
<property name="text">
<string>Encryption:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="encryptionComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Extra Borg Arguments:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="extraBorgArgumentsLineEdit" />
</item>
</layout>
</widget>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="encryptionComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</item>
<item row="3" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Extra Borg Arguments:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="extraBorgArgumentsLineEdit"/>
</item>
</layout>
</widget>
</widget>
</item>
<item row="3" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
</item>
</layout>
</widget>
<resources />
<connections />
</ui>

View File

@ -286,7 +286,7 @@ class BorgJob(JobInterface, BackupProfileMixin):
msg = (
f"{translate('BorgJob','Files')}: {parsed['nfiles']}, "
f"{translate('BorgJob','Original')}: {pretty_bytes(parsed['original_size'])}, "
f"{translate('BorgJob','Compressed')}: {pretty_bytes(parsed['compressed_size'])}, "
# f"{translate('BorgJob','Compressed')}: {pretty_bytes(parsed['compressed_size'])}, "
f"{translate('BorgJob','Deduplicated')}: {pretty_bytes(parsed['deduplicated_size'])}" # noqa: E501
)
self.app.backup_progress_event.emit(msg)

View File

@ -1,4 +1,5 @@
from typing import Any, Dict
from vorta.utils import borg_compat
from .borg_job import BorgJob
@ -33,7 +34,10 @@ class BorgCheckJob(BorgJob):
ret['ok'] = False # Set back to false, so we can do our own checks here.
cmd = ['borg', 'check', '--info', '--log-json', '--progress']
cmd.append(f'{profile.repo.url}')
if borg_compat.check('V2'):
cmd = cmd + ["-r", profile.repo.url]
else:
cmd.append(f'{profile.repo.url}')
ret['ok'] = True
ret['cmd'] = cmd

View File

@ -38,8 +38,11 @@ class BorgCompactJob(BorgJob):
ret['message'] = trans_late('messages', 'This feature needs Borg 1.2.0 or higher.')
return ret
cmd = ['borg', '--info', '--log-json', 'compact', '--cleanup-commits', '--progress']
cmd.append(f'{profile.repo.url}')
cmd = ['borg', '--info', '--log-json', 'compact', '--progress']
if borg_compat.check('V2'):
cmd = cmd + ["-r", profile.repo.url]
else:
cmd.append(f'{profile.repo.url}')
ret['ok'] = True
ret['cmd'] = cmd

View File

@ -168,7 +168,11 @@ class BorgCreateJob(BorgJob):
# Add repo url and source dirs.
new_archive_name = format_archive_name(profile, profile.new_archive_name)
cmd.append(f"{profile.repo.url}::{new_archive_name}")
if borg_compat.check('V2'):
cmd += ["-r", profile.repo.url, new_archive_name]
else:
cmd.append(f"{profile.repo.url}::{new_archive_name}")
for f in SourceFileModel.select().where(SourceFileModel.profile == profile.id):
cmd.append(f.dir)

View File

@ -1,5 +1,6 @@
from typing import List
from vorta.store.models import RepoModel
from vorta.utils import borg_compat
from .borg_job import BorgJob
@ -33,8 +34,12 @@ class BorgDeleteJob(BorgJob):
return ret
cmd = ['borg', 'delete', '--info', '--log-json']
cmd.append(f'{profile.repo.url}::{archives[0]}')
cmd.extend(archives[1:])
if borg_compat.check('V2'):
cmd = cmd + ["-r", profile.repo.url, '-a']
cmd.append(f"re:({'|'.join(archives)})")
else:
cmd.append(f'{profile.repo.url}::{archives[0]}')
cmd.extend(archives[1:])
ret['archives'] = archives
ret['cmd'] = cmd

View File

@ -24,7 +24,11 @@ class BorgDiffJob(BorgJob):
ret['cmd'].append('--json-lines')
ret['json_lines'] = True
ret['cmd'].extend([f'{profile.repo.url}::{archive_name_1}', f'{archive_name_2}'])
if borg_compat.check('V2'):
ret['cmd'].extend(['-r', profile.repo.url, archive_name_1, archive_name_2])
else:
ret['cmd'].extend([f'{profile.repo.url}::{archive_name_1}', archive_name_2])
ret['ok'] = True
ret['archive_name_older'] = archive_name_1
ret['archive_name_newer'] = archive_name_2

View File

@ -1,5 +1,6 @@
import tempfile
from PyQt5.QtCore import QModelIndex, Qt
from vorta.utils import borg_compat
from vorta.views.extract_dialog import ExtractTree, FileData
from vorta.views.partials.treemodel import FileSystemItem, path_to_str
from .borg_job import BorgJob
@ -24,7 +25,10 @@ class BorgExtractJob(BorgJob):
ret['ok'] = False # Set back to false, so we can do our own checks here.
cmd = ['borg', 'extract', '--list', '--info', '--log-json']
cmd.append(f'{profile.repo.url}::{archive_name}')
if borg_compat.check('V2'):
cmd += ['-r', profile.repo.url, archive_name]
else:
cmd.append(f'{profile.repo.url}::{archive_name}')
# process selected items
# all items will be excluded beside the one actively selected in the

View File

@ -1,4 +1,5 @@
from vorta.store.models import ArchiveModel, RepoModel
from vorta.utils import borg_compat
from .borg_job import BorgJob
@ -19,13 +20,11 @@ class BorgInfoArchiveJob(BorgJob):
return ret
ret['ok'] = True
ret['cmd'] = [
'borg',
'info',
'--log-json',
'--json',
f'{profile.repo.url}::{archive_name}',
]
ret['cmd'] = ['borg', 'info', '--log-json', '--json']
if borg_compat.check('V2'):
ret['cmd'].extend(["-r", profile.repo.url, '-a', archive_name])
else:
ret['cmd'].append(f'{profile.repo.url}::{archive_name}')
ret['archive_name'] = archive_name
return ret
@ -52,7 +51,6 @@ class BorgInfoArchiveJob(BorgJob):
stats = result['data']['cache']['stats']
repo = RepoModel.get(id=result['params']['repo_id'])
repo.total_size = stats['total_size']
repo.unique_csize = stats['unique_csize']
repo.unique_size = stats['unique_size']
repo.total_unique_chunks = stats['total_unique_chunks']
repo.save()

View File

@ -1,5 +1,6 @@
from vorta.i18n import trans_late
from vorta.store.models import RepoModel
from vorta.utils import borg_compat
from .borg_job import BorgJob, FakeProfile, FakeRepo
@ -27,7 +28,10 @@ class BorgInfoRepoJob(BorgJob):
else:
ret['ok'] = False # Set back to false, so we can do our own checks here.
cmd = ["borg", "info", "--info", "--json", "--log-json"]
if borg_compat.check('V2'):
cmd = ["borg", "rinfo", "--info", "--json", "--log-json", "-r"]
else:
cmd = ["borg", "info", "--info", "--json", "--log-json"]
cmd.append(profile.repo.url)
ret['additional_env'] = {

View File

@ -1,4 +1,5 @@
from vorta.store.models import RepoModel
from vorta.utils import borg_compat
from .borg_job import BorgJob, FakeProfile, FakeRepo
@ -28,9 +29,20 @@ class BorgInitJob(BorgJob):
else:
ret['ok'] = False # Set back to false, so we can do our own checks here.
cmd = ["borg", "init", "--info", "--log-json"]
cmd.append(f"--encryption={params['encryption']}")
cmd.append(params['repo_url'])
if borg_compat.check('V2'):
cmd = [
"borg",
"rcreate",
"--info",
"--log-json",
f"--encryption={params['encryption']}",
"-r",
params['repo_url'],
]
else:
cmd = ["borg", "init", "--info", "--log-json"]
cmd.append(f"--encryption={params['encryption']}")
cmd.append(params['repo_url'])
ret['additional_env'] = {'BORG_RSH': 'ssh -oStrictHostKeyChecking=accept-new'}

View File

@ -30,8 +30,13 @@ class BorgListArchiveJob(BorgJob):
"{mode}{user}{group}{size}{"
+ ('isomtime' if borg_compat.check('V122') else 'mtime')
+ "}{path}{source}{health}{NL}",
f'{profile.repo.url}::{archive_name}',
]
if borg_compat.check('V2'):
ret['cmd'].extend(["-r", profile.repo.url, archive_name])
else:
ret['cmd'].append(f'{profile.repo.url}::{archive_name}')
ret['ok'] = True
return ret

View File

@ -1,5 +1,6 @@
from datetime import datetime as dt
from vorta.store.models import ArchiveModel, RepoModel
from vorta.utils import borg_compat
from .borg_job import BorgJob
@ -21,7 +22,10 @@ class BorgListRepoJob(BorgJob):
else:
ret['ok'] = False # Set back to false, so we can do our own checks here.
cmd = ['borg', 'list', '--info', '--log-json', '--json']
if borg_compat.check('V2'):
cmd = ['borg', 'rlist', '--info', '--log-json', '--json', '-r']
else:
cmd = ['borg', 'list', '--info', '--log-json', '--json']
cmd.append(f'{profile.repo.url}')
ret['ok'] = True

View File

@ -1,5 +1,6 @@
import os
from vorta.store.models import SettingsModel
from vorta.utils import borg_compat
from .borg_job import BorgJob
@ -23,7 +24,10 @@ class BorgMountJob(BorgJob):
if override_mount_permissions:
cmd += ['-o', f"umask=0277,uid={os.getuid()}"]
cmd += [f"{profile.repo.url}"]
if borg_compat.check('V2'):
cmd.extend(["-r", profile.repo.url])
else:
cmd.append(f'{profile.repo.url}')
ret['ok'] = True
ret['cmd'] = cmd

View File

@ -55,7 +55,10 @@ class BorgPruneJob(BorgJob):
if profile.prune_keep_within:
pruning_opts += ['--keep-within', profile.prune_keep_within]
cmd += pruning_opts
cmd.append(f'{profile.repo.url}')
if borg_compat.check('V2'):
cmd.extend(["-r", profile.repo.url])
else:
cmd.append(f'{profile.repo.url}')
ret['ok'] = True
ret['cmd'] = cmd

View File

@ -1,4 +1,5 @@
from vorta.store.models import ArchiveModel, RepoModel
from vorta.utils import borg_compat
from .borg_job import BorgJob
@ -15,7 +16,10 @@ class BorgRenameJob(BorgJob):
ret['ok'] = False # Set back to false, so we can do our own checks here.
cmd = ['borg', 'rename', '--info', '--log-json']
cmd.append(f'{profile.repo.url}')
if borg_compat.check('V2'):
cmd.extend(["-r", profile.repo.url])
else:
cmd.append(f'{profile.repo.url}')
ret['ok'] = True
ret['cmd'] = cmd

View File

@ -148,19 +148,28 @@ class AddRepoWindow(AddRepoBase, AddRepoUI):
self._set_status(self.tr('Unable to add your repository.'))
def init_encryption(self):
encryption_algos = [
[
self.tr('Repokey-Blake2 (Recommended, key stored in repository)'),
'repokey-blake2',
],
[self.tr('Repokey'), 'repokey'],
[
self.tr('Keyfile-Blake2 (Key stored in home directory)'),
'keyfile-blake2',
],
[self.tr('Keyfile'), 'keyfile'],
[self.tr('None (not recommended)'), 'none'],
]
if borg_compat.check('V2'):
encryption_algos = [
[
self.tr('Repokey-ChaCha20-Poly1305 (Recommended, key stored in repository)'),
'repokey-blake2-chacha20-poly1305',
],
[
self.tr('Keyfile-ChaCha20-Poly1305 (Key stored in home directory)'),
'keyfile-blake2-chacha20-poly1305',
],
[self.tr('Repokey-AES256-OCB'), 'repokey-blake2-aes-ocb'],
[self.tr('Keyfile-AES256-OCB'), 'keyfile-blake2-aes-ocb'],
[self.tr('None (not recommended)'), 'none'],
]
else:
encryption_algos = [
[self.tr('Repokey-Blake2 (Recommended, key stored in repository)'), 'repokey-blake2'],
[self.tr('Repokey'), 'repokey'],
[self.tr('Keyfile-Blake2 (Key stored in home directory)'), 'keyfile-blake2'],
[self.tr('Keyfile'), 'keyfile'],
[self.tr('None (not recommended)'), 'none'],
]
for desc, name in encryption_algos:
self.encryptionComboBox.addItem(desc, name)