ui: split setup of VNC auth scheme into separate method
The vnc_display_open method is quite long and complex, so move the VNC auth scheme decision logic into a separate method for clarity. Also update the comment to better describe what we are trying to achieve. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
d169f04b8b
commit
0dd72e1531
153
ui/vnc.c
153
ui/vnc.c
|
@ -3314,6 +3314,96 @@ static QemuOptsList qemu_vnc_opts = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
vnc_display_setup_auth(VncDisplay *vs,
|
||||||
|
bool password,
|
||||||
|
bool sasl,
|
||||||
|
bool tls,
|
||||||
|
bool x509)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* We have a choice of 3 authentication options
|
||||||
|
*
|
||||||
|
* 1. none
|
||||||
|
* 2. vnc
|
||||||
|
* 3. sasl
|
||||||
|
*
|
||||||
|
* The channel can be run in 2 modes
|
||||||
|
*
|
||||||
|
* 1. clear
|
||||||
|
* 2. tls
|
||||||
|
*
|
||||||
|
* And TLS can use 2 types of credentials
|
||||||
|
*
|
||||||
|
* 1. anon
|
||||||
|
* 2. x509
|
||||||
|
*
|
||||||
|
* We thus have 9 possible logical combinations
|
||||||
|
*
|
||||||
|
* 1. clear + none
|
||||||
|
* 2. clear + vnc
|
||||||
|
* 3. clear + sasl
|
||||||
|
* 4. tls + anon + none
|
||||||
|
* 5. tls + anon + vnc
|
||||||
|
* 6. tls + anon + sasl
|
||||||
|
* 7. tls + x509 + none
|
||||||
|
* 8. tls + x509 + vnc
|
||||||
|
* 9. tls + x509 + sasl
|
||||||
|
*
|
||||||
|
* These need to be mapped into the VNC auth schemes
|
||||||
|
* in an appropriate manner. In regular VNC, all the
|
||||||
|
* TLS options get mapped into VNC_AUTH_VENCRYPT
|
||||||
|
* sub-auth types.
|
||||||
|
*/
|
||||||
|
if (password) {
|
||||||
|
if (tls) {
|
||||||
|
vs->auth = VNC_AUTH_VENCRYPT;
|
||||||
|
if (x509) {
|
||||||
|
VNC_DEBUG("Initializing VNC server with x509 password auth\n");
|
||||||
|
vs->subauth = VNC_AUTH_VENCRYPT_X509VNC;
|
||||||
|
} else {
|
||||||
|
VNC_DEBUG("Initializing VNC server with TLS password auth\n");
|
||||||
|
vs->subauth = VNC_AUTH_VENCRYPT_TLSVNC;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
VNC_DEBUG("Initializing VNC server with password auth\n");
|
||||||
|
vs->auth = VNC_AUTH_VNC;
|
||||||
|
vs->subauth = VNC_AUTH_INVALID;
|
||||||
|
}
|
||||||
|
} else if (sasl) {
|
||||||
|
if (tls) {
|
||||||
|
vs->auth = VNC_AUTH_VENCRYPT;
|
||||||
|
if (x509) {
|
||||||
|
VNC_DEBUG("Initializing VNC server with x509 SASL auth\n");
|
||||||
|
vs->subauth = VNC_AUTH_VENCRYPT_X509SASL;
|
||||||
|
} else {
|
||||||
|
VNC_DEBUG("Initializing VNC server with TLS SASL auth\n");
|
||||||
|
vs->subauth = VNC_AUTH_VENCRYPT_TLSSASL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
VNC_DEBUG("Initializing VNC server with SASL auth\n");
|
||||||
|
vs->auth = VNC_AUTH_SASL;
|
||||||
|
vs->subauth = VNC_AUTH_INVALID;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (tls) {
|
||||||
|
vs->auth = VNC_AUTH_VENCRYPT;
|
||||||
|
if (x509) {
|
||||||
|
VNC_DEBUG("Initializing VNC server with x509 no auth\n");
|
||||||
|
vs->subauth = VNC_AUTH_VENCRYPT_X509NONE;
|
||||||
|
} else {
|
||||||
|
VNC_DEBUG("Initializing VNC server with TLS no auth\n");
|
||||||
|
vs->subauth = VNC_AUTH_VENCRYPT_TLSNONE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
VNC_DEBUG("Initializing VNC server with no auth\n");
|
||||||
|
vs->auth = VNC_AUTH_NONE;
|
||||||
|
vs->subauth = VNC_AUTH_INVALID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void vnc_display_open(const char *id, Error **errp)
|
void vnc_display_open(const char *id, Error **errp)
|
||||||
{
|
{
|
||||||
VncDisplay *vs = vnc_display_find(id);
|
VncDisplay *vs = vnc_display_find(id);
|
||||||
|
@ -3506,68 +3596,7 @@ void vnc_display_open(const char *id, Error **errp)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
vnc_display_setup_auth(vs, password, sasl, tls, x509);
|
||||||
* Combinations we support here:
|
|
||||||
*
|
|
||||||
* - no-auth (clear text, no auth)
|
|
||||||
* - password (clear text, weak auth)
|
|
||||||
* - sasl (encrypt, good auth *IF* using Kerberos via GSSAPI)
|
|
||||||
* - tls (encrypt, weak anonymous creds, no auth)
|
|
||||||
* - tls + password (encrypt, weak anonymous creds, weak auth)
|
|
||||||
* - tls + sasl (encrypt, weak anonymous creds, good auth)
|
|
||||||
* - tls + x509 (encrypt, good x509 creds, no auth)
|
|
||||||
* - tls + x509 + password (encrypt, good x509 creds, weak auth)
|
|
||||||
* - tls + x509 + sasl (encrypt, good x509 creds, good auth)
|
|
||||||
*
|
|
||||||
* NB1. TLS is a stackable auth scheme.
|
|
||||||
* NB2. the x509 schemes have option to validate a client cert dname
|
|
||||||
*/
|
|
||||||
if (password) {
|
|
||||||
if (tls) {
|
|
||||||
vs->auth = VNC_AUTH_VENCRYPT;
|
|
||||||
if (x509) {
|
|
||||||
VNC_DEBUG("Initializing VNC server with x509 password auth\n");
|
|
||||||
vs->subauth = VNC_AUTH_VENCRYPT_X509VNC;
|
|
||||||
} else {
|
|
||||||
VNC_DEBUG("Initializing VNC server with TLS password auth\n");
|
|
||||||
vs->subauth = VNC_AUTH_VENCRYPT_TLSVNC;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
VNC_DEBUG("Initializing VNC server with password auth\n");
|
|
||||||
vs->auth = VNC_AUTH_VNC;
|
|
||||||
vs->subauth = VNC_AUTH_INVALID;
|
|
||||||
}
|
|
||||||
} else if (sasl) {
|
|
||||||
if (tls) {
|
|
||||||
vs->auth = VNC_AUTH_VENCRYPT;
|
|
||||||
if (x509) {
|
|
||||||
VNC_DEBUG("Initializing VNC server with x509 SASL auth\n");
|
|
||||||
vs->subauth = VNC_AUTH_VENCRYPT_X509SASL;
|
|
||||||
} else {
|
|
||||||
VNC_DEBUG("Initializing VNC server with TLS SASL auth\n");
|
|
||||||
vs->subauth = VNC_AUTH_VENCRYPT_TLSSASL;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
VNC_DEBUG("Initializing VNC server with SASL auth\n");
|
|
||||||
vs->auth = VNC_AUTH_SASL;
|
|
||||||
vs->subauth = VNC_AUTH_INVALID;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (tls) {
|
|
||||||
vs->auth = VNC_AUTH_VENCRYPT;
|
|
||||||
if (x509) {
|
|
||||||
VNC_DEBUG("Initializing VNC server with x509 no auth\n");
|
|
||||||
vs->subauth = VNC_AUTH_VENCRYPT_X509NONE;
|
|
||||||
} else {
|
|
||||||
VNC_DEBUG("Initializing VNC server with TLS no auth\n");
|
|
||||||
vs->subauth = VNC_AUTH_VENCRYPT_TLSNONE;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
VNC_DEBUG("Initializing VNC server with no auth\n");
|
|
||||||
vs->auth = VNC_AUTH_NONE;
|
|
||||||
vs->subauth = VNC_AUTH_INVALID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_VNC_SASL
|
#ifdef CONFIG_VNC_SASL
|
||||||
if ((saslErr = sasl_server_init(NULL, "qemu")) != SASL_OK) {
|
if ((saslErr = sasl_server_init(NULL, "qemu")) != SASL_OK) {
|
||||||
|
|
Loading…
Reference in New Issue