GUACAMOLE-514: Merge support for VNC authentication involving usernames.
diff --git a/src/protocols/vnc/auth.c b/src/protocols/vnc/auth.c
index e93dbc6..8cc6b1d 100644
--- a/src/protocols/vnc/auth.c
+++ b/src/protocols/vnc/auth.c
@@ -31,3 +31,22 @@
return ((guac_vnc_client*) gc->data)->settings->password;
}
+rfbCredential* guac_vnc_get_credentials(rfbClient* client, int credentialType) {
+ guac_client* gc = rfbClientGetClientData(client, GUAC_VNC_CLIENT_KEY);
+ guac_vnc_settings* settings = ((guac_vnc_client*) gc->data)->settings;
+
+ if (credentialType == rfbCredentialTypeUser) {
+ rfbCredential *creds = malloc(sizeof(rfbCredential));
+ creds->userCredential.username = settings->username;
+ creds->userCredential.password = settings->password;
+ return creds;
+ }
+
+ guac_client_abort(gc, GUAC_PROTOCOL_STATUS_SERVER_ERROR,
+ "Unsupported credential type requested.");
+ guac_client_log(gc, GUAC_LOG_DEBUG,
+ "Unable to provide requested type of credential: %d.",
+ credentialType);
+ return NULL;
+
+}
diff --git a/src/protocols/vnc/auth.h b/src/protocols/vnc/auth.h
index 615d80a..155a48d 100644
--- a/src/protocols/vnc/auth.h
+++ b/src/protocols/vnc/auth.h
@@ -27,7 +27,7 @@
/**
* Callback which is invoked by libVNCServer when it needs to read the user's
- * VNC password. As ths user's password, if any, will be stored in the
+ * VNC password. As this user's password, if any, will be stored in the
* connection settings, this function does nothing more than return that value.
*
* @param client
@@ -38,5 +38,23 @@
*/
char* guac_vnc_get_password(rfbClient* client);
+/**
+ * Callback which is invoked by libVNCServer when it needs to read the user's
+ * VNC credentials. The credentials are stored in the connection settings,
+ * so they will be retrieved from that.
+ *
+ * @param client
+ * The rfbClient associated with the VNC connection requiring the
+ * authentication.
+ *
+ * @param credentialType
+ * The credential type being requested, as defined by the libVNCclient
+ * code in the rfbclient.h header.
+ *
+ * @return
+ * The rfbCredential object that contains the required credentials.
+ */
+rfbCredential* guac_vnc_get_credentials(rfbClient* client, int credentialType);
+
#endif
diff --git a/src/protocols/vnc/settings.c b/src/protocols/vnc/settings.c
index a21aea8..21f6405 100644
--- a/src/protocols/vnc/settings.c
+++ b/src/protocols/vnc/settings.c
@@ -35,6 +35,7 @@
"port",
"read-only",
"encodings",
+ "username",
"password",
"swap-red-blue",
"color-depth",
@@ -109,6 +110,11 @@
IDX_ENCODINGS,
/**
+ * The username to send to the VNC server if authentication is requested.
+ */
+ IDX_USERNAME,
+
+ /**
* The password to send to the VNC server if authentication is requested.
*/
IDX_PASSWORD,
@@ -337,10 +343,14 @@
guac_user_parse_args_int(user, GUAC_VNC_CLIENT_ARGS, argv,
IDX_PORT, 0);
+ settings->username =
+ guac_user_parse_args_string(user, GUAC_VNC_CLIENT_ARGS, argv,
+ IDX_USERNAME, ""); /* NOTE: freed by libvncclient */
+
settings->password =
guac_user_parse_args_string(user, GUAC_VNC_CLIENT_ARGS, argv,
IDX_PASSWORD, ""); /* NOTE: freed by libvncclient */
-
+
/* Remote cursor */
if (strcmp(argv[IDX_CURSOR], "remote") == 0) {
guac_user_log(user, GUAC_LOG_INFO, "Cursor rendering: remote");
diff --git a/src/protocols/vnc/settings.h b/src/protocols/vnc/settings.h
index 13a3d87..34c08ec 100644
--- a/src/protocols/vnc/settings.h
+++ b/src/protocols/vnc/settings.h
@@ -46,6 +46,11 @@
int port;
/**
+ * The username given in the arguments.
+ */
+ char* username;
+
+ /**
* The password given in the arguments.
*/
char* password;
diff --git a/src/protocols/vnc/vnc.c b/src/protocols/vnc/vnc.c
index 17033a6..f33b267 100644
--- a/src/protocols/vnc/vnc.c
+++ b/src/protocols/vnc/vnc.c
@@ -153,6 +153,9 @@
}
+ /* Authentication */
+ rfb_client->GetCredential = guac_vnc_get_credentials;
+
/* Password */
rfb_client->GetPassword = guac_vnc_get_password;