Hey, This is my first patch to subversion, so please bear with me.
This looks to address a very commonly requested feature: providing an alternative for automated tools to provide a password to svn via piping it in over an fd (similar to gnupg). One outstanding concern that I couldn't find addressed is clearing out memory that once contained passwords (like with memset_s or explicit_bzero). If I missed a technique for doing this that exists in svn already, please let me know so I can update the diff. Tested on Fedora 25 x86_64 and OpenBSD 6.1 x86_64. Please CC me; I'm not on this list. [[[ Introduce global opt --password-fd to allow applications to provide a password over an already-opened file descriptor. * subversion/include/svn_cmdline.h (svn_cmdline_create_auth_baton2): Add `auth_password_fd` argument * subversion/include/svn_error_codes.h (SVN_ERR_IO_PIPE_READ_ERROR): Undeprecate, as now used * subversion/libsvn_subr/cmdline.c (read_pass_from_fd): Add static function to get password from a file descriptor (svn_cmdline_create_auth_baton2): Add `auth_password_fd` arg and trigger read of fd if this arg is not -1 * subversion/libsvn_subr/deprecated.c: (svn_cmdline_create_auth_baton): Add default val of -1 when calling `svn_cmdline_create_auth_baton2` * subversion/svn/svn.c (svn_cl__longopt_t): Add `opt_auth_password_fd` longopt (svn_cl__global_options): Add `opt_auth_password_fd` to global options (sub_main): Process global option `opt_auth_password_fd` and pass it to `svn_cmdline_create_auth_baton2` * subversion/svnmucc/svnmucc.c (sub_main): Process global option `opt_auth_password_fd` and pass it to `svn_cmdline_create_auth_baton2` * subversion/svnrdump/svnrdump.c (svn_svnrdump__longopt_t): add `opt_auth_password_fd` (svnrdump__options): add help message for `--password-fd` (init_client_context): Pass `auth_password_fd` to `svn_cmdline_create_auth_baton2` (sub_main): Process global option `opt_auth_password_fd` and pass it to `init_client_context` * subversion/svnsync/svnsync.c (svnsync__opt): Add `svnsync_opt_source_password_fd` and `svnsync_opt_sync_password_fd` (svnsync_options): Add help messages for `--source-password-fd` and `--sync-password-fd` (opt_baton_t): Add `source_password_fd` and `sync_password_fd` (sub_main): Process global option `--source-password-fd` and `--sync-password-fd` and pass it to `svn_cmdline_create_auth_baton2` invocations * subversion/tests/cmdline/atomic-ra-revprop-change.c (construct_auth_baton): Pass -1 as the `auth_password_fd` * subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout (): Add new `--password-fd` option to expected output * subversion/tests/libsvn_ra/ra-test.c (check_tunnel_callback_test): Pass -1 as the `auth_password_fd` (tunnel_callback_test): Pass -1 as the `auth_password_fd` (tunnel_run_checkout): Pass -1 as the `auth_password_fd` * subversion/tests/svn_test_main.c (svn_test__init_auth_baton): Pass -1 as the `auth_password_fd` * tools/client-side/svn-mergeinfo-normalizer/mergeinfo-normalizer.h (svn_min__opt_state_t): Add `auth_password_fd` * tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c (svn_min__longopt_t) Add `opt_auth_password_fd` (sub_main) Process global option `--password-fd` and pass it to `svn_cmdline_create_auth_baton2` invocations * tools/client-side/svnconflict/svnconflict.c (svnconflict_opt_state_t): Add `auth_password_fd` (svnconflict_options): Add `--password-fd` documentation (svnconflict_global_options): Add `opt_auth_password_fd` (sub_main): Process global option `--password-fd` and pass it to `svn_cmdline_create_auth_baton2` invocations * tools/dev/svnmover/svnmover.c (sub_main): Process global option `--password-fd` and pass it to `svn_cmdline_create_auth_baton2` invocations ]]]
Index: subversion/include/svn_cmdline.h
===================================================================
--- subversion/include/svn_cmdline.h (revisión: 1808405)
+++ subversion/include/svn_cmdline.h (copia de trabajo)
@@ -356,6 +356,7 @@ svn_cmdline_create_auth_baton2(svn_auth_baton_t **
svn_boolean_t non_interactive,
const char *username,
const char *password,
+ int password_fd,
const char *config_dir,
svn_boolean_t no_auth_cache,
svn_boolean_t trust_server_cert_unknown_ca,
Index: subversion/include/svn_error_codes.h
===================================================================
--- subversion/include/svn_error_codes.h (revisión: 1808405)
+++ subversion/include/svn_error_codes.h (copia de trabajo)
@@ -296,7 +296,6 @@ SVN_ERROR_START
SVN_ERR_IO_CATEGORY_START + 4,
"Framing error in pipe protocol")
- /** @deprecated Unused, slated for removal in the next major release. */
SVN_ERRDEF(SVN_ERR_IO_PIPE_READ_ERROR,
SVN_ERR_IO_CATEGORY_START + 5,
"Read error in pipe")
Index: subversion/libsvn_subr/cmdline.c
===================================================================
--- subversion/libsvn_subr/cmdline.c (revisión: 1808405)
+++ subversion/libsvn_subr/cmdline.c (copia de trabajo)
@@ -516,6 +516,39 @@ struct trust_server_cert_non_interactive_baton {
svn_boolean_t trust_server_cert_other_failure;
};
+static svn_error_t *
+read_pass_from_fd(int fd, const char **password, apr_pool_t *pool)
+{
+ SVN_ERR_ASSERT(fd != -1);
+
+ svn_error_t *err = SVN_NO_ERROR;
+ size_t password_size = 0;
+ ssize_t password_len = 0;
+ char *ret = NULL;
+ FILE *desc = NULL;
+ svn_stringbuf_t *password_str = NULL;
+
+ if (! (desc = fdopen(fd, "r")))
+ {
+ return svn_error_create(SVN_ERR_IO_PIPE_READ_ERROR, NULL, NULL);
+ }
+
+ if ((password_len = getline(&ret, &password_size, desc)) == -1)
+ {
+ err = svn_error_create(SVN_ERR_IO_PIPE_READ_ERROR, NULL, NULL);
+ goto cleanup;
+ }
+
+ password_str = svn_stringbuf_create(ret, pool);
+ svn_stringbuf_chop(password_str, 1);
+ *password = password_str->data;
+
+ cleanup:
+ free(ret);
+
+ return err;
+}
+
/* This implements 'svn_auth_ssl_server_trust_prompt_func_t'.
Don't actually prompt. Instead, set *CRED_P to valid credentials
@@ -567,6 +600,7 @@ svn_cmdline_create_auth_baton2(svn_auth_baton_t **
svn_boolean_t non_interactive,
const char *auth_username,
const char *auth_password,
+ int auth_password_fd,
const char *config_dir,
svn_boolean_t no_auth_cache,
svn_boolean_t trust_server_cert_unknown_ca,
@@ -584,6 +618,7 @@ svn_cmdline_create_auth_baton2(svn_auth_baton_t **
svn_boolean_t store_auth_creds_val = TRUE;
svn_auth_provider_object_t *provider;
svn_cmdline_prompt_baton2_t *pb = NULL;
+ const char *password = NULL;
/* The whole list of registered providers */
apr_array_header_t *providers;
@@ -701,8 +736,14 @@ svn_cmdline_create_auth_baton2(svn_auth_baton_t **
/* Build an authentication baton to give to libsvn_client. */
svn_auth_open(ab, providers, pool);
- /* Place any default --username or --password credentials into the
- auth_baton's run-time parameter hash. */
+ /* need to audit for places I set it to 0 */
+ if (auth_password_fd != -1 && auth_password == NULL)
+ {
+ SVN_ERR(read_pass_from_fd(auth_password_fd, &password, pool));
+ }
+
+ /* Place any default --username, --password or credentials read from password
+ fd into the auth_baton's run-time parameter hash. */
if (auth_username)
svn_auth_set_parameter(*ab, SVN_AUTH_PARAM_DEFAULT_USERNAME,
auth_username);
@@ -709,6 +750,9 @@ svn_cmdline_create_auth_baton2(svn_auth_baton_t **
if (auth_password)
svn_auth_set_parameter(*ab, SVN_AUTH_PARAM_DEFAULT_PASSWORD,
auth_password);
+ else if (password)
+ svn_auth_set_parameter(*ab, SVN_AUTH_PARAM_DEFAULT_PASSWORD,
+ password);
/* Same with the --non-interactive option. */
if (non_interactive)
Index: subversion/libsvn_subr/deprecated.c
===================================================================
--- subversion/libsvn_subr/deprecated.c (revisión: 1808405)
+++ subversion/libsvn_subr/deprecated.c (copia de trabajo)
@@ -1573,6 +1573,7 @@ svn_cmdline_create_auth_baton(svn_auth_baton_t **a
non_interactive,
auth_username,
auth_password,
+ -1,
config_dir,
no_auth_cache,
trust_server_cert,
Index: subversion/svn/cl.h
===================================================================
--- subversion/svn/cl.h (revisión: 1808405)
+++ subversion/svn/cl.h (copia de trabajo)
@@ -178,6 +178,7 @@ typedef struct svn_cl__opt_state_t
svn_boolean_t help; /* print usage message */
const char *auth_username; /* auth username */
const char *auth_password; /* auth password */
+ int auth_password_fd; /* fd to read password from */
const char *extensions; /* subprocess extension args */
apr_array_header_t *targets; /* target list from file */
svn_boolean_t xml; /* output in xml, e.g., "svn log --xml" */
Index: subversion/svn/svn.c
===================================================================
--- subversion/svn/svn.c (revisión: 1808405)
+++ subversion/svn/svn.c (copia de trabajo)
@@ -68,6 +68,7 @@
use the short option letter as identifier. */
typedef enum svn_cl__longopt_t {
opt_auth_password = SVN_OPT_FIRST_LONGOPT_ID,
+ opt_auth_password_fd,
opt_auth_username,
opt_autoprops,
opt_changelist,
@@ -200,6 +201,8 @@ const apr_getopt_option_t svn_cl__options[] =
N_("specify a password ARG (caution: on many operating\n"
" "
"systems, other users will be able to see this)")},
+ {"password-fd", opt_auth_password_fd, 1,
+ N_("specify an fd to read a password from ARG")},
{"extensions", 'x', 1,
N_("Specify differencing options for external diff or\n"
" "
@@ -495,7 +498,8 @@ const apr_getopt_option_t svn_cl__options[] =
command to take these arguments allows scripts to just pass them
willy-nilly to every invocation of 'svn') . */
const int svn_cl__global_options[] =
-{ opt_auth_username, opt_auth_password, opt_no_auth_cache, opt_non_interactive,
+{ opt_auth_username, opt_auth_password, opt_auth_password_fd,
+ opt_no_auth_cache, opt_non_interactive,
opt_force_interactive, opt_trust_server_cert,
opt_trust_server_cert_failures,
opt_config_dir, opt_config_options, 0
@@ -1991,6 +1995,7 @@ sub_main(int *exit_code, int argc, const char *arg
opt_state.set_depth = svn_depth_unknown;
opt_state.accept_which = svn_cl__accept_unspecified;
opt_state.show_revs = svn_cl__show_revs_invalid;
+ opt_state.auth_password_fd = -1;
/* No args? Show usage. */
if (argc <= 1)
@@ -2251,6 +2256,9 @@ sub_main(int *exit_code, int argc, const char *arg
SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_password,
opt_arg, pool));
break;
+ case opt_auth_password_fd:
+ SVN_ERR(svn_cstring_atoi(&opt_state.auth_password_fd, opt_arg));
+ break;
case opt_encoding:
opt_state.encoding = apr_pstrdup(pool, opt_arg);
break;
@@ -3044,6 +3052,7 @@ sub_main(int *exit_code, int argc, const char *arg
opt_state.non_interactive,
opt_state.auth_username,
opt_state.auth_password,
+ opt_state.auth_password_fd,
opt_state.config_dir,
opt_state.no_auth_cache,
opt_state.trust_server_cert_unknown_ca,
Index: subversion/svnbench/cl.h
===================================================================
--- subversion/svnbench/cl.h (revisión: 1808405)
+++ subversion/svnbench/cl.h (copia de trabajo)
@@ -80,6 +80,7 @@ typedef struct svn_cl__opt_state_t
svn_boolean_t help; /* print usage message */
const char *auth_username; /* auth username */ /* UTF-8! */
const char *auth_password; /* auth password */ /* UTF-8! */
+ int auth_password_fd; /* auth password fd */
apr_array_header_t *targets; /* target list from file */ /* UTF-8! */
svn_boolean_t no_auth_cache; /* do not cache authentication information */
svn_boolean_t stop_on_copy; /* don't cross copies during processing */
Index: subversion/svnbench/svnbench.c
===================================================================
--- subversion/svnbench/svnbench.c (revisión: 1808405)
+++ subversion/svnbench/svnbench.c (copia de trabajo)
@@ -53,6 +53,7 @@
use the short option letter as identifier. */
typedef enum svn_cl__longopt_t {
opt_auth_password = SVN_OPT_FIRST_LONGOPT_ID,
+ opt_auth_password_fd,
opt_auth_username,
opt_config_dir,
opt_config_options,
@@ -112,6 +113,7 @@ const apr_getopt_option_t svn_cl__options[] =
{"verbose", 'v', 0, N_("print extra information")},
{"username", opt_auth_username, 1, N_("specify a username ARG")},
{"password", opt_auth_password, 1, N_("specify a password ARG")},
+ {"password-fd", opt_auth_password_fd, 1, N_("specify a password-fd ARG")},
{"targets", opt_targets, 1,
N_("pass contents of file ARG as additional args")},
{"depth", opt_depth, 1,
@@ -197,7 +199,8 @@ const apr_getopt_option_t svn_cl__options[] =
command to take these arguments allows scripts to just pass them
willy-nilly to every invocation of 'svn') . */
const int svn_cl__global_options[] =
-{ opt_auth_username, opt_auth_password, opt_no_auth_cache, opt_non_interactive,
+{ opt_auth_username, opt_auth_password, opt_auth_password_fd,
+ opt_no_auth_cache, opt_non_interactive,
opt_trust_server_cert, opt_trust_server_cert_failures,
opt_config_dir, opt_config_options, 0
};
@@ -420,6 +423,7 @@ sub_main(int *exit_code, int argc, const char *arg
opt_state.revision_ranges =
apr_array_make(pool, 0, sizeof(svn_opt_revision_range_t *));
opt_state.depth = svn_depth_unknown;
+ opt_state.auth_password_fd = -1;
/* No args? Show usage. */
if (argc <= 1)
@@ -625,6 +629,9 @@ sub_main(int *exit_code, int argc, const char *arg
SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_password,
opt_arg, pool));
break;
+ case opt_auth_password_fd:
+ SVN_ERR(svn_cstring_atoi(&opt_state.auth_password_fd, opt_arg));
+ break;
case opt_stop_on_copy:
opt_state.stop_on_copy = TRUE;
break;
@@ -929,6 +936,7 @@ sub_main(int *exit_code, int argc, const char *arg
opt_state.non_interactive,
opt_state.auth_username,
opt_state.auth_password,
+ opt_state.auth_password_fd,
opt_state.config_dir,
opt_state.no_auth_cache,
opt_state.trust_server_cert_unknown_ca,
Index: subversion/svnmucc/svnmucc.c
===================================================================
--- subversion/svnmucc/svnmucc.c (revisión: 1808405)
+++ subversion/svnmucc/svnmucc.c (copia de trabajo)
@@ -480,7 +480,8 @@ sub_main(int *exit_code, int argc, const char *arg
non_interactive_opt,
force_interactive_opt,
trust_server_cert_opt,
- trust_server_cert_failures_opt
+ trust_server_cert_failures_opt,
+ password_fd_opt
};
static const apr_getopt_option_t options[] = {
{"message", 'm', 1, ""},
@@ -487,6 +488,7 @@ sub_main(int *exit_code, int argc, const char *arg
{"file", 'F', 1, ""},
{"username", 'u', 1, ""},
{"password", 'p', 1, ""},
+ {"password-fd", password_fd_opt, 1, ""},
{"root-url", 'U', 1, ""},
{"revision", 'r', 1, ""},
{"with-revprop", with_revprop_opt, 1, ""},
@@ -527,6 +529,7 @@ sub_main(int *exit_code, int argc, const char *arg
svn_client_ctx_t *ctx;
struct log_message_baton lmb;
int i;
+ int password_fd = -1;
/* Check library versions */
SVN_ERR(check_lib_versions());
@@ -572,6 +575,8 @@ sub_main(int *exit_code, int argc, const char *arg
case 'p':
password = apr_pstrdup(pool, arg);
break;
+ case password_fd_opt:
+ SVN_ERR(svn_cstring_atoi(&password_fd, arg));
case 'U':
SVN_ERR(svn_utf_cstring_to_utf8(&root_url, arg, pool));
if (! svn_path_is_url(root_url))
@@ -729,6 +734,7 @@ sub_main(int *exit_code, int argc, const char *arg
non_interactive,
username,
password,
+ password_fd,
config_dir,
no_auth_cache,
trust_unknown_ca,
Index: subversion/svnrdump/svnrdump.c
===================================================================
--- subversion/svnrdump/svnrdump.c (revisión: 1808405)
+++ subversion/svnrdump/svnrdump.c (copia de trabajo)
@@ -59,6 +59,7 @@ enum svn_svnrdump__longopt_t
opt_config_option,
opt_auth_username,
opt_auth_password,
+ opt_auth_password_fd,
opt_auth_nocache,
opt_non_interactive,
opt_skip_revprop,
@@ -73,6 +74,7 @@ enum svn_svnrdump__longopt_t
opt_config_option, \
opt_auth_username, \
opt_auth_password, \
+ opt_auth_password_fd, \
opt_auth_nocache, \
opt_trust_server_cert, \
opt_trust_server_cert_failures, \
@@ -114,6 +116,8 @@ static const apr_getopt_option_t svnrdump__options
N_("specify a username ARG")},
{"password", opt_auth_password, 1,
N_("specify a password ARG")},
+ {"password-fd", opt_auth_password, 1,
+ N_("specify a password fd ARG")},
{"non-interactive", opt_non_interactive, 0,
N_("do no interactive prompting (default is to prompt\n"
" "
@@ -294,6 +298,7 @@ init_client_context(svn_client_ctx_t **ctx_p,
svn_boolean_t non_interactive,
const char *username,
const char *password,
+ int password_fd,
const char *config_dir,
const char *repos_url,
svn_boolean_t no_auth_cache,
@@ -366,7 +371,8 @@ init_client_context(svn_client_ctx_t **ctx_p,
/* Default authentication providers for non-interactive use */
SVN_ERR(svn_cmdline_create_auth_baton2(&(ctx->auth_baton), non_interactive,
- username, password, config_dir,
+ username, password, password_fd,
+ config_dir,
no_auth_cache, trust_unknown_ca,
trust_cn_mismatch, trust_expired,
trust_not_yet_valid,
@@ -760,6 +766,7 @@ sub_main(int *exit_code, int argc, const char *arg
const char *config_dir = NULL;
const char *username = NULL;
const char *password = NULL;
+ int password_fd = -1;
svn_boolean_t no_auth_cache = FALSE;
svn_boolean_t trust_unknown_ca = FALSE;
svn_boolean_t trust_cn_mismatch = FALSE;
@@ -850,6 +857,8 @@ sub_main(int *exit_code, int argc, const char *arg
case opt_auth_password:
SVN_ERR(svn_utf_cstring_to_utf8(&password, opt_arg, pool));
break;
+ case opt_auth_password_fd:
+ SVN_ERR(svn_cstring_atoi(&password_fd, opt_arg));
case opt_auth_nocache:
no_auth_cache = TRUE;
break;
@@ -1046,6 +1055,7 @@ sub_main(int *exit_code, int argc, const char *arg
non_interactive,
username,
password,
+ password_fd,
config_dir,
opt_baton->url,
no_auth_cache,
Index: subversion/svnsync/svnsync.c
===================================================================
--- subversion/svnsync/svnsync.c (revisión: 1808405)
+++ subversion/svnsync/svnsync.c (copia de trabajo)
@@ -59,8 +59,10 @@ enum svnsync__opt {
svnsync_opt_auth_password,
svnsync_opt_source_username,
svnsync_opt_source_password,
+ svnsync_opt_source_password_fd,
svnsync_opt_sync_username,
svnsync_opt_sync_password,
+ svnsync_opt_sync_password_fd,
svnsync_opt_config_dir,
svnsync_opt_config_options,
svnsync_opt_source_prop_encoding,
@@ -84,8 +86,10 @@ enum svnsync__opt {
svnsync_opt_trust_server_cert_failures_dst, \
svnsync_opt_source_username, \
svnsync_opt_source_password, \
+ svnsync_opt_source_password_fd, \
svnsync_opt_sync_username, \
svnsync_opt_sync_password, \
+ svnsync_opt_sync_password_fd, \
svnsync_opt_config_dir, \
svnsync_opt_config_options
@@ -240,10 +244,14 @@ static const apr_getopt_option_t svnsync_options[]
N_("connect to source repository with username ARG") },
{"source-password", svnsync_opt_source_password, 1,
N_("connect to source repository with password ARG") },
+ {"source-password-fd", svnsync_opt_source_password_fd, 1,
+ N_("connect to source repository with password from fd ARG") },
{"sync-username", svnsync_opt_sync_username, 1,
N_("connect to sync repository with username ARG") },
{"sync-password", svnsync_opt_sync_password, 1,
N_("connect to sync repository with password ARG") },
+ {"source-password-fd", svnsync_opt_sync_password_fd, 1,
+ N_("connect to sync repository with password from fd ARG") },
{"config-dir", svnsync_opt_config_dir, 1,
N_("read user configuration files from directory ARG")},
{"config-option", svnsync_opt_config_options, 1,
@@ -301,8 +309,10 @@ typedef struct opt_baton_t {
svn_auth_baton_t *sync_auth_baton;
const char *source_username;
const char *source_password;
+ int source_password_fd;
const char *sync_username;
const char *sync_password;
+ int sync_password_fd;
const char *config_dir;
apr_hash_t *config;
const char *source_prop_encoding;
@@ -1973,6 +1983,7 @@ sub_main(int *exit_code, int argc, const char *arg
apr_array_header_t *config_options = NULL;
const char *source_prop_encoding = NULL;
svn_boolean_t force_interactive = FALSE;
+ int source_password_fd = -1, sync_password_fd = -1;
/* Check library versions */
SVN_ERR(check_lib_versions());
@@ -2071,6 +2082,10 @@ sub_main(int *exit_code, int argc, const char *arg
opt_err = svn_utf_cstring_to_utf8(&source_password, opt_arg, pool);
break;
+ case svnsync_opt_source_password_fd:
+ opt_err = svn_cstring_atoi(&source_password_fd, opt_arg);
+ break;
+
case svnsync_opt_sync_username:
opt_err = svn_utf_cstring_to_utf8(&sync_username, opt_arg, pool);
break;
@@ -2079,6 +2094,10 @@ sub_main(int *exit_code, int argc, const char *arg
opt_err = svn_utf_cstring_to_utf8(&sync_password, opt_arg, pool);
break;
+ case svnsync_opt_sync_password_fd:
+ opt_err = svn_cstring_atoi(&sync_password_fd, opt_arg);
+ break;
+
case svnsync_opt_config_dir:
{
const char *path;
@@ -2229,8 +2248,10 @@ sub_main(int *exit_code, int argc, const char *arg
}
opt_baton.source_username = source_username;
opt_baton.source_password = source_password;
+ opt_baton.source_password_fd = source_password_fd;
opt_baton.sync_username = sync_username;
opt_baton.sync_password = sync_password;
+ opt_baton.sync_password_fd = sync_password_fd;
/* Disallow mixing of --steal-lock and --disable-locking. */
if (opt_baton.steal_lock && opt_baton.disable_locking)
@@ -2351,6 +2372,7 @@ sub_main(int *exit_code, int argc, const char *arg
opt_baton.non_interactive,
opt_baton.source_username,
opt_baton.source_password,
+ opt_baton.source_password_fd,
opt_baton.config_dir,
opt_baton.no_auth_cache,
opt_baton.src_trust.trust_server_cert_unknown_ca,
@@ -2367,6 +2389,7 @@ sub_main(int *exit_code, int argc, const char *arg
opt_baton.non_interactive,
opt_baton.sync_username,
opt_baton.sync_password,
+ opt_baton.sync_password_fd,
opt_baton.config_dir,
opt_baton.no_auth_cache,
opt_baton.dst_trust.trust_server_cert_unknown_ca,
Index: subversion/tests/cmdline/atomic-ra-revprop-change.c
===================================================================
--- subversion/tests/cmdline/atomic-ra-revprop-change.c (revisión: 1808405)
+++ subversion/tests/cmdline/atomic-ra-revprop-change.c (copia de trabajo)
@@ -60,7 +60,7 @@ construct_auth_baton(svn_auth_baton_t **auth_baton
{
SVN_ERR(svn_cmdline_create_auth_baton2(auth_baton_p,
TRUE /* non_interactive */,
- "jrandom", "rayjandom",
+ "jrandom", "rayjandom", -1,
config_dir,
TRUE /* no_auth_cache */,
FALSE /* trust_server_cert */,
Index: subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout
===================================================================
--- subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout (revisión: 1808405)
+++ subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout (copia de trabajo)
@@ -134,6 +134,7 @@ Global options:
--username ARG : specify a username ARG
--password ARG : specify a password ARG (caution: on many operating
systems, other users will be able to see this)
+ --password-fd ARG : specify an fd to read a password from ARG
--no-auth-cache : do not cache authentication tokens
--non-interactive : do no interactive prompting (default is to prompt
only if standard input is a terminal device)
@@ -224,6 +225,7 @@ Global options:
--username ARG : specify a username ARG
--password ARG : specify a password ARG (caution: on many operating
systems, other users will be able to see this)
+ --password-fd ARG : specify an fd to read a password from ARG
--no-auth-cache : do not cache authentication tokens
--non-interactive : do no interactive prompting (default is to prompt
only if standard input is a terminal device)
Index: subversion/tests/libsvn_ra/ra-test.c
===================================================================
--- subversion/tests/libsvn_ra/ra-test.c (revisión: 1808405)
+++ subversion/tests/libsvn_ra/ra-test.c (copia de trabajo)
@@ -344,7 +344,7 @@ check_tunnel_callback_test(const svn_test_opts_t *
cbtable->tunnel_baton = b;
SVN_ERR(svn_cmdline_create_auth_baton2(&cbtable->auth_baton,
TRUE /* non_interactive */,
- "jrandom", "rayjandom",
+ "jrandom", "rayjandom", -1,
NULL,
TRUE /* no_auth_cache */,
FALSE /* trust_server_cert */,
@@ -387,7 +387,7 @@ tunnel_callback_test(const svn_test_opts_t *opts,
cbtable->tunnel_baton = b;
SVN_ERR(svn_cmdline_create_auth_baton2(&cbtable->auth_baton,
TRUE /* non_interactive */,
- "jrandom", "rayjandom",
+ "jrandom", "rayjandom", -1,
NULL,
TRUE /* no_auth_cache */,
FALSE /* trust_server_cert */,
@@ -1557,7 +1557,7 @@ tunnel_run_checkout(const svn_test_opts_t *opts,
cbtable->tunnel_baton = b;
SVN_ERR(svn_cmdline_create_auth_baton2(&cbtable->auth_baton,
TRUE /* non_interactive */,
- "jrandom", "rayjandom",
+ "jrandom", "rayjandom", -1,
NULL,
TRUE /* no_auth_cache */,
FALSE /* trust_server_cert */,
Index: subversion/tests/svn_test_main.c
===================================================================
--- subversion/tests/svn_test_main.c (revisión: 1808405)
+++ subversion/tests/svn_test_main.c (copia de trabajo)
@@ -754,7 +754,7 @@ svn_test__init_auth_baton(svn_auth_baton_t **ab,
SVN_ERR(svn_cmdline_create_auth_baton2(ab,
TRUE /* non_interactive */,
- "jrandom", "rayjandom",
+ "jrandom", "rayjandom", -1,
NULL,
TRUE /* no_auth_cache */,
TRUE /* trust_server_cert_unkown_ca */,
Index: tools/client-side/svn-mergeinfo-normalizer/mergeinfo-normalizer.h
===================================================================
--- tools/client-side/svn-mergeinfo-normalizer/mergeinfo-normalizer.h (revisión: 1808405)
+++ tools/client-side/svn-mergeinfo-normalizer/mergeinfo-normalizer.h (copia de trabajo)
@@ -56,6 +56,7 @@ typedef struct svn_min__opt_state_t
svn_boolean_t help; /* print usage message */
const char *auth_username; /* auth username */
const char *auth_password; /* auth password */
+ int auth_password_fd; /* auth password fd */
apr_array_header_t *targets;
svn_boolean_t no_auth_cache; /* do not cache authentication information */
svn_boolean_t dry_run; /* try operation but make no changes */
Index: tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c
===================================================================
--- tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c (revisión: 1808405)
+++ tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c (copia de trabajo)
@@ -68,6 +68,7 @@
use the short option letter as identifier. */
typedef enum svn_min__longopt_t {
opt_auth_password = SVN_OPT_FIRST_LONGOPT_ID,
+ opt_auth_password_fd,
opt_auth_username,
opt_config_dir,
opt_config_options,
@@ -113,6 +114,8 @@ const apr_getopt_option_t svn_min__options[] =
N_("specify a password ARG (caution: on many operating\n"
" "
"systems, other users will be able to see this)")},
+ {"password-fd", opt_auth_password_fd, 1,
+ N_("specify an fd to read a password from")},
{"targets", opt_targets, 1,
N_("pass contents of file ARG as additional args")},
{"depth", opt_depth, 1,
@@ -419,6 +422,7 @@ sub_main(int *exit_code, int argc, const char *arg
apr_hash_t *cfg_hash;
received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+ opt_state.auth_password_fd = -1;
/* Check library versions */
SVN_ERR(check_lib_versions());
@@ -528,6 +532,9 @@ sub_main(int *exit_code, int argc, const char *arg
SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_password,
opt_arg, pool));
break;
+ case opt_auth_password_fd:
+ SVN_ERR(svn_cstring_atoi(&opt_state.auth_password_fd, opt_arg));
+ break;
case opt_no_auth_cache:
opt_state.no_auth_cache = TRUE;
break;
@@ -825,6 +832,7 @@ sub_main(int *exit_code, int argc, const char *arg
opt_state.non_interactive,
opt_state.auth_username,
opt_state.auth_password,
+ opt_state.auth_password_fd,
opt_state.config_dir,
opt_state.no_auth_cache,
opt_state.trust_server_cert_unknown_ca,
Index: tools/client-side/svnconflict/svnconflict.c
===================================================================
--- tools/client-side/svnconflict/svnconflict.c (revisión: 1808405)
+++ tools/client-side/svnconflict/svnconflict.c (copia de trabajo)
@@ -60,6 +60,7 @@ typedef struct svnconflict_opt_state_t {
svn_boolean_t help; /* print usage message */
const char *auth_username; /* auth username */
const char *auth_password; /* auth password */
+ int auth_password_fd; /* auth password fd */
const char *config_dir; /* over-riding configuration directory */
apr_array_header_t *config_options; /* over-riding configuration options */
} svnconflict_opt_state_t;
@@ -78,6 +79,7 @@ typedef struct svnconflict_cmd_baton_t
use the short option letter as identifier. */
typedef enum svnconflict_longopt_t {
opt_auth_password = SVN_OPT_FIRST_LONGOPT_ID,
+ opt_auth_password_fd,
opt_auth_username,
opt_config_dir,
opt_config_options,
@@ -96,6 +98,8 @@ static const apr_getopt_option_t svnconflict_optio
N_("specify a password ARG (caution: on many operating\n"
" "
"systems, other users will be able to see this)")},
+ {"password-fd", opt_auth_password_fd, 1,
+ N_("specify an fd to read a password from ARG")},
{"config-dir", opt_config_dir, 1,
N_("read user configuration files from directory ARG")},
{"config-option", opt_config_options, 1,
@@ -141,7 +145,8 @@ static svn_error_t * svnconflict_resolve_tree(apr_
/* Options that apply to all commands. */
static const int svnconflict_global_options[] =
-{ opt_auth_username, opt_auth_password, opt_config_dir, opt_config_options, 0 };
+{ opt_auth_username, opt_auth_password, opt_auth_password_fd,
+ opt_config_dir, opt_config_options, 0 };
static const svn_opt_subcommand_desc2_t svnconflict_cmd_table[] =
{
@@ -641,6 +646,7 @@ sub_main(int *exit_code, int argc, const char *arg
apr_hash_t *cfg_hash;
received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+ opt_state.auth_password_fd = -1;
/* Check library versions */
SVN_ERR(check_lib_versions());
@@ -704,6 +710,9 @@ sub_main(int *exit_code, int argc, const char *arg
SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_password,
opt_arg, pool));
break;
+ case opt_auth_password_fd:
+ SVN_ERR(svn_cstring_atoi(&opt_state.auth_password_fd, opt_arg));
+ break;
case opt_config_dir:
SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
opt_state.config_dir = svn_dirent_internal_style(utf8_opt_arg, pool);
@@ -856,6 +865,7 @@ sub_main(int *exit_code, int argc, const char *arg
TRUE, /* non-interactive */
opt_state.auth_username,
opt_state.auth_password,
+ opt_state.auth_password_fd,
opt_state.config_dir,
TRUE, /* no auth cache */
FALSE, FALSE, FALSE, FALSE, FALSE, /* reject invalid SSL certs */
Index: tools/dev/svnmover/svnmover.c
===================================================================
--- tools/dev/svnmover/svnmover.c (revisión: 1808405)
+++ tools/dev/svnmover/svnmover.c (copia de trabajo)
@@ -4332,7 +4332,8 @@ sub_main(int *exit_code, int argc, const char *arg
trust_server_cert_opt,
trust_server_cert_failures_opt,
ui_opt,
- colour_opt
+ colour_opt,
+ auth_password_fd_opt
};
static const apr_getopt_option_t options[] = {
{"verbose", 'v', 0, ""},
@@ -4341,6 +4342,7 @@ sub_main(int *exit_code, int argc, const char *arg
{"file", 'F', 1, ""},
{"username", 'u', 1, ""},
{"password", 'p', 1, ""},
+ {"password-fd", auth_password_fd_opt, 1, ""},
{"root-url", 'U', 1, ""},
{"revision", 'r', 1, ""},
{"branch-id", 'B', 1, ""},
@@ -4387,6 +4389,7 @@ sub_main(int *exit_code, int argc, const char *arg
const char *log_msg;
svn_tristate_t coloured_output = svn_tristate_false;
svnmover_wc_t *wc;
+ int password_fd = -1;
/* Check library versions */
SVN_ERR(check_lib_versions());
@@ -4431,6 +4434,9 @@ sub_main(int *exit_code, int argc, const char *arg
case 'p':
password = apr_pstrdup(pool, arg);
break;
+ case auth_password_fd_opt:
+ password_fd = svn_cstring_atoi(&password_fd, arg);
+ break;
case 'U':
SVN_ERR(svn_utf_cstring_to_utf8(&anchor_url, arg, pool));
if (! svn_path_is_url(anchor_url))
@@ -4587,6 +4593,7 @@ sub_main(int *exit_code, int argc, const char *arg
non_interactive,
username,
password,
+ password_fd,
config_dir,
no_auth_cache,
trust_unknown_ca,
signature.asc
Description: OpenPGP digital signature

