}
/* create ssh session context */
- if (!(sess = virNetSSHSessionNew()))
+ if (!(sess = virNetSSHSessionNew(username)))
goto error;
/* set ssh session parameters */
const char *authMethod = *authMethodNext;
if (STRCASEEQ(authMethod, "keyboard-interactive")) {
- ret = virNetSSHSessionAuthAddKeyboardAuth(sess, username, -1);
+ ret = virNetSSHSessionAuthAddKeyboardAuth(sess, -1);
} else if (STRCASEEQ(authMethod, "password")) {
- ret = virNetSSHSessionAuthAddPasswordAuth(sess,
- uri,
- username);
+ ret = virNetSSHSessionAuthAddPasswordAuth(sess, uri);
} else if (STRCASEEQ(authMethod, "privkey")) {
- ret = virNetSSHSessionAuthAddPrivKeyAuth(sess,
- username,
- privkey);
+ ret = virNetSSHSessionAuthAddPrivKeyAuth(sess, privkey);
} else if (STRCASEEQ(authMethod, "agent")) {
- ret = virNetSSHSessionAuthAddAgentAuth(sess, username);
+ ret = virNetSSHSessionAuthAddAgentAuth(sess);
} else {
virReportError(VIR_ERR_INVALID_ARG,
_("Invalid authentication method: '%s'"),
struct _virNetSSHAuthMethod {
virNetSSHAuthMethods method;
- char *username;
char *filename;
int tries;
int port;
/* authentication stuff */
+ char *username;
virConnectAuthPtr cred;
char *authPath;
virNetSSHAuthCallbackError authCbErr;
size_t i;
for (i = 0; i < sess->nauths; i++) {
- VIR_FREE(sess->auths[i]->username);
VIR_FREE(sess->auths[i]->filename);
VIR_FREE(sess->auths[i]);
}
g_free(sess->hostname);
g_free(sess->knownHostsFile);
g_free(sess->authPath);
+ g_free(sess->username);
}
static virClass *virNetSSHSessionClass;
* -1 on error
*/
static int
-virNetSSHAuthenticateAgent(virNetSSHSession *sess,
- virNetSSHAuthMethod *priv)
+virNetSSHAuthenticateAgent(virNetSSHSession *sess)
{
struct libssh2_agent_publickey *agent_identity = NULL;
bool no_identity = true;
agent_identity))) {
no_identity = false;
if (!(ret = libssh2_agent_userauth(sess->agent,
- priv->username,
+ sess->username,
agent_identity)))
return 0; /* key accepted */
/* try open the key with no password */
if ((ret = libssh2_userauth_publickey_fromfile(sess->session,
- priv->username,
+ sess->username,
NULL,
priv->filename,
NULL)) == 0)
VIR_FREE(tmp);
ret = libssh2_userauth_publickey_fromfile(sess->session,
- priv->username,
+ sess->username,
NULL,
priv->filename,
retr_passphrase.result);
* -1 on error
*/
static int
-virNetSSHAuthenticatePassword(virNetSSHSession *sess,
- virNetSSHAuthMethod *priv)
+virNetSSHAuthenticatePassword(virNetSSHSession *sess)
{
char *password = NULL;
char *errmsg;
* connection if maximum number of bad auth tries is exceeded */
while (true) {
if (!(password = virAuthGetPasswordPath(sess->authPath, sess->cred,
- "ssh", priv->username,
+ "ssh", sess->username,
sess->hostname)))
goto cleanup;
/* tunnelled password authentication */
if ((rc = libssh2_userauth_password(sess->session,
- priv->username,
+ sess->username,
password)) == 0) {
ret = 0;
goto cleanup;
* connection if maximum number of bad auth tries is exceeded */
while (priv->tries < 0 || priv->tries-- > 0) {
ret = libssh2_userauth_keyboard_interactive(sess->session,
- priv->username,
+ sess->username,
virNetSSHKbIntCb);
/* check for errors while calling the callback */
}
/* obtain list of supported auth methods */
- auth_list = libssh2_userauth_list(sess->session,
- sess->auths[0]->username,
- strlen(sess->auths[0]->username));
+ auth_list = libssh2_userauth_list(sess->session, sess->username,
+ strlen(sess->username));
if (!auth_list) {
/* unlikely event, authentication succeeded with NONE as method */
if (libssh2_userauth_authenticated(sess->session) == 1)
break;
case VIR_NET_SSH_AUTH_AGENT:
if (strstr(auth_list, "publickey"))
- ret = virNetSSHAuthenticateAgent(sess, auth);
+ ret = virNetSSHAuthenticateAgent(sess);
break;
case VIR_NET_SSH_AUTH_PRIVKEY:
if (strstr(auth_list, "publickey"))
break;
case VIR_NET_SSH_AUTH_PASSWORD:
if (strstr(auth_list, "password"))
- ret = virNetSSHAuthenticatePassword(sess, auth);
+ ret = virNetSSHAuthenticatePassword(sess);
break;
}
int
virNetSSHSessionAuthAddPasswordAuth(virNetSSHSession *sess,
- virURI *uri,
- const char *username)
+ virURI *uri)
{
virNetSSHAuthMethod *auth;
- char *user = NULL;
if (uri) {
VIR_FREE(sess->authPath);
goto error;
}
- if (!username) {
- if (!(user = virAuthGetUsernamePath(sess->authPath, sess->cred,
- "ssh", NULL, sess->hostname)))
- goto error;
- } else {
- user = g_strdup(username);
- }
-
virObjectLock(sess);
if (!(auth = virNetSSHSessionAuthMethodNew(sess)))
goto error;
- auth->username = user;
auth->method = VIR_NET_SSH_AUTH_PASSWORD;
virObjectUnlock(sess);
return 0;
error:
- VIR_FREE(user);
virObjectUnlock(sess);
return -1;
}
int
-virNetSSHSessionAuthAddAgentAuth(virNetSSHSession *sess,
- const char *username)
+virNetSSHSessionAuthAddAgentAuth(virNetSSHSession *sess)
{
virNetSSHAuthMethod *auth;
- char *user = NULL;
-
- if (!username) {
- virReportError(VIR_ERR_SSH, "%s",
- _("Username must be provided "
- "for ssh agent authentication"));
- return -1;
- }
virObjectLock(sess);
- user = g_strdup(username);
-
if (!(auth = virNetSSHSessionAuthMethodNew(sess)))
goto error;
- auth->username = user;
auth->method = VIR_NET_SSH_AUTH_AGENT;
virObjectUnlock(sess);
return 0;
error:
- VIR_FREE(user);
virObjectUnlock(sess);
return -1;
}
int
virNetSSHSessionAuthAddPrivKeyAuth(virNetSSHSession *sess,
- const char *username,
const char *keyfile)
{
virNetSSHAuthMethod *auth;
- if (!username || !keyfile) {
+ if (!keyfile) {
virReportError(VIR_ERR_SSH, "%s",
- _("Username and key file path must be provided "
- "for private key authentication"));
+ _("Key file path must be provided for private key authentication"));
return -1;
}
return -1;
}
- auth->username = g_strdup(username);
auth->filename = g_strdup(keyfile);
auth->method = VIR_NET_SSH_AUTH_PRIVKEY;
int
virNetSSHSessionAuthAddKeyboardAuth(virNetSSHSession *sess,
- const char *username,
int tries)
{
virNetSSHAuthMethod *auth;
- char *user = NULL;
-
- if (!username) {
- virReportError(VIR_ERR_SSH, "%s",
- _("Username must be provided "
- "for ssh agent authentication"));
- return -1;
- }
virObjectLock(sess);
- user = g_strdup(username);
-
if (!(auth = virNetSSHSessionAuthMethodNew(sess)))
goto error;
- auth->username = user;
auth->tries = tries;
auth->method = VIR_NET_SSH_AUTH_KEYBOARD_INTERACTIVE;
return 0;
error:
- VIR_FREE(user);
virObjectUnlock(sess);
return -1;
}
/* allocate and initialize a ssh session object */
-virNetSSHSession *virNetSSHSessionNew(void)
+virNetSSHSession *virNetSSHSessionNew(const char *username)
{
virNetSSHSession *sess = NULL;
if (!(sess = virObjectLockableNew(virNetSSHSessionClass)))
goto error;
+ sess->username = g_strdup(username);
+
/* initialize session data, use the internal data for callbacks
* and stick to default memory management functions */
if (!(sess->session = libssh2_session_init_ex(NULL,