📄 simple_providers.c
字号:
apr_hash_t *parameters, const char *realmstring, apr_pool_t *pool){ return simple_first_creds_helper(credentials, iter_baton, provider_baton, parameters, realmstring, simple_password_get, SVN_AUTH__SIMPLE_PASSWORD_TYPE, pool);}/* Save (unencrypted) credentials to the simple provider's cache. */static svn_error_t *simple_save_creds(svn_boolean_t *saved, void *credentials, void *provider_baton, apr_hash_t *parameters, const char *realmstring, apr_pool_t *pool){ return simple_save_creds_helper(saved, credentials, provider_baton, parameters, realmstring, simple_password_set, SVN_AUTH__SIMPLE_PASSWORD_TYPE, pool);}static const svn_auth_provider_t simple_provider = { SVN_AUTH_CRED_SIMPLE, simple_first_creds, NULL, simple_save_creds};/* Public API */voidsvn_auth_get_simple_provider(svn_auth_provider_object_t **provider, apr_pool_t *pool){ svn_auth_provider_object_t *po = apr_pcalloc(pool, sizeof(*po)); po->vtable = &simple_provider; *provider = po;}/*-----------------------------------------------------------------------*//* Prompt provider *//*-----------------------------------------------------------------------*//* Baton type for username/password prompting. */typedef struct{ svn_auth_simple_prompt_func_t prompt_func; void *prompt_baton; /* how many times to re-prompt after the first one fails */ int retry_limit;} simple_prompt_provider_baton_t;/* Iteration baton type for username/password prompting. */typedef struct{ /* how many times we've reprompted */ int retries;} simple_prompt_iter_baton_t;/*** Helper Functions ***/static svn_error_t *prompt_for_simple_creds(svn_auth_cred_simple_t **cred_p, simple_prompt_provider_baton_t *pb, apr_hash_t *parameters, const char *realmstring, svn_boolean_t first_time, svn_boolean_t may_save, apr_pool_t *pool){ const char *def_username = NULL, *def_password = NULL; *cred_p = NULL; /* If we're allowed to check for default usernames and passwords, do so. */ if (first_time) { def_username = apr_hash_get(parameters, SVN_AUTH_PARAM_DEFAULT_USERNAME, APR_HASH_KEY_STRING); /* No default username? Try the auth cache. */ if (! def_username) { const char *config_dir = apr_hash_get(parameters, SVN_AUTH_PARAM_CONFIG_DIR, APR_HASH_KEY_STRING); apr_hash_t *creds_hash = NULL; svn_string_t *str; svn_error_t *err; err = svn_config_read_auth_data(&creds_hash, SVN_AUTH_CRED_SIMPLE, realmstring, config_dir, pool); svn_error_clear(err); if (! err && creds_hash) { str = apr_hash_get(creds_hash, SVN_AUTH__AUTHFILE_USERNAME_KEY, APR_HASH_KEY_STRING); if (str && str->data) def_username = str->data; } } /* Still no default username? Try the UID. */ if (! def_username) def_username = svn_user_get_name(pool); def_password = apr_hash_get(parameters, SVN_AUTH_PARAM_DEFAULT_PASSWORD, APR_HASH_KEY_STRING); } /* If we have defaults, just build the cred here and return it. * * ### I do wonder why this is here instead of in a separate * ### 'defaults' provider that would run before the prompt * ### provider... Hmmm. */ if (def_username && def_password) { *cred_p = apr_palloc(pool, sizeof(**cred_p)); (*cred_p)->username = apr_pstrdup(pool, def_username); (*cred_p)->password = apr_pstrdup(pool, def_password); (*cred_p)->may_save = TRUE; } else { SVN_ERR(pb->prompt_func(cred_p, pb->prompt_baton, realmstring, def_username, may_save, pool)); } return SVN_NO_ERROR;}/* Our first attempt will use any default username/password passed in, and prompt for the remaining stuff. */static svn_error_t *simple_prompt_first_creds(void **credentials_p, void **iter_baton, void *provider_baton, apr_hash_t *parameters, const char *realmstring, apr_pool_t *pool){ simple_prompt_provider_baton_t *pb = provider_baton; simple_prompt_iter_baton_t *ibaton = apr_pcalloc(pool, sizeof(*ibaton)); const char *no_auth_cache = apr_hash_get(parameters, SVN_AUTH_PARAM_NO_AUTH_CACHE, APR_HASH_KEY_STRING); SVN_ERR(prompt_for_simple_creds((svn_auth_cred_simple_t **) credentials_p, pb, parameters, realmstring, TRUE, ! no_auth_cache, pool)); ibaton->retries = 0; *iter_baton = ibaton; return SVN_NO_ERROR;}/* Subsequent attempts to fetch will ignore the default values, and simply re-prompt for both, up to a maximum of ib->pb->retry_limit. */static svn_error_t *simple_prompt_next_creds(void **credentials_p, void *iter_baton, void *provider_baton, apr_hash_t *parameters, const char *realmstring, apr_pool_t *pool){ simple_prompt_iter_baton_t *ib = iter_baton; simple_prompt_provider_baton_t *pb = provider_baton; const char *no_auth_cache = apr_hash_get(parameters, SVN_AUTH_PARAM_NO_AUTH_CACHE, APR_HASH_KEY_STRING); if (ib->retries >= pb->retry_limit) { /* give up, go on to next provider. */ *credentials_p = NULL; return SVN_NO_ERROR; } ib->retries++; SVN_ERR(prompt_for_simple_creds((svn_auth_cred_simple_t **) credentials_p, pb, parameters, realmstring, FALSE, ! no_auth_cache, pool)); return SVN_NO_ERROR;}static const svn_auth_provider_t simple_prompt_provider = { SVN_AUTH_CRED_SIMPLE, simple_prompt_first_creds, simple_prompt_next_creds, NULL,};/* Public API */voidsvn_auth_get_simple_prompt_provider (svn_auth_provider_object_t **provider, svn_auth_simple_prompt_func_t prompt_func, void *prompt_baton, int retry_limit, apr_pool_t *pool){ svn_auth_provider_object_t *po = apr_pcalloc(pool, sizeof(*po)); simple_prompt_provider_baton_t *pb = apr_pcalloc(pool, sizeof(*pb)); pb->prompt_func = prompt_func; pb->prompt_baton = prompt_baton; pb->retry_limit = retry_limit; po->vtable = &simple_prompt_provider; po->provider_baton = pb; *provider = po;}/*-----------------------------------------------------------------------*//* Windows simple provider, encrypts the password on Win2k and later. *//*-----------------------------------------------------------------------*/#ifdef WIN32#include <wincrypt.h>#include <apr_base64.h>/* The description string that's combined with unencrypted data by the Windows CryptoAPI. Used during decryption to verify that the encrypted data were valid. */static const WCHAR description[] = L"auth_svn.simple.wincrypt";/* The password type used by the windows simple auth provider, passed into simple_first_creds_helper and simple_save_creds_helper. */static const char windows_crypto_type[] = "wincrypt";/* Dynamically load the address of function NAME in PDLL into PFN. Return TRUE if the function name was found, otherwise FALSE. Equivalent to dlsym(). */static svn_boolean_tget_crypto_function(const char *name, HINSTANCE *pdll, FARPROC *pfn){ /* In case anyone wonders why we use LoadLibraryA here: This will always work on Win9x/Me, whilst LoadLibraryW may not. */ HINSTANCE dll = LoadLibraryA("Crypt32.dll"); if (dll) { FARPROC fn = GetProcAddress(dll, name); if (fn) { *pdll = dll; *pfn = fn; return TRUE; } FreeLibrary(dll); } return FALSE;}/* Implementation of password_set_t that encrypts the incoming password using the Windows CryptoAPI. */static svn_boolean_twindows_password_encrypter(apr_hash_t *creds, const char *realmstring, const char *username, const char *in, svn_boolean_t non_interactive, apr_pool_t *pool){ typedef BOOL (CALLBACK *encrypt_fn_t) (DATA_BLOB *, /* pDataIn */ LPCWSTR, /* szDataDescr */ DATA_BLOB *, /* pOptionalEntropy */ PVOID, /* pvReserved */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -