提交 c7dba5d6 编写于 作者: P Peter Krempa

virAuth: Don't require virConnectPtr to retrieve authentication creds

Previously a connection object was required to retrieve the auth
credentials. This patch adds the option to call the retrieval functions
only using the connection URI or path to the configuration file. This
will allow to use this toolkit to request passwords for ssh
authentication in the libssh2 connection driver.

Changes:
*virAuthGetConfigFilePathURI(): use URI to retrieve the config file path
*virAuthGetCredential(): Remove the need to propagate conn object

virAuthGetPasswordPath():
*virAuthGetUsernamePath(): New functions, that use config file path
                           instead of conn object
上级 6d986d99
......@@ -36,9 +36,9 @@
#define VIR_FROM_THIS VIR_FROM_AUTH
int virAuthGetConfigFilePath(virConnectPtr conn,
char **path)
int
virAuthGetConfigFilePathURI(virURIPtr uri,
char **path)
{
int ret = -1;
size_t i;
......@@ -56,13 +56,12 @@ int virAuthGetConfigFilePath(virConnectPtr conn,
return 0;
}
if (conn && conn->uri) {
for (i = 0; i < conn->uri->paramsCount; i++) {
if (STREQ_NULLABLE(conn->uri->params[i].name, "authfile") &&
conn->uri->params[i].value) {
VIR_DEBUG("Using path from URI '%s'",
conn->uri->params[i].value);
if (VIR_STRDUP(*path, conn->uri->params[i].value) < 0)
if (uri) {
for (i = 0; i < uri->paramsCount; i++) {
if (STREQ_NULLABLE(uri->params[i].name, "authfile") &&
uri->params[i].value) {
VIR_DEBUG("Using path from URI '%s'", uri->params[i].value);
if (VIR_STRDUP(*path, uri->params[i].value) < 0)
goto cleanup;
return 0;
}
......@@ -101,33 +100,36 @@ cleanup:
}
int
virAuthGetConfigFilePath(virConnectPtr conn,
char **path)
{
return virAuthGetConfigFilePathURI(conn ? conn->uri : NULL, path);
}
static int
virAuthGetCredential(virConnectPtr conn,
const char *servicename,
virAuthGetCredential(const char *servicename,
const char *hostname,
const char *credname,
const char *path,
char **value)
{
int ret = -1;
char *path = NULL;
virAuthConfigPtr config = NULL;
const char *tmp;
*value = NULL;
if (virAuthGetConfigFilePath(conn, &path) < 0)
goto cleanup;
if (path == NULL) {
ret = 0;
goto cleanup;
}
if (path == NULL)
return 0;
if (!(config = virAuthConfigNew(path)))
goto cleanup;
if (virAuthConfigLookup(config,
servicename,
VIR_URI_SERVER(conn->uri),
hostname,
credname,
&tmp) < 0)
goto cleanup;
......@@ -139,24 +141,23 @@ virAuthGetCredential(virConnectPtr conn,
cleanup:
virAuthConfigFree(config);
VIR_FREE(path);
return ret;
}
char *
virAuthGetUsername(virConnectPtr conn,
virConnectAuthPtr auth,
const char *servicename,
const char *defaultUsername,
const char *hostname)
virAuthGetUsernamePath(const char *path,
virConnectAuthPtr auth,
const char *servicename,
const char *defaultUsername,
const char *hostname)
{
unsigned int ncred;
virConnectCredential cred;
char *prompt;
char *ret = NULL;
if (virAuthGetCredential(conn, servicename, "username", &ret) < 0)
if (virAuthGetCredential(servicename, hostname, "username", path, &ret) < 0)
return NULL;
if (ret != NULL)
return ret;
......@@ -199,20 +200,41 @@ virAuthGetUsername(virConnectPtr conn,
}
char *
virAuthGetPassword(virConnectPtr conn,
virAuthGetUsername(virConnectPtr conn,
virConnectAuthPtr auth,
const char *servicename,
const char *username,
const char *defaultUsername,
const char *hostname)
{
char *ret;
char *path;
if (virAuthGetConfigFilePath(conn, &path) < 0)
return NULL;
ret = virAuthGetUsernamePath(path, auth, servicename,
defaultUsername, hostname);
VIR_FREE(path);
return ret;
}
char *
virAuthGetPasswordPath(const char *path,
virConnectAuthPtr auth,
const char *servicename,
const char *username,
const char *hostname)
{
unsigned int ncred;
virConnectCredential cred;
char *prompt;
char *ret = NULL;
if (virAuthGetCredential(conn, servicename, "password", &ret) < 0)
if (virAuthGetCredential(servicename, hostname, "password", path, &ret) < 0)
return NULL;
if (ret != NULL)
return ret;
......@@ -248,3 +270,24 @@ virAuthGetPassword(virConnectPtr conn,
return cred.result;
}
char *
virAuthGetPassword(virConnectPtr conn,
virConnectAuthPtr auth,
const char *servicename,
const char *username,
const char *hostname)
{
char *ret;
char *path;
if (virAuthGetConfigFilePath(conn, &path) < 0)
return NULL;
ret = virAuthGetPasswordPath(path, auth, servicename, username, hostname);
VIR_FREE(path);
return ret;
}
/*
* virauth.h: authentication related utility functions
*
* Copyright (C) 2013 Red Hat, Inc.
* Copyright (C) 2010 Matthias Bolte <matthias.bolte@googlemail.com>
*
* This library is free software; you can redistribute it and/or
......@@ -23,10 +24,15 @@
# define __VIR_AUTH_H__
# include "internal.h"
# include "viruri.h"
int virAuthGetConfigFilePath(virConnectPtr conn,
char **path);
int virAuthGetConfigFilePathURI(virURIPtr uri,
char **path);
char *virAuthGetUsername(virConnectPtr conn,
virConnectAuthPtr auth,
const char *servicename,
......@@ -37,5 +43,14 @@ char *virAuthGetPassword(virConnectPtr conn,
const char *servicename,
const char *username,
const char *hostname);
char * virAuthGetUsernamePath(const char *path,
virConnectAuthPtr auth,
const char *servicename,
const char *defaultUsername,
const char *hostname);
char * virAuthGetPasswordPath(const char *path,
virConnectAuthPtr auth,
const char *servicename,
const char *username,
const char *hostname);
#endif /* __VIR_AUTH_H__ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册