|
|
8118d1 |
From 0ad0732b8fbacd3519b4e3ecf8c394681b314672 Mon Sep 17 00:00:00 2001
|
|
|
8118d1 |
From: "Alexander V. Lukyanov" <lavv17f@gmail.com>
|
|
|
8118d1 |
Date: Thu, 5 Dec 2019 21:34:11 +0300
|
|
|
8118d1 |
Subject: [PATCH] SSH_Access: fixed yes/no/[fingerprint] recognition (fix #547,
|
|
|
8118d1 |
fix #525)
|
|
|
8118d1 |
|
|
|
8118d1 |
---
|
|
|
8118d1 |
src/SSH_Access.cc | 9 ++++++++-
|
|
|
8118d1 |
1 file changed, 8 insertions(+), 1 deletion(-)
|
|
|
8118d1 |
|
|
|
8118d1 |
diff --git a/src/SSH_Access.cc b/src/SSH_Access.cc
|
|
|
8118d1 |
index 97683a3f..adf0c196 100644
|
|
|
8118d1 |
--- a/src/SSH_Access.cc
|
|
|
8118d1 |
+++ b/src/SSH_Access.cc
|
|
|
8118d1 |
@@ -20,6 +20,8 @@
|
|
|
8118d1 |
#include <config.h>
|
|
|
8118d1 |
#include "SSH_Access.h"
|
|
|
8118d1 |
#include "misc.h"
|
|
|
8118d1 |
+#include <algorithm>
|
|
|
8118d1 |
+#include "ascii_ctype.h"
|
|
|
8118d1 |
|
|
|
8118d1 |
void SSH_Access::MakePtyBuffers()
|
|
|
8118d1 |
{
|
|
|
8118d1 |
@@ -70,6 +70,26 @@ static bool IsPasswordPrompt(const char *b,const char *e)
|
|
|
8118d1 |
return (e-b>=len && !strncasecmp(b,suffix,len));
|
|
|
8118d1 |
}
|
|
|
8118d1 |
|
|
|
8118d1 |
+struct nocase_eq
|
|
|
8118d1 |
+{
|
|
|
8118d1 |
+ inline bool operator() (char lhs, char rhs) const
|
|
|
8118d1 |
+ {
|
|
|
8118d1 |
+ return c_tolower(lhs) == c_tolower(rhs);
|
|
|
8118d1 |
+ };
|
|
|
8118d1 |
+};
|
|
|
8118d1 |
+
|
|
|
8118d1 |
+static bool contains(char const *begin, char const *end, char const *needle)
|
|
|
8118d1 |
+{
|
|
|
8118d1 |
+ return std::search(begin, end, needle, needle+strlen(needle), nocase_eq()) != end;
|
|
|
8118d1 |
+}
|
|
|
8118d1 |
+
|
|
|
8118d1 |
+static bool IsConfirmPrompt(const char *b,const char *e)
|
|
|
8118d1 |
+{
|
|
|
8118d1 |
+ if(b==e)
|
|
|
8118d1 |
+ return false;
|
|
|
8118d1 |
+ return e[-1]=='?' && contains(b,e,"yes/no");
|
|
|
8118d1 |
+}
|
|
|
8118d1 |
+
|
|
|
8118d1 |
int SSH_Access::HandleSSHMessage()
|
|
|
8118d1 |
{
|
|
|
8118d1 |
int m=STALL;
|
|
|
8118d1 |
@@ -99,7 +106,7 @@ int SSH_Access::HandleSSHMessage()
|
|
|
8118d1 |
password_sent++;
|
|
|
8118d1 |
return m;
|
|
|
8118d1 |
}
|
|
|
8118d1 |
- if(ends_with(b,b+s,"(yes/no)?"))
|
|
|
8118d1 |
+ if(IsConfirmPrompt(b,b+s))
|
|
|
8118d1 |
{
|
|
|
8118d1 |
const char *answer=QueryBool("auto-confirm",hostname)?"yes\n":"no\n";
|
|
|
8118d1 |
pty_recv_buf->Put(answer);
|