X-Git-Url: https://git.proxmox.com/?p=vncterm.git;a=blobdiff_plain;f=vncterm.c;h=7fb424fb17ee2ea2d8db04f7baf92c58a1f19598;hp=0e33791e2a095ff181320c447ba94c4e9eb998a4;hb=33a537dc6bc6c9e1912f624c263deabf57ba3ee3;hpb=df4b12152dd24de0acc420407aedf85541a87c6d diff --git a/vncterm.c b/vncterm.c index 0e33791..7fb424f 100644 --- a/vncterm.c +++ b/vncterm.c @@ -50,6 +50,9 @@ char *auth_path = "/"; char *auth_perm = "Sys.Console"; +uint16_t screen_width = 744; +uint16_t screen_height = 400; + int use_x509 = 1; static char * @@ -256,7 +259,11 @@ tls_initialize_anon_cred(void) return NULL; } +#if GNUTLS_VERSION_NUMBER >= 0x030506 + gnutls_anon_set_server_known_dh_params(anon_cred, GNUTLS_SEC_PARAM_MEDIUM); +#else gnutls_anon_set_server_dh_params(anon_cred, dh_params); +#endif return anon_cred; } @@ -290,8 +297,13 @@ tls_initialize_x509_cred(void) gnutls_certificate_free_credentials(x509_cred); return NULL; } - +#if GNUTLS_VERSION_NUMBER >= 0x030506 + /* only available since GnuTLS 3.5.6, on previous versions see + * gnutls_certificate_set_dh_params(). */ + gnutls_certificate_set_known_dh_params(x509_cred, GNUTLS_SEC_PARAM_MEDIUM); +#else gnutls_certificate_set_dh_params (x509_cred, dh_params); +#endif return x509_cred; } @@ -485,42 +497,10 @@ rfbVncAuthVencrypt(rfbClientPtr cl) return; } - /* optimize for speed */ - static const int cipher_priority_performance[] = { - GNUTLS_CIPHER_ARCFOUR_128, - GNUTLS_CIPHER_AES_128_CBC, - GNUTLS_CIPHER_3DES_CBC, 0 - }; - - if ((ret = gnutls_cipher_set_priority(sd->session, cipher_priority_performance)) < 0) { - rfbLog("gnutls_cipher_set_priority failed: %s\n", gnutls_strerror(ret)); - sd->session = NULL; - rfbCloseClient(cl); - return; - } - - static const int kx_anon[] = {GNUTLS_KX_ANON_DH, 0}; - static const int kx_x509[] = {GNUTLS_KX_DHE_DSS, GNUTLS_KX_RSA, GNUTLS_KX_DHE_RSA, GNUTLS_KX_SRP, 0}; - if ((ret = gnutls_kx_set_priority(sd->session, use_x509 ? kx_x509 : kx_anon)) < 0) { - rfbLog("gnutls_kx_set_priority failed: %s\n", gnutls_strerror(ret)); - sd->session = NULL; - rfbCloseClient(cl); - return; - } - - static const int cert_type_priority[] = { GNUTLS_CRT_X509, 0 }; - if ((ret = gnutls_certificate_type_set_priority(sd->session, cert_type_priority)) < 0) { - rfbLog("gnutls_certificate_type_set_priority failed: %s\n", - gnutls_strerror(ret)); - sd->session = NULL; - rfbCloseClient(cl); - return; - } - - static const int protocol_priority[]= { GNUTLS_TLS1_1, GNUTLS_TLS1_0, GNUTLS_SSL3, 0 }; - if ((ret = gnutls_protocol_set_priority(sd->session, protocol_priority)) < 0) { - rfbLog("gnutls_protocol_set_priority failed: %s\n", - gnutls_strerror(ret)); + static const char *priority_str_x509 = "NORMAL"; + static const char *priority_str_anon = "NORMAL:+ANON-ECDH:+ANON-DH"; + if ((ret = gnutls_priority_set_direct(sd->session, use_x509 ? priority_str_x509 : priority_str_anon, NULL)) < 0) { + rfbLog("gnutls_priority_set_direct failed: %s\n", gnutls_strerror(ret)); sd->session = NULL; rfbCloseClient(cl); return; @@ -1377,6 +1357,7 @@ vncterm_putchar (vncTerm *vt, unicode ch) } break; } else if (ch == ';') { + vt->esc_has_par = 1; vt->esc_count++; break; } else { @@ -1427,10 +1408,7 @@ vncterm_putchar (vncTerm *vt, unicode ch) if (vt->esc_buf[0] == 0) { vt->esc_buf[0] = 1; } - vt->cy -= vt->esc_buf[0]; - if (vt->cy < 0) { - vt->cy = 0; - } + vncterm_gotoxy (vt, vt->cx, vt->cy - vt->esc_buf[0]); break; case 'B': case 'e': @@ -1438,10 +1416,7 @@ vncterm_putchar (vncTerm *vt, unicode ch) if (vt->esc_buf[0] == 0) { vt->esc_buf[0] = 1; } - vt->cy += vt->esc_buf[0]; - if (vt->cy >= vt->height) { - vt->cy = vt->height - 1; - } + vncterm_gotoxy (vt, vt->cx, vt->cy + vt->esc_buf[0]); break; case 'C': case 'a': @@ -1449,20 +1424,14 @@ vncterm_putchar (vncTerm *vt, unicode ch) if (vt->esc_buf[0] == 0) { vt->esc_buf[0] = 1; } - vt->cx += vt->esc_buf[0]; - if (vt->cx >= vt->width) { - vt->cx = vt->width - 1; - } + vncterm_gotoxy (vt, vt->cx + vt->esc_buf[0], vt->cy); break; case 'D': /* move cursor left */ if (vt->esc_buf[0] == 0) { vt->esc_buf[0] = 1; } - vt->cx -= vt->esc_buf[0]; - if (vt->cx < 0) { - vt->cx = 0; - } + vncterm_gotoxy (vt, vt->cx - vt->esc_buf[0], vt->cy); break; case 'G': case '`': @@ -1812,7 +1781,11 @@ vncterm_puts (vncTerm *vt, const char *buf, int len) vt->utf_char = (vt->utf_char << 6) | (c & 0x3f); vt->utf_count--; if (vt->utf_count == 0) { - tc = vt->utf_char; + if (vt->utf_char <= USHRT_MAX) { + tc = vt->utf_char; + } else { + tc = 0; + } } else { continue; } @@ -2304,6 +2277,8 @@ main (int argc, char** argv) struct timeval tv, tv1; time_t elapsed, cur_time; struct winsize dimensions; + unsigned long width = 0; + unsigned long height = 0; if (gnutls_global_init () < 0) { fprintf(stderr, "gnutls_global_init failed\n"); @@ -2343,6 +2318,22 @@ main (int argc, char** argv) CHECK_ARGC (argc, argv, i); auth_perm = argv[i+1]; rfbPurgeArguments(&argc, &i, 2, argv); i--; + } else if (!strcmp (argv[i], "-width")) { + CHECK_ARGC (argc, argv, i); + errno = 0; + width = strtoul(argv[i+1], NULL, 10); + if (errno == 0 && width >= 16 && width < 0xFFFF) { + screen_width = width; + } + rfbPurgeArguments(&argc, &i, 2, argv); i--; + } else if (!strcmp (argv[i], "-height")) { + CHECK_ARGC (argc, argv, i); + errno = 0; + height = strtoul(argv[i+1], NULL, 10); + if (errno == 0 && height >= 32 && height < 0xFFFF) { + screen_height = height; + } + rfbPurgeArguments(&argc, &i, 2, argv); i--; } else if (!strcmp (argv[i], "-notls")) { rfbPurgeArguments(&argc, &i, 1, argv); i--; if ((vncticket = getenv("PVE_VNC_TICKET")) == NULL) { @@ -2362,7 +2353,7 @@ main (int argc, char** argv) rfbLogEnable (0); #endif - vncTerm *vt = create_vncterm (argc, argv, 745, 400); + vncTerm *vt = create_vncterm (argc, argv, screen_width, screen_height); setlocale(LC_ALL, ""); // set from environment