options: Introduce ssh_bind_options_parse_config()
The added API allows setting the options of a given bind context through a configuration file. The default global configuration file "/etc/ssh/libssh_server_config" is parsed before the provided configuration file, if it hasn't been parsed yet. Signed-off-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com> Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
Этот коммит содержится в:
родитель
bab4d2b77b
Коммит
fd25beff68
@ -46,6 +46,7 @@ struct ssh_bind_struct {
|
|||||||
unsigned int bindport;
|
unsigned int bindport;
|
||||||
int blocking;
|
int blocking;
|
||||||
int toaccept;
|
int toaccept;
|
||||||
|
bool config_processed;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ssh_poll_handle_struct *ssh_bind_get_poll(struct ssh_bind_struct
|
struct ssh_poll_handle_struct *ssh_bind_get_poll(struct ssh_bind_struct
|
||||||
|
@ -90,6 +90,9 @@ LIBSSH_API ssh_bind ssh_bind_new(void);
|
|||||||
LIBSSH_API int ssh_bind_options_set(ssh_bind sshbind,
|
LIBSSH_API int ssh_bind_options_set(ssh_bind sshbind,
|
||||||
enum ssh_bind_options_e type, const void *value);
|
enum ssh_bind_options_e type, const void *value);
|
||||||
|
|
||||||
|
LIBSSH_API int ssh_bind_options_parse_config(ssh_bind sshbind,
|
||||||
|
const char *filename);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Start listening to the socket.
|
* @brief Start listening to the socket.
|
||||||
*
|
*
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#ifdef WITH_SERVER
|
#ifdef WITH_SERVER
|
||||||
#include "libssh/server.h"
|
#include "libssh/server.h"
|
||||||
#include "libssh/bind.h"
|
#include "libssh/bind.h"
|
||||||
|
#include "libssh/bind_config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1894,6 +1895,49 @@ int ssh_bind_options_set(ssh_bind sshbind, enum ssh_bind_options_e type,
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Parse a ssh bind options configuration file.
|
||||||
|
*
|
||||||
|
* This parses the options file and set them to the ssh_bind handle provided. If
|
||||||
|
* an option was previously set, it is overridden. If the global configuration
|
||||||
|
* hasn't been processed yet, it is processed prior to the provided file.
|
||||||
|
*
|
||||||
|
* @param sshbind SSH bind handle
|
||||||
|
*
|
||||||
|
* @param filename The options file to use; if NULL only the global
|
||||||
|
* configuration is parsed and applied (if it haven't been
|
||||||
|
* processed before).
|
||||||
|
*
|
||||||
|
* @return 0 on success, < 0 on error.
|
||||||
|
*/
|
||||||
|
int ssh_bind_options_parse_config(ssh_bind sshbind, const char *filename)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
if (sshbind == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the global default configuration hasn't been processed yet, process it
|
||||||
|
* before the provided configuration. */
|
||||||
|
if (!(sshbind->config_processed)) {
|
||||||
|
rc = ssh_bind_config_parse_file(sshbind,
|
||||||
|
"/etc/ssh/libssh_server_config");
|
||||||
|
if (rc != 0) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
sshbind->config_processed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filename != NULL) {
|
||||||
|
/* Apply the user provided configuration */
|
||||||
|
rc = ssh_bind_config_parse_file(sshbind, filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <libssh/options.h>
|
#include <libssh/options.h>
|
||||||
#ifdef WITH_SERVER
|
#ifdef WITH_SERVER
|
||||||
#include <libssh/bind.h>
|
#include <libssh/bind.h>
|
||||||
|
#define LIBSSH_CUSTOM_BIND_CONFIG_FILE "my_bind_config"
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_DSA
|
#ifdef HAVE_DSA
|
||||||
#define LIBSSH_DSA_TESTKEY "libssh_testkey.id_dsa"
|
#define LIBSSH_DSA_TESTKEY "libssh_testkey.id_dsa"
|
||||||
@ -751,7 +752,7 @@ struct bind_st {
|
|||||||
ssh_bind bind;
|
ssh_bind bind;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int setup_key_files(void **state)
|
static int ssh_bind_setup_files(void **state)
|
||||||
{
|
{
|
||||||
struct bind_st *test_state = NULL;
|
struct bind_st *test_state = NULL;
|
||||||
char *cwd = NULL;
|
char *cwd = NULL;
|
||||||
@ -792,6 +793,8 @@ static int setup_key_files(void **state)
|
|||||||
torture_write_file(LIBSSH_DSA_TESTKEY,
|
torture_write_file(LIBSSH_DSA_TESTKEY,
|
||||||
torture_get_openssh_testkey(SSH_KEYTYPE_DSS, 0, 0));
|
torture_get_openssh_testkey(SSH_KEYTYPE_DSS, 0, 0));
|
||||||
#endif
|
#endif
|
||||||
|
torture_write_file(LIBSSH_CUSTOM_BIND_CONFIG_FILE,
|
||||||
|
"Port 42\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -802,7 +805,7 @@ static int sshbind_setup(void **state)
|
|||||||
int rc;
|
int rc;
|
||||||
struct bind_st *test_state = NULL;
|
struct bind_st *test_state = NULL;
|
||||||
|
|
||||||
rc = setup_key_files((void **)&test_state);
|
rc = ssh_bind_setup_files((void **)&test_state);
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
assert_non_null(test_state);
|
assert_non_null(test_state);
|
||||||
|
|
||||||
@ -1294,6 +1297,23 @@ static void torture_bind_options_set_macs(void **state)
|
|||||||
assert_int_not_equal(rc, 0);
|
assert_int_not_equal(rc, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void torture_bind_options_parse_config(void **state)
|
||||||
|
{
|
||||||
|
struct bind_st *test_state;
|
||||||
|
ssh_bind bind;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
assert_non_null(state);
|
||||||
|
test_state = *((struct bind_st **)state);
|
||||||
|
assert_non_null(test_state);
|
||||||
|
assert_non_null(test_state->bind);
|
||||||
|
bind = test_state->bind;
|
||||||
|
|
||||||
|
rc = ssh_bind_options_parse_config(bind, LIBSSH_CUSTOM_BIND_CONFIG_FILE);
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
assert_int_equal(bind->bindport, 42);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* WITH_SERVER */
|
#endif /* WITH_SERVER */
|
||||||
|
|
||||||
|
|
||||||
@ -1359,6 +1379,8 @@ int torture_run_tests(void) {
|
|||||||
sshbind_setup, sshbind_teardown),
|
sshbind_setup, sshbind_teardown),
|
||||||
cmocka_unit_test_setup_teardown(torture_bind_options_set_macs,
|
cmocka_unit_test_setup_teardown(torture_bind_options_set_macs,
|
||||||
sshbind_setup, sshbind_teardown),
|
sshbind_setup, sshbind_teardown),
|
||||||
|
cmocka_unit_test_setup_teardown(torture_bind_options_parse_config,
|
||||||
|
sshbind_setup, sshbind_teardown),
|
||||||
};
|
};
|
||||||
#endif /* WITH_SERVER */
|
#endif /* WITH_SERVER */
|
||||||
|
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user