svn_auth.h revision 362181
1/**
2 * @copyright
3 * ====================================================================
4 *    Licensed to the Apache Software Foundation (ASF) under one
5 *    or more contributor license agreements.  See the NOTICE file
6 *    distributed with this work for additional information
7 *    regarding copyright ownership.  The ASF licenses this file
8 *    to you under the Apache License, Version 2.0 (the
9 *    "License"); you may not use this file except in compliance
10 *    with the License.  You may obtain a copy of the License at
11 *
12 *      http://www.apache.org/licenses/LICENSE-2.0
13 *
14 *    Unless required by applicable law or agreed to in writing,
15 *    software distributed under the License is distributed on an
16 *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 *    KIND, either express or implied.  See the License for the
18 *    specific language governing permissions and limitations
19 *    under the License.
20 * ====================================================================
21 * @endcopyright
22 *
23 * @file svn_auth.h
24 * @brief Subversion's authentication system
25 */
26
27#ifndef SVN_AUTH_H
28#define SVN_AUTH_H
29
30#include <apr.h>
31#include <apr_pools.h>
32#include <apr_hash.h>
33#include <apr_tables.h>
34
35#include "svn_types.h"
36#include "svn_config.h"
37
38#ifdef __cplusplus
39extern "C" {
40#endif /* __cplusplus */
41
42/** Overview of the svn authentication system.
43 *
44 * We define an authentication "provider" as a module that is able to
45 * return a specific set of credentials. (e.g. username/password,
46 * certificate, etc.)  Each provider implements a vtable that
47 *
48 * - can fetch initial credentials
49 * - can retry the fetch (or try to fetch something different)
50 * - can store the credentials for future use
51 *
52 * For any given type of credentials, there can exist any number of
53 * separate providers -- each provider has a different method of
54 * fetching. (i.e. from a disk store, by prompting the user, etc.)
55 *
56 * The application begins by creating an auth baton object, and
57 * "registers" some number of providers with the auth baton, in a
58 * specific order.  (For example, it may first register a
59 * username/password provider that looks in disk store, then register
60 * a username/password provider that prompts the user.)
61 *
62 * Later on, when any svn library is challenged, it asks the auth
63 * baton for the specific credentials.  If the initial credentials
64 * fail to authenticate, the caller keeps requesting new credentials.
65 * Under the hood, libsvn_auth effectively "walks" over each provider
66 * (in order of registry), one at a time, until all the providers have
67 * exhausted all their retry options.
68 *
69 * This system allows an application to flexibly define authentication
70 * behaviors (by changing registration order), and very easily write
71 * new authentication providers.
72 *
73 * An auth_baton also contains an internal hashtable of run-time
74 * parameters; any provider or library layer can set these run-time
75 * parameters at any time, so that the provider has access to the
76 * data.  (For example, certain run-time data may not be available
77 * until an authentication challenge is made.)  Each credential type
78 * must document the run-time parameters that are made available to
79 * its providers.
80 *
81 * @defgroup auth_fns Authentication functions
82 * @{
83 */
84
85
86/** The type of a Subversion authentication object */
87typedef struct svn_auth_baton_t svn_auth_baton_t;
88
89/** The type of a Subversion authentication-iteration object */
90typedef struct svn_auth_iterstate_t svn_auth_iterstate_t;
91
92
93/** The main authentication "provider" vtable. */
94typedef struct svn_auth_provider_t
95{
96  /** The kind of credentials this provider knows how to retrieve. */
97  const char *cred_kind;
98
99  /** Get an initial set of credentials.
100   *
101   * Set @a *credentials to a set of valid credentials within @a
102   * realmstring, or NULL if no credentials are available.  Set @a
103   * *iter_baton to context that allows a subsequent call to @c
104   * next_credentials, in case the first credentials fail to
105   * authenticate.  @a provider_baton is general context for the
106   * vtable, @a parameters contains any run-time data that the
107   * provider may need, and @a realmstring comes from the
108   * svn_auth_first_credentials() call.
109   */
110  svn_error_t * (*first_credentials)(void **credentials,
111                                     void **iter_baton,
112                                     void *provider_baton,
113                                     apr_hash_t *parameters,
114                                     const char *realmstring,
115                                     apr_pool_t *pool);
116
117  /** Get a different set of credentials.
118   *
119   * Set @a *credentials to another set of valid credentials (using @a
120   * iter_baton as the context from previous call to first_credentials
121   * or next_credentials).  If no more credentials are available, set
122   * @a *credentials to NULL.  If the provider only has one set of
123   * credentials, this function pointer should simply be NULL. @a
124   * provider_baton is general context for the vtable, @a parameters
125   * contains any run-time data that the provider may need, and @a
126   * realmstring comes from the svn_auth_first_credentials() call.
127   */
128  svn_error_t * (*next_credentials)(void **credentials,
129                                    void *iter_baton,
130                                    void *provider_baton,
131                                    apr_hash_t *parameters,
132                                    const char *realmstring,
133                                    apr_pool_t *pool);
134
135  /** Save credentials.
136   *
137   * Store @a credentials for future use.  @a provider_baton is
138   * general context for the vtable, and @a parameters contains any
139   * run-time data the provider may need.  Set @a *saved to TRUE if
140   * the save happened, or FALSE if not.  The provider is not required
141   * to save; if it refuses or is unable to save for non-fatal
142   * reasons, return FALSE.  If the provider never saves data, then
143   * this function pointer should simply be NULL. @a realmstring comes
144   * from the svn_auth_first_credentials() call.
145   */
146  svn_error_t * (*save_credentials)(svn_boolean_t *saved,
147                                    void *credentials,
148                                    void *provider_baton,
149                                    apr_hash_t *parameters,
150                                    const char *realmstring,
151                                    apr_pool_t *pool);
152
153} svn_auth_provider_t;
154
155
156/** A provider object, ready to be put into an array and given to
157    svn_auth_open(). */
158typedef struct svn_auth_provider_object_t
159{
160  const svn_auth_provider_t *vtable;
161  void *provider_baton;
162
163} svn_auth_provider_object_t;
164
165/** The type of function returning authentication provider. */
166typedef void (*svn_auth_simple_provider_func_t)(
167  svn_auth_provider_object_t **provider,
168  apr_pool_t *pool);
169
170
171/** Specific types of credentials **/
172
173/** Simple username/password pair credential kind.
174 *
175 * The following auth parameters are available to the providers:
176 *
177 * - @c SVN_AUTH_PARAM_CONFIG_CATEGORY_CONFIG (@c svn_config_t*)
178 * - @c SVN_AUTH_PARAM_CONFIG_CATEGORY_SERVERS (@c svn_config_t*)
179 *
180 * The following auth parameters may be available to the providers:
181 *
182 * - @c SVN_AUTH_PARAM_NO_AUTH_CACHE (@c void*)
183 * - @c SVN_AUTH_PARAM_DEFAULT_USERNAME (@c char*)
184 * - @c SVN_AUTH_PARAM_DEFAULT_PASSWORD (@c char*)
185 */
186#define SVN_AUTH_CRED_SIMPLE "svn.simple"
187
188/** @c SVN_AUTH_CRED_SIMPLE credentials. */
189typedef struct svn_auth_cred_simple_t
190{
191  /** Username */
192  const char *username;
193  /** Password */
194  const char *password;
195  /** Indicates if the credentials may be saved (to disk). For example, a
196   * GUI prompt implementation with a remember password checkbox shall set
197   * @a may_save to TRUE if the checkbox is checked.
198   */
199  svn_boolean_t may_save;
200} svn_auth_cred_simple_t;
201
202
203/** Username credential kind.
204 *
205 * The following optional auth parameters are relevant to the providers:
206 *
207 * - @c SVN_AUTH_PARAM_NO_AUTH_CACHE (@c void*)
208 * - @c SVN_AUTH_PARAM_DEFAULT_USERNAME (@c char*)
209 */
210#define SVN_AUTH_CRED_USERNAME "svn.username"
211
212/** @c SVN_AUTH_CRED_USERNAME credentials. */
213typedef struct svn_auth_cred_username_t
214{
215  /** Username */
216  const char *username;
217  /** Indicates if the credentials may be saved (to disk). For example, a
218   * GUI prompt implementation with a remember username checkbox shall set
219   * @a may_save to TRUE if the checkbox is checked.
220   */
221  svn_boolean_t may_save;
222} svn_auth_cred_username_t;
223
224
225/** SSL client certificate credential type.
226 *
227 * The following auth parameters are available to the providers:
228 *
229 * - @c SVN_AUTH_PARAM_CONFIG_CATEGORY_SERVERS (@c svn_config_t*)
230 * - @c SVN_AUTH_PARAM_SERVER_GROUP (@c char*)
231 *
232 * The following optional auth parameters are relevant to the providers:
233 *
234 * - @c SVN_AUTH_PARAM_NO_AUTH_CACHE (@c void*)
235 */
236#define SVN_AUTH_CRED_SSL_CLIENT_CERT "svn.ssl.client-cert"
237
238/** @c SVN_AUTH_CRED_SSL_CLIENT_CERT credentials. */
239typedef struct svn_auth_cred_ssl_client_cert_t
240{
241  /** Absolute path to the certificate file */
242  const char *cert_file;
243  /** Indicates if the credentials may be saved (to disk). For example, a
244   * GUI prompt implementation with a remember certificate checkbox shall
245   * set @a may_save to TRUE if the checkbox is checked.
246   */
247  svn_boolean_t may_save;
248} svn_auth_cred_ssl_client_cert_t;
249
250
251/** A function returning an SSL client certificate passphrase provider. */
252typedef void (*svn_auth_ssl_client_cert_pw_provider_func_t)(
253  svn_auth_provider_object_t **provider,
254  apr_pool_t *pool);
255
256/** SSL client certificate passphrase credential type.
257 *
258 * @note The realmstring used with this credential type must be a name that
259 * makes it possible for the user to identify the certificate.
260 *
261 * The following auth parameters are available to the providers:
262 *
263 * - @c SVN_AUTH_PARAM_CONFIG_CATEGORY_CONFIG (@c svn_config_t*)
264 * - @c SVN_AUTH_PARAM_CONFIG_CATEGORY_SERVERS (@c svn_config_t*)
265 * - @c SVN_AUTH_PARAM_SERVER_GROUP (@c char*)
266 *
267 * The following optional auth parameters are relevant to the providers:
268 *
269 * - @c SVN_AUTH_PARAM_NO_AUTH_CACHE (@c void*)
270 */
271#define SVN_AUTH_CRED_SSL_CLIENT_CERT_PW "svn.ssl.client-passphrase"
272
273/** @c SVN_AUTH_CRED_SSL_CLIENT_CERT_PW credentials. */
274typedef struct svn_auth_cred_ssl_client_cert_pw_t
275{
276  /** Certificate password */
277  const char *password;
278  /** Indicates if the credentials may be saved (to disk). For example, a
279   * GUI prompt implementation with a remember password checkbox shall set
280   * @a may_save to TRUE if the checkbox is checked.
281   */
282  svn_boolean_t may_save;
283} svn_auth_cred_ssl_client_cert_pw_t;
284
285
286/** SSL server verification credential type.
287 *
288 * The following auth parameters are available to the providers:
289 *
290 * - @c SVN_AUTH_PARAM_CONFIG_CATEGORY_SERVERS (@c svn_config_t*)
291 * - @c SVN_AUTH_PARAM_SERVER_GROUP (@c char*)
292 * - @c SVN_AUTH_PARAM_SSL_SERVER_FAILURES (@c apr_uint32_t*)
293 * - @c SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO
294 *      (@c svn_auth_ssl_server_cert_info_t*)
295 *
296 * The following optional auth parameters are relevant to the providers:
297 *
298 * - @c SVN_AUTH_PARAM_NO_AUTH_CACHE (@c void*)
299 */
300#define SVN_AUTH_CRED_SSL_SERVER_TRUST "svn.ssl.server"
301
302/** SSL server certificate information used by @c
303 * SVN_AUTH_CRED_SSL_SERVER_TRUST providers.
304 */
305typedef struct svn_auth_ssl_server_cert_info_t
306{
307  /** Primary CN */
308  const char *hostname;
309  /** ASCII fingerprint */
310  const char *fingerprint;
311  /** ASCII date from which the certificate is valid */
312  const char *valid_from;
313  /** ASCII date until which the certificate is valid */
314  const char *valid_until;
315  /** DN of the certificate issuer */
316  const char *issuer_dname;
317  /** Base-64 encoded DER certificate representation */
318  const char *ascii_cert;
319} svn_auth_ssl_server_cert_info_t;
320
321/**
322 * Return a deep copy of @a info, allocated in @a pool.
323 *
324 * @since New in 1.3.
325 */
326svn_auth_ssl_server_cert_info_t *
327svn_auth_ssl_server_cert_info_dup(const svn_auth_ssl_server_cert_info_t *info,
328                                  apr_pool_t *pool);
329
330/** @c SVN_AUTH_CRED_SSL_SERVER_TRUST credentials. */
331typedef struct svn_auth_cred_ssl_server_trust_t
332{
333  /** Indicates if the credentials may be saved (to disk). For example, a
334   * GUI prompt implementation with a checkbox to accept the certificate
335   * permanently shall set @a may_save to TRUE if the checkbox is checked.
336   */
337  svn_boolean_t may_save;
338  /** Bit mask of the accepted failures */
339  apr_uint32_t accepted_failures;
340} svn_auth_cred_ssl_server_trust_t;
341
342
343
344/** Credential-constructing prompt functions. **/
345
346/** These exist so that different client applications can use
347 * different prompt mechanisms to supply the same credentials.  For
348 * example, if authentication requires a username and password, a
349 * command-line client's prompting function might prompt first for the
350 * username and then for the password, whereas a GUI client's would
351 * present a single dialog box asking for both, and a telepathic
352 * client's would read all the information directly from the user's
353 * mind.  All these prompting functions return the same type of
354 * credential, but the information used to construct the credential is
355 * gathered in an interface-specific way in each case.
356 */
357
358/** Set @a *cred by prompting the user, allocating @a *cred in @a pool.
359 * @a baton is an implementation-specific closure.
360 *
361 * If @a realm is non-NULL, maybe use it in the prompt string.
362 *
363 * If @a username is non-NULL, then the user might be prompted only
364 * for a password, but @a *cred would still be filled with both
365 * username and password.  For example, a typical usage would be to
366 * pass @a username on the first call, but then leave it NULL for
367 * subsequent calls, on the theory that if credentials failed, it's
368 * as likely to be due to incorrect username as incorrect password.
369 *
370 * If @a may_save is FALSE, the auth system does not allow the credentials
371 * to be saved (to disk). A prompt function shall not ask the user if the
372 * credentials shall be saved if @a may_save is FALSE. For example, a GUI
373 * client with a remember password checkbox would grey out the checkbox if
374 * @a may_save is FALSE.
375 */
376typedef svn_error_t *(*svn_auth_simple_prompt_func_t)(
377  svn_auth_cred_simple_t **cred,
378  void *baton,
379  const char *realm,
380  const char *username,
381  svn_boolean_t may_save,
382  apr_pool_t *pool);
383
384
385/** Set @a *cred by prompting the user, allocating @a *cred in @a pool.
386 * @a baton is an implementation-specific closure.
387 *
388 * If @a realm is non-NULL, maybe use it in the prompt string.
389 *
390 * If @a may_save is FALSE, the auth system does not allow the credentials
391 * to be saved (to disk). A prompt function shall not ask the user if the
392 * credentials shall be saved if @a may_save is FALSE. For example, a GUI
393 * client with a remember username checkbox would grey out the checkbox if
394 * @a may_save is FALSE.
395 */
396typedef svn_error_t *(*svn_auth_username_prompt_func_t)(
397  svn_auth_cred_username_t **cred,
398  void *baton,
399  const char *realm,
400  svn_boolean_t may_save,
401  apr_pool_t *pool);
402
403
404/** @name SSL server certificate failure bits
405 *
406 * @note These values are stored in the on disk auth cache by the SSL
407 * server certificate auth provider, so the meaning of these bits must
408 * not be changed.
409 * @{
410 */
411/** Certificate is not yet valid. */
412#define SVN_AUTH_SSL_NOTYETVALID 0x00000001
413/** Certificate has expired. */
414#define SVN_AUTH_SSL_EXPIRED     0x00000002
415/** Certificate's CN (hostname) does not match the remote hostname. */
416#define SVN_AUTH_SSL_CNMISMATCH  0x00000004
417/** @brief Certificate authority is unknown (i.e. not trusted) */
418#define SVN_AUTH_SSL_UNKNOWNCA   0x00000008
419/** @brief Other failure. This can happen if an unknown failure occurs
420 * that we do not handle yet. */
421#define SVN_AUTH_SSL_OTHER       0x40000000
422/** @} */
423
424/** Set @a *cred by prompting the user, allocating @a *cred in @a pool.
425 * @a baton is an implementation-specific closure.
426 *
427 * @a cert_info is a structure describing the server cert that was
428 * presented to the client, and @a failures is a bitmask that
429 * describes exactly why the cert could not be automatically validated,
430 * composed from the constants SVN_AUTH_SSL_* (@c SVN_AUTH_SSL_NOTYETVALID
431 * etc.).  @a realm is a string that can be used in the prompt string.
432 *
433 * If @a may_save is FALSE, the auth system does not allow the credentials
434 * to be saved (to disk). A prompt function shall not ask the user if the
435 * credentials shall be saved if @a may_save is FALSE. For example, a GUI
436 * client with a trust permanently checkbox would grey out the checkbox if
437 * @a may_save is FALSE.
438 */
439typedef svn_error_t *(*svn_auth_ssl_server_trust_prompt_func_t)(
440  svn_auth_cred_ssl_server_trust_t **cred,
441  void *baton,
442  const char *realm,
443  apr_uint32_t failures,
444  const svn_auth_ssl_server_cert_info_t *cert_info,
445  svn_boolean_t may_save,
446  apr_pool_t *pool);
447
448
449/** Set @a *cred by prompting the user, allocating @a *cred in @a pool.
450 * @a baton is an implementation-specific closure.  @a realm is a string
451 * that can be used in the prompt string.
452 *
453 * If @a may_save is FALSE, the auth system does not allow the credentials
454 * to be saved (to disk). A prompt function shall not ask the user if the
455 * credentials shall be saved if @a may_save is FALSE. For example, a GUI
456 * client with a remember certificate checkbox would grey out the checkbox
457 * if @a may_save is FALSE.
458 */
459typedef svn_error_t *(*svn_auth_ssl_client_cert_prompt_func_t)(
460  svn_auth_cred_ssl_client_cert_t **cred,
461  void *baton,
462  const char *realm,
463  svn_boolean_t may_save,
464  apr_pool_t *pool);
465
466
467/** Set @a *cred by prompting the user, allocating @a *cred in @a pool.
468 * @a baton is an implementation-specific closure.  @a realm is a string
469 * identifying the certificate, and can be used in the prompt string.
470 *
471 * If @a may_save is FALSE, the auth system does not allow the credentials
472 * to be saved (to disk). A prompt function shall not ask the user if the
473 * credentials shall be saved if @a may_save is FALSE. For example, a GUI
474 * client with a remember password checkbox would grey out the checkbox if
475 * @a may_save is FALSE.
476 */
477typedef svn_error_t *(*svn_auth_ssl_client_cert_pw_prompt_func_t)(
478  svn_auth_cred_ssl_client_cert_pw_t **cred,
479  void *baton,
480  const char *realm,
481  svn_boolean_t may_save,
482  apr_pool_t *pool);
483
484/** A type of callback function for asking whether storing a password to
485 * disk in plaintext is allowed.
486 *
487 * In this callback, the client should ask the user whether storing
488 * a password for the realm identified by @a realmstring to disk
489 * in plaintext is allowed.
490 *
491 * The answer is returned in @a *may_save_plaintext.
492 * @a baton is an implementation-specific closure.
493 * All allocations should be done in @a pool.
494 *
495 * @since New in 1.6
496 */
497typedef svn_error_t *(*svn_auth_plaintext_prompt_func_t)(
498  svn_boolean_t *may_save_plaintext,
499  const char *realmstring,
500  void *baton,
501  apr_pool_t *pool);
502
503/** A type of callback function for asking whether storing a passphrase to
504 * disk in plaintext is allowed.
505 *
506 * In this callback, the client should ask the user whether storing
507 * a passphrase for the realm identified by @a realmstring to disk
508 * in plaintext is allowed.
509 *
510 * The answer is returned in @a *may_save_plaintext.
511 * @a baton is an implementation-specific closure.
512 * All allocations should be done in @a pool.
513 *
514 * @since New in 1.6
515 */
516typedef svn_error_t *(*svn_auth_plaintext_passphrase_prompt_func_t)(
517  svn_boolean_t *may_save_plaintext,
518  const char *realmstring,
519  void *baton,
520  apr_pool_t *pool);
521
522
523/** Initialize an authentication system.
524 *
525 * Return an authentication object in @a *auth_baton (allocated in @a
526 * pool) that represents a particular instance of the svn
527 * authentication system.  @a providers is an array of @c
528 * svn_auth_provider_object_t pointers, already allocated in @a pool
529 * and intentionally ordered.  These pointers will be stored within @a
530 * *auth_baton, grouped by credential type, and searched in this exact
531 * order.
532 */
533void
534svn_auth_open(svn_auth_baton_t **auth_baton,
535              const apr_array_header_t *providers,
536              apr_pool_t *pool);
537
538/** Set an authentication run-time parameter.
539 *
540 * Store @a name / @a value pair as a run-time parameter in @a
541 * auth_baton, making the data accessible to all providers.  @a name
542 * and @a value will NOT be duplicated into the auth_baton's pool.
543 * To delete a run-time parameter, pass NULL for @a value.
544 */
545void
546svn_auth_set_parameter(svn_auth_baton_t *auth_baton,
547                       const char *name,
548                       const void *value);
549
550/** Get an authentication run-time parameter.
551 *
552 * Return a value for run-time parameter @a name from @a auth_baton.
553 * Return NULL if the parameter doesn't exist.
554 */
555const void *
556svn_auth_get_parameter(svn_auth_baton_t *auth_baton,
557                       const char *name);
558
559/** Universal run-time parameters, made available to all providers.
560
561    If you are writing a new provider, then to be a "good citizen",
562    you should notice these global parameters!  Note that these
563    run-time params should be treated as read-only by providers; the
564    application is responsible for placing them into the auth_baton
565    hash. */
566
567/** The auth-hash prefix indicating that the parameter is global. */
568#define SVN_AUTH_PARAM_PREFIX "svn:auth:"
569
570/**
571 * @name Default credentials defines
572 * Property values are const char *.
573 * @{ */
574/** Default username provided by the application itself (e.g. --username) */
575#define SVN_AUTH_PARAM_DEFAULT_USERNAME  SVN_AUTH_PARAM_PREFIX "username"
576/** Default password provided by the application itself (e.g. --password) */
577#define SVN_AUTH_PARAM_DEFAULT_PASSWORD  SVN_AUTH_PARAM_PREFIX "password"
578/** @} */
579
580/** @brief The application doesn't want any providers to prompt
581 * users. Property value is irrelevant; only property's existence
582 * matters. */
583#define SVN_AUTH_PARAM_NON_INTERACTIVE  SVN_AUTH_PARAM_PREFIX "non-interactive"
584
585/** @brief The application doesn't want any providers to save passwords
586 * to disk. Property value is irrelevant; only property's existence
587 * matters. */
588#define SVN_AUTH_PARAM_DONT_STORE_PASSWORDS  SVN_AUTH_PARAM_PREFIX \
589                                                 "dont-store-passwords"
590
591/** @brief Indicates whether providers may save passwords to disk in
592 * plaintext. Property value can be either SVN_CONFIG_TRUE,
593 * SVN_CONFIG_FALSE, or SVN_CONFIG_ASK.
594 * @since New in 1.6.
595 */
596#define SVN_AUTH_PARAM_STORE_PLAINTEXT_PASSWORDS  SVN_AUTH_PARAM_PREFIX \
597                                                  "store-plaintext-passwords"
598
599/** @brief The application doesn't want any providers to save passphrase
600 * to disk. Property value is irrelevant; only property's existence
601 * matters.
602 * @since New in 1.6.
603 */
604#define SVN_AUTH_PARAM_DONT_STORE_SSL_CLIENT_CERT_PP \
605  SVN_AUTH_PARAM_PREFIX "dont-store-ssl-client-cert-pp"
606
607/** @brief Indicates whether providers may save passphrase to disk in
608 * plaintext. Property value can be either SVN_CONFIG_TRUE,
609 * SVN_CONFIG_FALSE, or SVN_CONFIG_ASK.
610 * @since New in 1.6.
611 */
612#define SVN_AUTH_PARAM_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT \
613  SVN_AUTH_PARAM_PREFIX "store-ssl-client-cert-pp-plaintext"
614
615/** @brief The application doesn't want any providers to save credentials
616 * to disk. Property value is irrelevant; only property's existence
617 * matters. */
618#define SVN_AUTH_PARAM_NO_AUTH_CACHE  SVN_AUTH_PARAM_PREFIX "no-auth-cache"
619
620/** @brief The following property is for SSL server cert providers. This
621 * provides a pointer to an @c apr_uint32_t containing the failures
622 * detected by the certificate validator. */
623#define SVN_AUTH_PARAM_SSL_SERVER_FAILURES SVN_AUTH_PARAM_PREFIX \
624  "ssl:failures"
625
626/** @brief The following property is for SSL server cert providers. This
627 * provides the cert info (svn_auth_ssl_server_cert_info_t). */
628#define SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO SVN_AUTH_PARAM_PREFIX \
629  "ssl:cert-info"
630
631/** This provides a pointer to a @c svn_config_t containting the config
632 * category. */
633#define SVN_AUTH_PARAM_CONFIG_CATEGORY_CONFIG SVN_AUTH_PARAM_PREFIX \
634  "config-category-config"
635
636/** This provides a pointer to a @c svn_config_t containting the servers
637 * category. */
638#define SVN_AUTH_PARAM_CONFIG_CATEGORY_SERVERS SVN_AUTH_PARAM_PREFIX \
639  "config-category-servers"
640
641/** @deprecated Provided for backward compatibility with the 1.5 API. */
642#define SVN_AUTH_PARAM_CONFIG SVN_AUTH_PARAM_CONFIG_CATEGORY_SERVERS
643
644/** The current server group. */
645#define SVN_AUTH_PARAM_SERVER_GROUP SVN_AUTH_PARAM_PREFIX "server-group"
646
647/** @brief A configuration directory that overrides the default
648 * ~/.subversion. */
649#define SVN_AUTH_PARAM_CONFIG_DIR SVN_AUTH_PARAM_PREFIX "config-dir"
650
651/** Get an initial set of credentials.
652 *
653 * Ask @a auth_baton to set @a *credentials to a set of credentials
654 * defined by @a cred_kind and valid within @a realmstring, or NULL if
655 * no credentials are available.  Otherwise, return an iteration state
656 * in @a *state, so that the caller can call
657 * svn_auth_next_credentials(), in case the first set of credentials
658 * fails to authenticate.
659 *
660 * Use @a pool to allocate @a *state, and for temporary allocation.
661 * Note that @a *credentials will be allocated in @a auth_baton's pool.
662 */
663svn_error_t *
664svn_auth_first_credentials(void **credentials,
665                           svn_auth_iterstate_t **state,
666                           const char *cred_kind,
667                           const char *realmstring,
668                           svn_auth_baton_t *auth_baton,
669                           apr_pool_t *pool);
670
671/** Get another set of credentials, assuming previous ones failed to
672 * authenticate.
673 *
674 * Use @a state to fetch a different set of @a *credentials, as a
675 * follow-up to svn_auth_first_credentials() or
676 * svn_auth_next_credentials().  If no more credentials are available,
677 * set @a *credentials to NULL.
678 *
679 * Note that @a *credentials will be allocated in @c auth_baton's pool.
680 */
681svn_error_t *
682svn_auth_next_credentials(void **credentials,
683                          svn_auth_iterstate_t *state,
684                          apr_pool_t *pool);
685
686/** Save a set of credentials.
687 *
688 * Ask @a state to store the most recently returned credentials,
689 * presumably because they successfully authenticated.
690 * All allocations should be done in @a pool.
691 *
692 * If no credentials were ever returned, do nothing.
693 */
694svn_error_t *
695svn_auth_save_credentials(svn_auth_iterstate_t *state,
696                          apr_pool_t *pool);
697
698/** Forget a set (or all) memory-cached credentials.
699 *
700 * Remove references (if any) in @a auth_baton to credentials cached
701 * therein.  If @a cred_kind and @a realmstring are non-NULL, forget
702 * only the credentials associated with those credential types and
703 * realm.  Otherwise @a cred_kind and @a realmstring must both be
704 * NULL, and this function will forget all credentials cached within
705 * @a auth_baton.
706 *
707 * @note This function does not affect persisted authentication
708 * credential storage at all.  It is merely a way to cause Subversion
709 * to forget about credentials already fetched from a provider,
710 * forcing them to be fetched again later should they be required.
711 *
712 * @since New in 1.8.
713 */
714svn_error_t *
715svn_auth_forget_credentials(svn_auth_baton_t *auth_baton,
716                            const char *cred_kind,
717                            const char *realmstring,
718                            apr_pool_t *pool);
719
720/** @} */
721
722/** Set @a *provider to an authentication provider of type
723 * svn_auth_cred_simple_t that gets information by prompting the user
724 * with @a prompt_func and @a prompt_baton.  Allocate @a *provider in
725 * @a pool.
726 *
727 * If both @c SVN_AUTH_PARAM_DEFAULT_USERNAME and
728 * @c SVN_AUTH_PARAM_DEFAULT_PASSWORD are defined as runtime
729 * parameters in the @c auth_baton, then @a *provider will return the
730 * default arguments when svn_auth_first_credentials() is called.  If
731 * svn_auth_first_credentials() fails, then @a *provider will
732 * re-prompt @a retry_limit times (via svn_auth_next_credentials()).
733 * For infinite retries, set @a retry_limit to value less than 0.
734 *
735 * @since New in 1.4.
736 */
737void
738svn_auth_get_simple_prompt_provider(svn_auth_provider_object_t **provider,
739                                    svn_auth_simple_prompt_func_t prompt_func,
740                                    void *prompt_baton,
741                                    int retry_limit,
742                                    apr_pool_t *pool);
743
744
745/** Set @a *provider to an authentication provider of type @c
746 * svn_auth_cred_username_t that gets information by prompting the
747 * user with @a prompt_func and @a prompt_baton.  Allocate @a *provider
748 * in @a pool.
749 *
750 * If @c SVN_AUTH_PARAM_DEFAULT_USERNAME is defined as a runtime
751 * parameter in the @c auth_baton, then @a *provider will return the
752 * default argument when svn_auth_first_credentials() is called.  If
753 * svn_auth_first_credentials() fails, then @a *provider will
754 * re-prompt @a retry_limit times (via svn_auth_next_credentials()).
755 * For infinite retries, set @a retry_limit to value less than 0.
756 *
757 * @since New in 1.4.
758 */
759void
760svn_auth_get_username_prompt_provider(
761  svn_auth_provider_object_t **provider,
762  svn_auth_username_prompt_func_t prompt_func,
763  void *prompt_baton,
764  int retry_limit,
765  apr_pool_t *pool);
766
767
768/** Set @a *provider to an authentication provider of type @c
769 * svn_auth_cred_simple_t that gets/sets information from the user's
770 * ~/.subversion configuration directory.
771 *
772 * If the provider is going to save the password unencrypted, it calls @a
773 * plaintext_prompt_func, passing @a prompt_baton, before saving the
774 * password.
775 *
776 * If @a plaintext_prompt_func is NULL it is not called and the answer is
777 * assumed to be TRUE. This matches the deprecated behaviour of storing
778 * unencrypted passwords by default, and is only done this way for backward
779 * compatibility reasons.
780 * Client developers are highly encouraged to provide this callback
781 * to ensure their users are made aware of the fact that their password
782 * is going to be stored unencrypted. In the future, providers may
783 * default to not storing the password unencrypted if this callback is NULL.
784 *
785 * Clients can however set the callback to NULL and set
786 * SVN_AUTH_PARAM_STORE_PLAINTEXT_PASSWORDS to SVN_CONFIG_FALSE or
787 * SVN_CONFIG_TRUE to enforce a certain behaviour.
788 *
789 * Allocate @a *provider in @a pool.
790 *
791 * If a default username or password is available, @a *provider will
792 * honor them as well, and return them when
793 * svn_auth_first_credentials() is called.  (see @c
794 * SVN_AUTH_PARAM_DEFAULT_USERNAME and @c
795 * SVN_AUTH_PARAM_DEFAULT_PASSWORD).
796 *
797 * @since New in 1.6.
798 */
799void
800svn_auth_get_simple_provider2(
801  svn_auth_provider_object_t **provider,
802  svn_auth_plaintext_prompt_func_t plaintext_prompt_func,
803  void *prompt_baton,
804  apr_pool_t *pool);
805
806/** Like svn_auth_get_simple_provider2, but without the ability to
807 * call the svn_auth_plaintext_prompt_func_t callback, and the provider
808 * always assumes that it is allowed to store the password in plaintext.
809 *
810 * @deprecated Provided for backwards compatibility with the 1.5 API.
811 * @since New in 1.4.
812 */
813SVN_DEPRECATED
814void
815svn_auth_get_simple_provider(svn_auth_provider_object_t **provider,
816                             apr_pool_t *pool);
817
818/** Set @a *provider to an authentication provider of type @c
819 * svn_auth_provider_object_t, or return @c NULL if the provider is not
820 * available for the requested platform or the requested provider is unknown.
821 *
822 * Valid @a provider_name values are: "gnome_keyring", "keychain", "kwallet",
823 * "gpg_agent", and "windows".
824 *
825 * Valid @a provider_type values are: "simple", "ssl_client_cert_pw" and
826 * "ssl_server_trust".
827 *
828 * Allocate @a *provider in @a pool.
829 *
830 * What actually happens is we invoke the appropriate provider function to
831 * supply the @a provider, like so:
832 *
833 *    svn_auth_get_<name>_<type>_provider(@a provider, @a pool);
834 *
835 * @since New in 1.6.
836 */
837svn_error_t *
838svn_auth_get_platform_specific_provider(
839  svn_auth_provider_object_t **provider,
840  const char *provider_name,
841  const char *provider_type,
842  apr_pool_t *pool);
843
844/** Set @a *providers to an array of <tt>svn_auth_provider_object_t *</tt>
845 * objects.
846 * Only client authentication providers available for the current platform are
847 * returned. Order of the platform-specific authentication providers is
848 * determined by the 'password-stores' configuration option which is retrieved
849 * from @a config. @a config can be NULL.
850 *
851 * Create and allocate @a *providers in @a pool.
852 *
853 * Default order of the platform-specific authentication providers:
854 *   1. gnome-keyring
855 *   2. kwallet
856 *   3. keychain
857 *   4. gpg-agent
858 *   5. windows-cryptoapi
859 *
860 * @since New in 1.6.
861 */
862svn_error_t *
863svn_auth_get_platform_specific_client_providers(
864  apr_array_header_t **providers,
865  svn_config_t *config,
866  apr_pool_t *pool);
867
868#if (defined(WIN32) && !defined(__MINGW32__)) || defined(DOXYGEN)
869/**
870 * Set @a *provider to an authentication provider of type @c
871 * svn_auth_cred_simple_t that gets/sets information from the user's
872 * ~/.subversion configuration directory.  Allocate @a *provider in
873 * @a pool.
874 *
875 * This is like svn_auth_get_simple_provider(), except that, when
876 * running on Window 2000 or newer (or any other Windows version that
877 * includes the CryptoAPI), the provider encrypts the password before
878 * storing it to disk. On earlier versions of Windows, the provider
879 * does nothing.
880 *
881 * @since New in 1.4.
882 * @note This function is only available on Windows.
883 *
884 * @note An administrative password reset may invalidate the account's
885 * secret key. This function will detect that situation and behave as
886 * if the password were not cached at all.
887 * @deprecated Provided for backwards compatibility with the 1.8 API.  Use
888 * svn_auth_get_platform_specific_provider with provider_name of "windows"
889 * and provider_type of "simple".
890 */
891SVN_DEPRECATED
892void
893svn_auth_get_windows_simple_provider(svn_auth_provider_object_t **provider,
894                                     apr_pool_t *pool);
895
896/**
897 * Set @a *provider to an authentication provider of type @c
898 * svn_auth_cred_ssl_client_cert_pw_t that gets/sets information from the
899 * user's ~/.subversion configuration directory.  Allocate @a *provider in
900 * @a pool.
901 *
902 * This is like svn_auth_get_ssl_client_cert_pw_file_provider(), except that
903 * when running on Window 2000 or newer, the provider encrypts the password
904 * before storing it to disk. On earlier versions of Windows, the provider
905 * does nothing.
906 *
907 * @since New in 1.6
908 * @note This function is only available on Windows.
909 *
910 * @note An administrative password reset may invalidate the account's
911 * secret key. This function will detect that situation and behave as
912 * if the password were not cached at all.
913 * @deprecated Provided for backwards compatibility with the 1.8 API.
914 * Use svn_auth_get_platform_specific_provider with provider_name
915 * of "windows" and provider_type of "ssl_client_cert_pw".
916 */
917SVN_DEPRECATED
918void
919svn_auth_get_windows_ssl_client_cert_pw_provider(
920  svn_auth_provider_object_t **provider,
921  apr_pool_t *pool);
922
923/**
924 * Set @a *provider to an authentication provider of type @c
925 * svn_auth_cred_ssl_server_trust_t, allocated in @a pool.
926 *
927 * This provider automatically validates ssl server certificates with
928 * the CryptoApi, like Internet Explorer and the Windows network API do.
929 * This allows the rollout of root certificates via Windows Domain
930 * policies, instead of Subversion specific configuration.
931 *
932 * @since New in 1.5.
933 * @note This function is only available on Windows.
934 * @deprecated Provided for backwards compatibility with the 1.8 API.
935 * Use svn_auth_get_platform_specific_provider with provider_name
936 * of "windows" and provider_type of "ssl_server_trust".
937 */
938SVN_DEPRECATED
939void
940svn_auth_get_windows_ssl_server_trust_provider(
941  svn_auth_provider_object_t **provider,
942  apr_pool_t *pool);
943
944#endif /* WIN32 && !__MINGW32__ || DOXYGEN */
945
946#if defined(DARWIN) || defined(DOXYGEN)
947/**
948 * Set @a *provider to an authentication provider of type @c
949 * svn_auth_cred_simple_t that gets/sets information from the user's
950 * ~/.subversion configuration directory.  Allocate @a *provider in
951 * @a pool.
952 *
953 * This is like svn_auth_get_simple_provider(), except that the
954 * password is stored in the Mac OS KeyChain.
955 *
956 * @since New in 1.4
957 * @note This function is only available on Mac OS 10.2 and higher.
958 * @deprecated Provided for backwards compatibility with the 1.8 API.
959 * Use svn_auth_get_platform_specific_provider with provider_name
960 * of "keychain" and provider_type of "simple".
961 */
962SVN_DEPRECATED
963void
964svn_auth_get_keychain_simple_provider(svn_auth_provider_object_t **provider,
965                                      apr_pool_t *pool);
966
967/**
968 * Set @a *provider to an authentication provider of type @c
969 * svn_auth_cred_ssl_client_cert_pw_t that gets/sets information from the
970 * user's ~/.subversion configuration directory.  Allocate @a *provider in
971 * @a pool.
972 *
973 * This is like svn_auth_get_ssl_client_cert_pw_file_provider(), except
974 * that the password is stored in the Mac OS KeyChain.
975 *
976 * @since New in 1.6
977 * @note This function is only available on Mac OS 10.2 and higher.
978 * @deprecated Provided for backwards compatibility with the 1.8 API.
979 * Use svn_auth_get_platform_specific_provider with provider_name
980 * of "keychain" and provider_type of "ssl_client_cert_pw".
981 */
982SVN_DEPRECATED
983void
984svn_auth_get_keychain_ssl_client_cert_pw_provider(
985  svn_auth_provider_object_t **provider,
986  apr_pool_t *pool);
987#endif /* DARWIN || DOXYGEN */
988
989/* Note that the gnome keyring unlock prompt related items below must be
990 * declared for all platforms in order to allow SWIG interfaces to be
991 * used regardless of the platform. */
992
993/** A type of callback function for obtaining the GNOME Keyring password.
994 *
995 * In this callback, the client should ask the user for default keyring
996 * @a keyring_name password.
997 *
998 * The answer is returned in @a *keyring_password.
999 * @a baton is an implementation-specific closure.
1000 * All allocations should be done in @a pool.
1001 *
1002 * @since New in 1.6
1003 */
1004typedef svn_error_t *(*svn_auth_gnome_keyring_unlock_prompt_func_t)(
1005  char **keyring_password,
1006  const char *keyring_name,
1007  void *baton,
1008  apr_pool_t *pool);
1009
1010
1011/** libsvn_auth_gnome_keyring-specific run-time parameters. */
1012
1013/** @brief The pointer to function which prompts user for GNOME Keyring
1014 * password.
1015 * The type of this pointer should be svn_auth_gnome_keyring_unlock_prompt_func_t.
1016 * @deprecated Only used by old libgnome-keyring implementation. */
1017#define SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_FUNC "gnome-keyring-unlock-prompt-func"
1018
1019/** @brief The baton which is passed to
1020 * @c *SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_FUNC.
1021 * @deprecated Only used by old libgnome-keyring implementation. */
1022#define SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_BATON "gnome-keyring-unlock-prompt-baton"
1023
1024#if (!defined(DARWIN) && !defined(WIN32)) || defined(DOXYGEN)
1025/**
1026 * Get libsvn_auth_gnome_keyring version information.
1027 *
1028 * @since New in 1.6
1029 */
1030const svn_version_t *
1031svn_auth_gnome_keyring_version(void);
1032
1033
1034/**
1035 * Set @a *provider to an authentication provider of type @c
1036 * svn_auth_cred_simple_t that gets/sets information from the user's
1037 * ~/.subversion configuration directory.
1038 *
1039 * This is like svn_client_get_simple_provider(), except that the
1040 * password is stored in GNOME Keyring.
1041 *
1042 * If the GNOME Keyring is locked the old libgnome-keyring provider calls
1043 * @c *SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_FUNC in order to unlock
1044 * the keyring.
1045 *
1046 * @c SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_BATON is passed to
1047 * @c *SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_FUNC.
1048 *
1049 * Allocate @a *provider in @a pool.
1050 *
1051 * @since New in 1.6
1052 * @note This function actually works only on systems with
1053 * libsvn_auth_gnome_keyring and GNOME Keyring installed.
1054 * @deprecated Provided for backwards compatibility with the 1.8 API.
1055 * Use svn_auth_get_platform_specific_provider with provider_name
1056 * of "gnome_keyring" and provider_type of "simple".
1057 */
1058SVN_DEPRECATED
1059void
1060svn_auth_get_gnome_keyring_simple_provider(
1061  svn_auth_provider_object_t **provider,
1062  apr_pool_t *pool);
1063
1064
1065/**
1066 * Set @a *provider to an authentication provider of type @c
1067 * svn_auth_cred_ssl_client_cert_pw_t that gets/sets information from the
1068 * user's ~/.subversion configuration directory.
1069 *
1070 * This is like svn_client_get_ssl_client_cert_pw_file_provider(), except
1071 * that the password is stored in GNOME Keyring.
1072 *
1073 * If the GNOME Keyring is locked the provider calls
1074 * @c *SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_FUNC in order to unlock
1075 * the keyring.
1076 *
1077 * @c SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_BATON is passed to
1078 * @c *SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_FUNC.
1079 *
1080 * Allocate @a *provider in @a pool.
1081 *
1082 * @since New in 1.6
1083 * @note This function actually works only on systems with
1084 * libsvn_auth_gnome_keyring and GNOME Keyring installed.
1085 * @deprecated Provided for backwards compatibility with the 1.8 API.
1086 * Use svn_auth_get_platform_specific_provider with provider_name
1087 * of "gnome_keyring" and provider_type of "ssl_client_cert_pw".
1088 */
1089SVN_DEPRECATED
1090void
1091svn_auth_get_gnome_keyring_ssl_client_cert_pw_provider(
1092  svn_auth_provider_object_t **provider,
1093  apr_pool_t *pool);
1094
1095
1096/**
1097 * Get libsvn_auth_kwallet version information.
1098 *
1099 * @since New in 1.6
1100 */
1101const svn_version_t *
1102svn_auth_kwallet_version(void);
1103
1104
1105/**
1106 * Set @a *provider to an authentication provider of type @c
1107 * svn_auth_cred_simple_t that gets/sets information from the user's
1108 * ~/.subversion configuration directory.  Allocate @a *provider in
1109 * @a pool.
1110 *
1111 * This is like svn_client_get_simple_provider(), except that the
1112 * password is stored in KWallet.
1113 *
1114 * @since New in 1.6
1115 * @note This function actually works only on systems with libsvn_auth_kwallet
1116 * and KWallet installed.
1117 * @deprecated Provided for backwards compatibility with the 1.8 API.
1118 * Use svn_auth_get_platform_specific_provider with provider_name
1119 * of "kwallet" and provider_type of "simple".
1120 */
1121SVN_DEPRECATED
1122void
1123svn_auth_get_kwallet_simple_provider(svn_auth_provider_object_t **provider,
1124                                     apr_pool_t *pool);
1125
1126
1127/**
1128 * Set @a *provider to an authentication provider of type @c
1129 * svn_auth_cred_ssl_client_cert_pw_t that gets/sets information from the
1130 * user's ~/.subversion configuration directory.  Allocate @a *provider in
1131 * @a pool.
1132 *
1133 * This is like svn_client_get_ssl_client_cert_pw_file_provider(), except
1134 * that the password is stored in KWallet.
1135 *
1136 * @since New in 1.6
1137 * @note This function actually works only on systems with libsvn_auth_kwallet
1138 * and KWallet installed.
1139 * @deprecated Provided for backwards compatibility with the 1.8 API.
1140 * Use svn_auth_get_platform_specific_provider with provider_name
1141 * of "kwallet" and provider_type of "ssl_client_cert_pw".
1142 */
1143SVN_DEPRECATED
1144void
1145svn_auth_get_kwallet_ssl_client_cert_pw_provider(
1146  svn_auth_provider_object_t **provider,
1147  apr_pool_t *pool);
1148#endif /* (!DARWIN && !WIN32) || DOXYGEN */
1149
1150#if !defined(WIN32) || defined(DOXYGEN)
1151/**
1152 * Set @a *provider to an authentication provider of type @c
1153 * svn_auth_cred_simple_t that gets/sets information from the user's
1154 * ~/.subversion configuration directory.
1155 *
1156 * This is like svn_client_get_simple_provider(), except that the
1157 * password is obtained from gpg_agent, which will keep it in
1158 * a memory cache.
1159 *
1160 * Allocate @a *provider in @a pool.
1161 *
1162 * @since New in 1.8
1163 * @note This function actually works only on systems with
1164 * GNU Privacy Guard installed.
1165 * @deprecated Provided for backwards compatibility with the 1.8 API.
1166 * Use svn_auth_get_platform_specific_provider with provider_name
1167 * of "gpg_agent" and provider_type of "simple".
1168 */
1169SVN_DEPRECATED
1170void
1171svn_auth_get_gpg_agent_simple_provider
1172    (svn_auth_provider_object_t **provider,
1173     apr_pool_t *pool);
1174#endif /* !defined(WIN32) || defined(DOXYGEN) */
1175
1176
1177/** Set @a *provider to an authentication provider of type @c
1178 * svn_auth_cred_username_t that gets/sets information from a user's
1179 * ~/.subversion configuration directory.  Allocate @a *provider in
1180 * @a pool.
1181 *
1182 * If a default username is available, @a *provider will honor it,
1183 * and return it when svn_auth_first_credentials() is called.  (See
1184 * @c SVN_AUTH_PARAM_DEFAULT_USERNAME.)
1185 *
1186 * @since New in 1.4.
1187 */
1188void
1189svn_auth_get_username_provider(svn_auth_provider_object_t **provider,
1190                               apr_pool_t *pool);
1191
1192
1193/** Set @a *provider to an authentication provider of type @c
1194 * svn_auth_cred_ssl_server_trust_t, allocated in @a pool.
1195 *
1196 * @a *provider retrieves its credentials from the configuration
1197 * mechanism.  The returned credential is used to override SSL
1198 * security on an error.
1199 *
1200 * @since New in 1.4.
1201 */
1202void
1203svn_auth_get_ssl_server_trust_file_provider(
1204  svn_auth_provider_object_t **provider,
1205  apr_pool_t *pool);
1206
1207/** Set @a *provider to an authentication provider of type @c
1208 * svn_auth_cred_ssl_client_cert_t, allocated in @a pool.
1209 *
1210 * @a *provider retrieves its credentials from the configuration
1211 * mechanism.  The returned credential is used to load the appropriate
1212 * client certificate for authentication when requested by a server.
1213 *
1214 * @since New in 1.4.
1215 */
1216void
1217svn_auth_get_ssl_client_cert_file_provider(
1218  svn_auth_provider_object_t **provider,
1219  apr_pool_t *pool);
1220
1221
1222/** Set @a *provider to an authentication provider of type @c
1223 * svn_auth_cred_ssl_client_cert_pw_t that gets/sets information from the user's
1224 * ~/.subversion configuration directory.
1225 *
1226 * If the provider is going to save the passphrase unencrypted,
1227 * it calls @a plaintext_passphrase_prompt_func, passing @a
1228 * prompt_baton, before saving the passphrase.
1229 *
1230 * If @a plaintext_passphrase_prompt_func is NULL it is not called
1231 * and the passphrase is not stored in plaintext.
1232 * Client developers are highly encouraged to provide this callback
1233 * to ensure their users are made aware of the fact that their passphrase
1234 * is going to be stored unencrypted.
1235 *
1236 * Clients can however set the callback to NULL and set
1237 * SVN_AUTH_PARAM_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT to SVN_CONFIG_FALSE or
1238 * SVN_CONFIG_TRUE to enforce a certain behaviour.
1239 *
1240 * Allocate @a *provider in @a pool.
1241 *
1242 * @since New in 1.6.
1243 */
1244void
1245svn_auth_get_ssl_client_cert_pw_file_provider2(
1246  svn_auth_provider_object_t **provider,
1247  svn_auth_plaintext_passphrase_prompt_func_t plaintext_passphrase_prompt_func,
1248  void *prompt_baton,
1249  apr_pool_t *pool);
1250
1251/** Like svn_auth_get_ssl_client_cert_pw_file_provider2, but without
1252 * the ability to call the svn_auth_plaintext_passphrase_prompt_func_t
1253 * callback, and the provider always assumes that it is not allowed
1254 * to store the passphrase in plaintext.
1255 *
1256 * @deprecated Provided for backwards compatibility with the 1.5 API.
1257 * @since New in 1.4.
1258 */
1259SVN_DEPRECATED
1260void
1261svn_auth_get_ssl_client_cert_pw_file_provider(
1262  svn_auth_provider_object_t **provider,
1263  apr_pool_t *pool);
1264
1265
1266/** Set @a *provider to an authentication provider of type @c
1267 * svn_auth_cred_ssl_server_trust_t, allocated in @a pool.
1268 *
1269 * @a *provider retrieves its credentials by using the @a prompt_func
1270 * and @a prompt_baton.  The returned credential is used to override
1271 * SSL security on an error.
1272 *
1273 * @since New in 1.4.
1274 */
1275void
1276svn_auth_get_ssl_server_trust_prompt_provider(
1277  svn_auth_provider_object_t **provider,
1278  svn_auth_ssl_server_trust_prompt_func_t prompt_func,
1279  void *prompt_baton,
1280  apr_pool_t *pool);
1281
1282
1283/** Set @a *provider to an authentication provider of type @c
1284 * svn_auth_cred_ssl_client_cert_t, allocated in @a pool.
1285 *
1286 * @a *provider retrieves its credentials by using the @a prompt_func
1287 * and @a prompt_baton.  The returned credential is used to load the
1288 * appropriate client certificate for authentication when requested by
1289 * a server.  The prompt will be retried @a retry_limit times. For
1290 * infinite retries, set @a retry_limit to value less than 0.
1291 *
1292 * @since New in 1.4.
1293 */
1294void
1295svn_auth_get_ssl_client_cert_prompt_provider(
1296  svn_auth_provider_object_t **provider,
1297  svn_auth_ssl_client_cert_prompt_func_t prompt_func,
1298  void *prompt_baton,
1299  int retry_limit,
1300  apr_pool_t *pool);
1301
1302
1303/** Set @a *provider to an authentication provider of type @c
1304 * svn_auth_cred_ssl_client_cert_pw_t, allocated in @a pool.
1305 *
1306 * @a *provider retrieves its credentials by using the @a prompt_func
1307 * and @a prompt_baton.  The returned credential is used when a loaded
1308 * client certificate is protected by a passphrase.  The prompt will
1309 * be retried @a retry_limit times. For infinite retries, set
1310 * @a retry_limit to value less than 0.
1311 *
1312 * @since New in 1.4.
1313 */
1314void
1315svn_auth_get_ssl_client_cert_pw_prompt_provider(
1316  svn_auth_provider_object_t **provider,
1317  svn_auth_ssl_client_cert_pw_prompt_func_t prompt_func,
1318  void *prompt_baton,
1319  int retry_limit,
1320  apr_pool_t *pool);
1321
1322
1323#ifdef __cplusplus
1324}
1325#endif /* __cplusplus */
1326
1327#endif /* SVN_AUTH_H */
1328