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"); + }); +});