diff options
author | Andreas Färber <afaerber@suse.de> | 2012-08-29 20:06:01 +0200 |
---|---|---|
committer | Yury Usishchev <y.usishchev@samsung.com> | 2014-12-10 13:48:36 +0300 |
commit | 8ee615f85c8e5882641f74813dafe832b029d490 (patch) | |
tree | b3e2618447596cc2ce8bb9106b81d73a75ff6c31 | |
parent | f623468b26a9ae0e6c3f2ef06b688177050483d7 (diff) | |
download | qemu-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.c | 71 |
1 files changed, 71 insertions, 0 deletions
@@ -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) { |