diff --git a/src/components/common/SelectInput.vue b/src/components/common/SelectInput.vue
index b249ddf9e..4ec4b957b 100644
--- a/src/components/common/SelectInput.vue
+++ b/src/components/common/SelectInput.vue
@@ -5,8 +5,7 @@
style="margin: 20px 10px"
:value="value"
:disabled="disabled"
- @input="$emit('input', $event.target.value)"
- @change="$emit('change')"
+ @change="onChange"
>
@@ -17,5 +16,20 @@ import Vue from "vue";
export default Vue.extend({
props: ["label", "value", "disabled"],
+ methods: {
+ getSelectedValue(event: Event) {
+ const target = event.target as HTMLSelectElement;
+ const selectedOption = target.options[target.selectedIndex] as
+ | (HTMLOptionElement & { _value?: unknown })
+ | undefined;
+ return selectedOption && "_value" in selectedOption
+ ? selectedOption._value
+ : target.value;
+ },
+ onChange(event: Event) {
+ this.$emit("input", this.getSelectedValue(event));
+ this.$emit("change");
+ },
+ },
});
diff --git a/src/test/components/common/SelectInput.test.ts b/src/test/components/common/SelectInput.test.ts
new file mode 100644
index 000000000..8d603035f
--- /dev/null
+++ b/src/test/components/common/SelectInput.test.ts
@@ -0,0 +1,46 @@
+import "mocha";
+import { expect } from "chai";
+import { mount } from "@vue/test-utils";
+
+import SelectInput from "../../../components/common/SelectInput.vue";
+import { KeyUtilities } from "../../../models/key-utilities";
+import { OTPAlgorithm, OTPType } from "../../../models/otp";
+
+mocha.setup("bdd");
+
+describe("SelectInput", () => {
+ it("preserves numeric option values for SHA-512 OTP generation", async () => {
+ const wrapper = mount({
+ components: { SelectInput },
+ template: `
+
+
+
+
+
+ `,
+ data() {
+ return {
+ algorithm: OTPAlgorithm.SHA1,
+ OTPAlgorithm,
+ };
+ },
+ });
+
+ await wrapper.find("select").setValue(String(OTPAlgorithm.SHA512));
+
+ expect(wrapper.vm.$data.algorithm).to.equal(OTPAlgorithm.SHA512);
+ expect(wrapper.vm.$data.algorithm).to.be.a("number");
+
+ const code = KeyUtilities.generate(
+ OTPType.hotp,
+ "blxnmpn2m2ebd4glchipydbbsclfvh553vnjqlmuqlzyxlbjsgga",
+ 41152263,
+ 30,
+ 6,
+ wrapper.vm.$data.algorithm
+ );
+
+ expect(code).to.equal("829861");
+ });
+});