Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/bindings/javahl/native/ClientContext.cpp view on Meta::CPAN
static apr_status_t clear_ctx_ptrs(void *ptr)
{
clearctx_baton_t *bt = reinterpret_cast<clearctx_baton_t*>(ptr);
/* Reset all values to those before overwriting by getContext. */
*bt->ctx = *bt->backup;
return APR_SUCCESS;
}
};
svn_client_ctx_t *
ClientContext::getContext(CommitMessage *message, SVN::Pool &in_pool)
{
apr_pool_t *pool = in_pool.getPool();
svn_auth_baton_t *ab;
svn_client_ctx_t *ctx = m_context;
/* Make a temporary copy of ctx to restore at pool cleanup to avoid
leaving references to dangling pointers.
Note that this allows creating a stack of context changes if
the function is invoked multiple times with different pools.
*/
clearctx_baton_t *bt =
reinterpret_cast<clearctx_baton_t *>(apr_pcalloc(pool, sizeof(*bt)));
bt->ctx = ctx;
bt->backup =
reinterpret_cast<svn_client_ctx_t*>(apr_pmemdup(pool, ctx, sizeof(*ctx)));
apr_pool_cleanup_register(in_pool.getPool(), bt, clear_ctx_ptrs,
clear_ctx_ptrs);
if (!ctx->config)
{
const char *configDir = m_configDir.c_str();
if (m_configDir.empty())
configDir = NULL;
SVN_JNI_ERR(svn_config_get_config(&(ctx->config), configDir,
m_pool->getPool()),
NULL);
bt->backup->config = ctx->config;
}
svn_config_t *config =
reinterpret_cast<svn_config_t *>(apr_hash_get(ctx->config,
SVN_CONFIG_CATEGORY_CONFIG,
APR_HASH_KEY_STRING));
/* The whole list of registered providers */
apr_array_header_t *providers;
/* Populate the registered providers with the platform-specific providers */
SVN_JNI_ERR(svn_auth_get_platform_specific_client_providers(&providers,
config,
pool),
NULL);
/* Use the prompter (if available) to prompt for password and cert
* caching. */
svn_auth_plaintext_prompt_func_t plaintext_prompt_func = NULL;
void *plaintext_prompt_baton = NULL;
svn_auth_plaintext_passphrase_prompt_func_t plaintext_passphrase_prompt_func;
void *plaintext_passphrase_prompt_baton = NULL;
if (m_prompter != NULL)
{
plaintext_prompt_func = Prompter::plaintext_prompt;
plaintext_prompt_baton = m_prompter;
plaintext_passphrase_prompt_func = Prompter::plaintext_passphrase_prompt;
plaintext_passphrase_prompt_baton = m_prompter;
}
/* The main disk-caching auth providers, for both
* 'username/password' creds and 'username' creds. */
svn_auth_provider_object_t *provider;
svn_auth_get_simple_provider2(&provider, plaintext_prompt_func,
plaintext_prompt_baton, pool);
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
svn_auth_get_username_provider(&provider, pool);
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
/* The server-cert, client-cert, and client-cert-password providers. */
SVN_JNI_ERR(svn_auth_get_platform_specific_provider(&provider,
"windows",
"ssl_server_trust",
pool),
NULL);
if (provider)
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
svn_auth_get_ssl_server_trust_file_provider(&provider, pool);
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
svn_auth_get_ssl_client_cert_file_provider(&provider, pool);
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
svn_auth_get_ssl_client_cert_pw_file_provider2(&provider,
plaintext_passphrase_prompt_func,
plaintext_passphrase_prompt_baton, pool);
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
if (m_prompter != NULL)
{
/* Two basic prompt providers: username/password, and just username.*/
provider = m_prompter->getProviderSimple(in_pool);
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
provider = m_prompter->getProviderUsername(in_pool);
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
/* Three ssl prompt providers, for server-certs, client-certs,
* and client-cert-passphrases. */
provider = m_prompter->getProviderServerSSLTrust(in_pool);
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
provider = m_prompter->getProviderClientSSL(in_pool);
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
provider = m_prompter->getProviderClientSSLPassword(in_pool);
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
}
/* 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. ### Same with --no-auth-cache? */
if (!m_userName.empty())
svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DEFAULT_USERNAME,
apr_pstrdup(in_pool.getPool(),
m_userName.c_str()));
if (!m_passWord.empty())
svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DEFAULT_PASSWORD,
apr_pstrdup(in_pool.getPool(),
m_passWord.c_str()));
/* Store where to retrieve authentication data? */
if (!m_configDir.empty())
svn_auth_set_parameter(ab, SVN_AUTH_PARAM_CONFIG_DIR,
apr_pstrdup(in_pool.getPool(),
m_configDir.c_str()));
ctx->auth_baton = ab;
ctx->log_msg_baton3 = message;
m_cancelOperation = false;
SVN_JNI_ERR(svn_wc_context_create(&ctx->wc_ctx, NULL,
in_pool.getPool(), in_pool.getPool()),
NULL);
return ctx;
}
void
ClientContext::username(const char *pi_username)
{
m_userName = (pi_username == NULL ? "" : pi_username);
}
void
ClientContext::password(const char *pi_password)
{
m_passWord = (pi_password == NULL ? "" : pi_password);
}
void
ClientContext::setPrompt(Prompter *prompter)
{
delete m_prompter;
m_prompter = prompter;
}
void
ClientContext::setConfigDirectory(const char *configDir)
{
// A change to the config directory may necessitate creation of
// the config templates.
SVN::Pool requestPool;
SVN_JNI_ERR(svn_config_ensure(configDir, requestPool.getPool()), );
m_configDir = (configDir == NULL ? "" : configDir);
m_context->config = NULL;
}
const char *
ClientContext::getConfigDirectory() const
{
return m_configDir.c_str();
}
void
ClientContext::cancelOperation()
{
m_cancelOperation = true;
}
svn_error_t *
ClientContext::checkCancel(void *cancelBaton)
{
ClientContext *that = static_cast<ClientContext *>(cancelBaton);
if (that->m_cancelOperation)
return svn_error_create(SVN_ERR_CANCELLED, NULL,
_("Operation cancelled"));
else
return SVN_NO_ERROR;
}
void
ClientContext::notify(void *baton,
const svn_wc_notify_t *notify,
apr_pool_t *pool)
{
jobject jctx = (jobject) baton;
JNIEnv *env = JNIUtil::getEnv();
static jmethodID mid = 0;
if (mid == 0)
{
jclass clazz = env->GetObjectClass(jctx);
if (JNIUtil::isJavaExceptionThrown())
return;
mid = env->GetMethodID(clazz, "onNotify",
( run in 2.745 seconds using v1.01-cache-2.11-cpan-5b529ec07f3 )