summaryrefslogtreecommitdiffstats
path: root/net/openconnect/patches/001-Allow-processing-two-passwords-from-stdin-in-non-int.patch
blob: be652f8ebe20a6daac6f8eb26802cf7bb0326dfd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
From 5f2e24fdc9935d049a7e4a5b6e10461e9467597f Mon Sep 17 00:00:00 2001
From: Nikos Mavrogiannopoulos <nmav@gnutls.org>
Date: Thu, 18 Jun 2015 22:38:05 +0200
Subject: [PATCH] Allow processing two passwords from stdin in non-interactive
 mode

Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
---
 main.c | 38 ++++++++++++++++++++++++++------------
 1 file changed, 26 insertions(+), 12 deletions(-)

diff --git a/main.c b/main.c
index 3b976d8..f853afe 100644
--- a/main.c
+++ b/main.c
@@ -85,6 +85,7 @@ static int do_passphrase_from_fsid;
 static int nocertcheck;
 static int non_inter;
 static int cookieonly;
+static int allow_stdin_read;
 
 static char *token_filename;
 static char *server_cert = NULL;
@@ -358,7 +359,7 @@ static char *convert_arg_to_utf8(char **argv, char *arg)
 #define vfprintf vfprintf_utf8
 #define is_arg_utf8(str) (0)
 
-static void read_stdin(char **string, int hidden)
+static void read_stdin(char **string, int hidden, int allow_fail)
 {
 	CONSOLE_READCONSOLE_CONTROL rcc = { sizeof(rcc), 0, 13, 0 };
 	HANDLE stdinh = GetStdHandle(STD_INPUT_HANDLE);
@@ -375,6 +376,7 @@ static void read_stdin(char **string, int hidden)
 		char *errstr = openconnect__win32_strerror(GetLastError());
 		fprintf(stderr, _("ReadConsole() failed: %s\n"), errstr);
 		free(errstr);
+		*string = NULL;
 		goto out;
 	}
 
@@ -622,7 +624,7 @@ static void print_build_opts(void)
 
 #ifndef _WIN32
 static const char default_vpncscript[] = DEFAULT_VPNCSCRIPT;
-static void read_stdin(char **string, int hidden)
+static void read_stdin(char **string, int hidden, int allow_fail)
 {
 	char *c, *buf = malloc(1025);
 	int fd = fileno(stdin);
@@ -648,8 +650,14 @@ static void read_stdin(char **string, int hidden)
 	}
 
 	if (!buf) {
-		perror(_("fgets (stdin)"));
-		exit(1);
+		if (allow_fail) {
+			*string = NULL;
+			free(buf);
+			return;
+		} else {
+			perror(_("fgets (stdin)"));
+			exit(1);
+		}
 	}
 
 	c = strchr(buf, '\n');
@@ -1160,13 +1168,14 @@ int main(int argc, char **argv)
 			cookieonly = 3;
 			break;
 		case OPT_COOKIE_ON_STDIN:
-			read_stdin(&vpninfo->cookie, 0);
+			read_stdin(&vpninfo->cookie, 0, 0);
 			/* If the cookie is empty, ignore it */
 			if (!*vpninfo->cookie)
 				vpninfo->cookie = NULL;
 			break;
 		case OPT_PASSWORD_ON_STDIN:
-			read_stdin(&password, 0);
+			read_stdin(&password, 0, 0);
+			allow_stdin_read = 1;
 			break;
 		case OPT_NO_PASSWD:
 			vpninfo->nopasswd = 1;
@@ -1708,7 +1717,7 @@ static int validate_peer_cert(void *_vpninfo, const char *reason)
 		fprintf(stderr, _("Enter '%s' to accept, '%s' to abort; anything else to view: "),
 		       _("yes"), _("no"));
 
-		read_stdin(&response, 0);
+		read_stdin(&response, 0, 0);
 		if (!response)
 			return -EINVAL;
 
@@ -1779,19 +1788,24 @@ static char *prompt_for_input(const char *prompt,
 			      struct openconnect_info *vpninfo,
 			      int hidden)
 {
-	char *response;
+	char *response = NULL;
 
 	fprintf(stderr, "%s", prompt);
 	fflush(stderr);
 
 	if (non_inter) {
-		fprintf(stderr, "***\n");
-		vpn_progress(vpninfo, PRG_ERR,
+		if (allow_stdin_read) {
+			read_stdin(&response, hidden, 1);
+		}
+		if (response == NULL) {
+			fprintf(stderr, "***\n");
+			vpn_progress(vpninfo, PRG_ERR,
 			     _("User input required in non-interactive mode\n"));
-		return NULL;
+		}
+		return response;
 	}
 
-	read_stdin(&response, hidden);
+	read_stdin(&response, hidden, 0);
 	return response;
 }
 
-- 
2.1.4