Skip to content

Commit 273c2a6

Browse files
saturnericCopilot
andcommitted
fix(keygen): validate algo+length selection
* Populates algorithm dropdowns via shared helper to keep metadata * Selects algorithms by name+type+key length to avoid ambiguous matches * Disables generation until both primary and secondary selections resolve * Refreshes key-length options from the selected algorithm’s typed data Co-authored-by: Copilot <copilot@github.com>
1 parent e833399 commit 273c2a6

1 file changed

Lines changed: 100 additions & 57 deletions

File tree

src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp

Lines changed: 100 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,8 @@ SubkeyGenerateDialog::SubkeyGenerateDialog(int channel, GpgKeyPtr key,
7676
ui_->expireDateTimeEdit->setDateTime(
7777
QDateTime::currentDateTime().addYears(2));
7878

79-
QSet<QString> algo_set;
80-
for (const auto& algo : supported_subkey_algos_) {
81-
algo_set.insert(algo.Name());
82-
}
83-
ui_->algoComboBox->addItems(QStringList(algo_set.cbegin(), algo_set.cend()));
79+
// populate algo combo box with supported subkey algos
80+
PopulateAlgoComboBox(ui_->algoComboBox, supported_subkey_algos_);
8481

8582
ui_->expireDateTimeEdit->setDateTime(gen_subkey_info_->GetExpireTime());
8683
ui_->expireDateTimeEdit->setDisabled(gen_subkey_info_->IsNonExpired());
@@ -152,32 +149,91 @@ void SubkeyGenerateDialog::set_signal_slot_config() {
152149
});
153150
#endif
154151

