mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-31 15:45:23 +00:00
fix: ask for a push/TOTP menu choice as text instead of a push confirm
This commit is contained in:
1 parent
42c5682243
commit
1466c7bcab
2 files changed
+34
-6
No files matched your search
@@ -21,10 +21,13 @@ const PASSWORD_PATTERN = /password/i;
|
|||||||
// because its text also says "push notification".
|
// because its text also says "push notification".
|
||||||
const FORTI_TOKEN_PATTERN = /type\s+['"]?push['"]?/i;
|
const FORTI_TOKEN_PATTERN = /type\s+['"]?push['"]?/i;
|
||||||
|
|
||||||
// JumpCloud Protect / DUO: a menu choice, then an empty-answerable confirm.
|
// JumpCloud Protect / DUO: a menu choice answered with a number, then an
|
||||||
// Checked before TOTP because "...or [2] TOTP:" would match that pattern.
|
// empty-answerable confirm. Checked before TOTP because "...or [2] TOTP:"
|
||||||
|
// would match that pattern. The menu needs a text field, so it is not a push.
|
||||||
|
const PUSH_MENU_PATTERN = /choose.*push.*totp/i;
|
||||||
|
|
||||||
const PUSH_PROMPT_PATTERN =
|
const PUSH_PROMPT_PATTERN =
|
||||||
/choose.*push.*totp|press enter.*(push|send)|push notification|authentication by phone/i;
|
/press enter.*(push|send)|push notification|authentication by phone/i;
|
||||||
|
|
||||||
const TOTP_PATTERN =
|
const TOTP_PATTERN =
|
||||||
/verification code|verification_code|token|otp|2fa|authenticator|google.*auth/i;
|
/verification code|verification_code|token|otp|2fa|authenticator|google.*auth/i;
|
||||||
@@ -77,10 +80,11 @@ export function classifyKeyboardInteractive(
|
|||||||
const { prompts } = round;
|
const { prompts } = round;
|
||||||
const texts = prompts.map((p) => p.prompt);
|
const texts = prompts.map((p) => p.prompt);
|
||||||
const isFortiToken = texts.some((p) => FORTI_TOKEN_PATTERN.test(p));
|
const isFortiToken = texts.some((p) => FORTI_TOKEN_PATTERN.test(p));
|
||||||
const isPush =
|
const isPushFlow =
|
||||||
!isFortiToken && texts.some((p) => PUSH_PROMPT_PATTERN.test(p));
|
!isFortiToken &&
|
||||||
|
texts.some((p) => PUSH_MENU_PATTERN.test(p) || PUSH_PROMPT_PATTERN.test(p));
|
||||||
|
|
||||||
if (!isPush) {
|
if (!isPushFlow) {
|
||||||
const totpIndex = prompts.findIndex((p) => TOTP_PATTERN.test(p.prompt));
|
const totpIndex = prompts.findIndex((p) => TOTP_PATTERN.test(p.prompt));
|
||||||
if (totpIndex !== -1) return { kind: "totp", promptIndex: totpIndex };
|
if (totpIndex !== -1) return { kind: "totp", promptIndex: totpIndex };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -556,6 +556,30 @@ describe("ctx.auth", () => {
|
|||||||
).not.toBe("browser");
|
).not.toBe("browser");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("asks for a push/TOTP menu choice as text and a press-enter confirm as a push", () => {
|
||||||
|
const host = { id: 1, ip: "10.0.0.1", port: 22, username: "root" };
|
||||||
|
expect(
|
||||||
|
classifyKeyboardInteractive(
|
||||||
|
{
|
||||||
|
name: "",
|
||||||
|
instructions: "",
|
||||||
|
prompts: [{ prompt: "Choose [1] Push, or [2] TOTP: ", echo: true }],
|
||||||
|
},
|
||||||
|
host,
|
||||||
|
),
|
||||||
|
).toEqual({ kind: "input", promptIndex: 0, isPush: false });
|
||||||
|
expect(
|
||||||
|
classifyKeyboardInteractive(
|
||||||
|
{
|
||||||
|
name: "",
|
||||||
|
instructions: "",
|
||||||
|
prompts: [{ prompt: "Press enter to send push", echo: false }],
|
||||||
|
},
|
||||||
|
host,
|
||||||
|
),
|
||||||
|
).toEqual({ kind: "input", promptIndex: 0, isPush: true });
|
||||||
|
});
|
||||||
|
|
||||||
it("refuses a keyboard-interactive handler that is not declared", () => {
|
it("refuses a keyboard-interactive handler that is not declared", () => {
|
||||||
const auth = createPluginAuth({
|
const auth = createPluginAuth({
|
||||||
manifest: manifest(["auth:provide"], { keyboardInteractive: ["gate"] }),
|
manifest: manifest(["auth:provide"], { keyboardInteractive: ["gate"] }),
|
||||||
|
|||||||
Reference in new issue
Block a user