⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simple_providers.c

📁 subversion-1.4.3-1.tar.gz 配置svn的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
                   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 + -