155-
connect(ui_->algoComboBox, &QComboBox::currentTextChanged, this,
156-
[=](const QString& text) -> void {
157-
auto [found, algo] = GetAlgoByName(text, supported_subkey_algos_);
158-
ui_->generateButton->setDisabled(!found);
159-
if (found) gen_subkey_info_->SetAlgo(algo);
152+
auto get_exact_algo = [this](QComboBox* algoCombo, QComboBox* lenCombo) {
153+
if (algoCombo->currentIndex() < 0) return std::make_tuple(false, KeyAlgo{});
160154

161-
refresh_widgets_state();
155+
auto data = algoCombo->currentData().toMap();
156+
QString name = data["name"].toString();
157+
QString type = data["type"].toString();
158+
int key_len = lenCombo->currentText().toInt();
159+
160+
return GetAlgoByNameTypeAndKeyLength(name, type, key_len,
161+
supported_subkey_algos_);
162+
};
163+
164+
auto validate_generate_button = [this, get_exact_algo]() -> void {
165+
auto [primaryFound, primaryAlgo] =
166+
get_exact_algo(ui_->algoComboBox, ui_->keyLengthComboBox);
167+
168+
bool secondary_found = true;
169+
if (ui_->scndAlgoComboBox->isEnabled() &&
170+
!ui_->scndAlgoComboBox->isHidden()) {
171+
auto [subFound, subAlgo] =
172+
get_exact_algo(ui_->scndAlgoComboBox, ui_->scndKeyLengthComboBox);
173+
secondary_found = subFound;
174+
}
175+
176+
ui_->generateButton->setDisabled(!(primaryFound && secondary_found));
177+
};
178+
179+
auto on_algo_changed = [this, validate_generate_button](QComboBox* algoCombo,
180+
bool is_sub_algo) {
181+
auto data = algoCombo->currentData().toMap();
182+
QString name = data["name"].toString();
183+
QString type = data["type"].toString();
184+
185+
auto [found, base_algo] =
186+
GetAlgoByNameType(name, type, supported_subkey_algos_);
187+
if (found) {
188+
if (is_sub_algo) {
189+
gen_subkey_info_->SetSubAlgo(base_algo);
190+
} else {
191+
gen_subkey_info_->SetAlgo(base_algo);
192+
}
193+
} else {
194+
if (is_sub_algo) gen_subkey_info_->SetSubAlgo(KeyGenerateInfo::kNoneAlgo);
195+
}
162196

163-
if (ui_->scndAlgoComboBox->isEnabled()) {
164-
auto [found, algo] =
165-
GetAlgoByName(ui_->scndAlgoComboBox->currentText(),
166-
supported_subkey_algos_);
167-
if (found) {
168-
gen_subkey_info_->SetSubAlgo(algo);
169-
}
170-
} else {
171-
gen_subkey_info_->SetSubAlgo(KeyGenerateInfo::kNoneAlgo);
172-
}
197+
if (is_sub_algo) {
198+
refresh_hybrid_algo_widgets_state();
199+
} else {
200+
refresh_widgets_state();
201+
}
202+
203+
validate_generate_button();
204+
};
205+
206+
auto on_length_changed = [this, get_exact_algo, validate_generate_button](
207+
QComboBox* algoCombo, QComboBox* lenCombo,
208+
bool is_sub_algo) {
209+
auto [found, exact_algo] = get_exact_algo(algoCombo, lenCombo);
210+
if (found) {
211+
if (is_sub_algo) {
212+
gen_subkey_info_->SetSubAlgo(exact_algo);
213+
} else {
214+
gen_subkey_info_->SetAlgo(exact_algo);
215+
}
216+
}
217+
validate_generate_button();
218+
};
219+
220+
connect(ui_->algoComboBox,
221+
QOverload<int>::of(&QComboBox::currentIndexChanged), this,
222+
[=](int) { on_algo_changed(ui_->algoComboBox, false); });
223+
224+
connect(ui_->scndAlgoComboBox,
225+
QOverload<int>::of(&QComboBox::currentIndexChanged), this,
226+
[=](int) { on_algo_changed(ui_->scndAlgoComboBox, true); });
227+
228+
connect(ui_->keyLengthComboBox, &QComboBox::currentTextChanged, this,
229+
[=](const QString&) {
230+
on_length_changed(ui_->algoComboBox, ui_->keyLengthComboBox, false);
173231
});
174232

175-
connect(ui_->scndAlgoComboBox, &QComboBox::currentTextChanged, this,
176-
[=](const QString& text) -> void {
177-
auto [found, algo] = GetAlgoByName(text, supported_subkey_algos_);
178-
ui_->generateButton->setDisabled(!found);
179-
if (found) gen_subkey_info_->SetSubAlgo(algo);
180-
refresh_hybrid_algo_widgets_state();
233+
connect(ui_->scndKeyLengthComboBox, &QComboBox::currentTextChanged, this,
234+
[=](const QString&) {
235+
on_length_changed(ui_->scndAlgoComboBox, ui_->scndKeyLengthComboBox,
236+
true);
181237
});
182238

183239
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
@@ -191,24 +247,6 @@ void SubkeyGenerateDialog::set_signal_slot_config() {
191247
gen_subkey_info_->SetNonPassPhrase(state == Qt::Checked);
192248
});
193249
#endif
194-
195-
connect(ui_->keyLengthComboBox, &QComboBox::currentTextChanged, this,
196-
[this](const QString& text) -> void {
197-
auto [found, algo] = GetAlgoByNameAndKeyLength(
198-
ui_->algoComboBox->currentText(), text.toInt(),
199-
supported_subkey_algos_);
200-
201-
if (found) gen_subkey_info_->SetAlgo(algo);
202-
});
203-
204-
connect(ui_->scndKeyLengthComboBox, &QComboBox::currentTextChanged, this,
205-
[this](const QString& text) -> void {
206-
auto [found, algo] = GetAlgoByNameAndKeyLength(
207-
ui_->scndAlgoComboBox->currentText(), text.toInt(),
208-
supported_subkey_algos_);
209-
210-
if (found) gen_subkey_info_->SetSubAlgo(algo);
211-
});
212250
}
213251

214252
void SubkeyGenerateDialog::refresh_widgets_state() {
@@ -217,9 +255,14 @@ void SubkeyGenerateDialog::refresh_widgets_state() {
217255
ui_->algoComboBox->blockSignals(false);
218256

219257
ui_->keyLengthComboBox->blockSignals(true);
220-
SetKeyLengthComboxBoxByAlgo(ui_->keyLengthComboBox,
221-
SearchAlgoByName(ui_->algoComboBox->currentText(),
222-
supported_subkey_algos_));
258+
259+
auto data = ui_->algoComboBox->currentData().toMap();
260+
auto name = data["name"].toString();
261+
auto type = data["type"].toString();
262+
SetKeyLengthComboxBoxByAlgo(
263+
ui_->keyLengthComboBox,
264+
SearchAlgoByNameType(name, type, supported_subkey_algos_));
265+
223266
ui_->keyLengthComboBox->setCurrentText(
224267
QString::number(gen_subkey_info_->GetKeyLength()));
225268
ui_->keyLengthComboBox->blockSignals(false);
@@ -263,13 +306,9 @@ void SubkeyGenerateDialog::refresh_widgets_state() {
263306

264307
ui_->scndAlgoComboBox->blockSignals(true);
265308
ui_->scndAlgoComboBox->clear();
266-
QSet<QString> sub_algo_names;
267-
for (const auto& algo : sub_algos) {
268-
sub_algo_names.insert(algo.Name());
269-
}
270-
for (const auto& algo_name : sub_algo_names) {
271-
ui_->scndAlgoComboBox->addItem(algo_name);
272-
}
309+
310+
PopulateAlgoComboBox(ui_->scndAlgoComboBox, sub_algos);
311+
273312
ui_->scndAlgoComboBox->blockSignals(false);
274313
} else {
275314
ui_->scndAlgoComboBox->setEnabled(false);
@@ -345,10 +384,14 @@ void SubkeyGenerateDialog::refresh_hybrid_algo_widgets_state() {
345384
ui_->scndKeyLengthComboBox->setEnabled(true);
346385
ui_->scndKeyLengthComboBox->setHidden(false);
347386
ui_->scndKeyLengthComboBox->blockSignals(true);
387+
388+
auto data = ui_->algoComboBox->currentData().toMap();
389+
auto name = data["name"].toString();
390+
auto type = data["type"].toString();
348391
SetKeyLengthComboxBoxByAlgo(
349392
ui_->scndKeyLengthComboBox,
350-
SearchAlgoByName(ui_->scndAlgoComboBox->currentText(),
351-
supported_subkey_algos_));
393+
SearchAlgoByNameType(name, type, supported_subkey_algos_));
394+
352395
ui_->scndKeyLengthComboBox->setCurrentText(
353396
QString::number(gen_subkey_info_->SubAlgo().KeyLength()));
354397
ui_->scndKeyLengthComboBox->blockSignals(false);

0 commit comments

Comments
 (0)