summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Färber <afaerber@suse.de>2012-08-29 20:06:01 +0200
committerYury Usishchev <y.usishchev@samsung.com>2014-12-10 13:48:36 +0300
commit8ee615f85c8e5882641f74813dafe832b029d490 (patch)
treeb3e2618447596cc2ce8bb9106b81d73a75ff6c31
parentf623468b26a9ae0e6c3f2ef06b688177050483d7 (diff)
downloadqemu-8ee615f85c8e5882641f74813dafe832b029d490.tar.gz
qemu-8ee615f85c8e5882641f74813dafe832b029d490.tar.bz2
qemu-8ee615f85c8e5882641f74813dafe832b029d490.zip
vnc: password-file= and incoming-connections=
TBD (from SUSE Studio team)
-rw-r--r--ui/vnc.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/ui/vnc.c b/ui/vnc.c
index 57070150d..f42340bef 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -47,6 +47,7 @@ static const struct timeval VNC_REFRESH_LOSSY = { 2, 0 };
#include "d3des.h"
static VncDisplay *vnc_display; /* needed for info vnc */
+static int allowed_connections = 0;
static int vnc_cursor_define(VncState *vs);
static void vnc_release_modifiers(VncState *vs);
@@ -1039,6 +1040,7 @@ static void vnc_disconnect_start(VncState *vs)
void vnc_disconnect_finish(VncState *vs)
{
int i;
+ static int num_disconnects = 0;
vnc_jobs_join(vs); /* Wait encoding jobs */
@@ -1087,6 +1089,13 @@ void vnc_disconnect_finish(VncState *vs)
}
g_free(vs->lossy_rect);
g_free(vs);
+
+ num_disconnects++;
+ if (allowed_connections > 0 && allowed_connections <= num_disconnects) {
+ VNC_DEBUG("Maximum number of disconnects (%d) reached:"
+ " Session terminating\n", allowed_connections);
+ exit(0);
+ }
}
int vnc_client_io_error(VncState *vs, int ret, int last_errno)
@@ -3050,6 +3059,39 @@ char *vnc_display_local_addr(DisplayState *ds)
return vnc_socket_local_addr("%s:%s", vs->lsock);
}
+static void read_file_password(DisplayState *ds, char *filename)
+{
+ FILE *pfile = NULL;
+ char *passwd = NULL;
+ int start = 0, length = 0, rc = 0;
+
+ if(strlen(filename) == 0) {
+ printf("No file supplied\n");
+ return;
+ }
+
+ pfile = fopen(filename, "r");
+ if(pfile == NULL) {
+ printf("Could not read from %s\n", filename);
+ return;
+ }
+
+ start = ftell(pfile);
+ fseek(pfile, 0L, SEEK_END);
+ length = ftell(pfile);
+ fseek(pfile, 0L, start);
+
+ passwd = malloc(length+1);
+ rc = fread(passwd, 1, length, pfile);
+ fclose(pfile);
+
+ if(rc == length && rc > 0) {
+ vnc_display_password(ds, passwd);
+ }
+
+ free(passwd);
+}
+
void vnc_display_open(DisplayState *ds, const char *display, Error **errp)
{
VncDisplay *vs = vnc_display;
@@ -3083,6 +3125,9 @@ void vnc_display_open(DisplayState *ds, const char *display, Error **errp)
while ((options = strchr(options, ','))) {
options++;
if (strncmp(options, "password", 8) == 0) {
+ char *start, *end;
+ start = strchr(options, '=');
+ end = strchr(options, ',');
if (fips_get_state()) {
error_setg(errp,
"VNC password auth disabled due to FIPS mode, "
@@ -3091,6 +3136,32 @@ void vnc_display_open(DisplayState *ds, const char *display, Error **errp)
goto fail;
}
password = 1; /* Require password auth */
+ if (start && (!end || (start < end))) {
+ int len = end ? end-(start+1) : strlen(start+1);
+ char *text = g_malloc(len+1);
+ strncpy(text, start+1, len);
+ text[len] = '\0';
+
+ if (strncmp(options, "password-file=", 14) == 0) {
+ read_file_password(ds, text);
+ } else {
+ vnc_display_password(ds, text);
+ }
+
+ free(text);
+ }
+ } else if (strncmp(options, "allowed-connections=", 20) == 0) {
+ char *start, *end;
+ start = strchr(options, '=');
+ end = strchr(options, ',');
+ if (start && (!end || (start < end))) {
+ int len = end ? end-(start+1) : strlen(start+1);
+ char *text = g_malloc(len+1);
+ strncpy(text, start+1, len);
+ text[len] = '\0';
+ VNC_DEBUG("Maximum number of disconnects: %s\n", text);
+ allowed_connections = atoi(text);
+ }
} else if (strncmp(options, "reverse", 7) == 0) {
reverse = 1;
} else if (strncmp(options, "no-lock-key-sync", 16) == 0) {