00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "internal.h"
00024
00025 #if USE_DIGEST_MD5
00026 # include "qop.h"
00027 #endif
00028
00045 int
00046 gsasl_client_listmech (Gsasl * ctx, char *out, size_t * outlen)
00047 {
00048 char *tmp;
00049 int rc;
00050
00051 rc = gsasl_client_mechlist (ctx, &tmp);
00052
00053 if (rc == GSASL_OK)
00054 {
00055 size_t tmplen = strlen (tmp);
00056
00057 if (tmplen >= *outlen)
00058 {
00059 free (tmp);
00060 return GSASL_TOO_SMALL_BUFFER;
00061 }
00062
00063 if (out)
00064 strcpy (out, tmp);
00065 *outlen = tmplen + 1;
00066 free (tmp);
00067 }
00068
00069 return rc;
00070 }
00071
00088 int
00089 gsasl_server_listmech (Gsasl * ctx, char *out, size_t * outlen)
00090 {
00091 char *tmp;
00092 int rc;
00093
00094 rc = gsasl_server_mechlist (ctx, &tmp);
00095
00096 if (rc == GSASL_OK)
00097 {
00098 size_t tmplen = strlen (tmp);
00099
00100 if (tmplen >= *outlen)
00101 {
00102 free (tmp);
00103 return GSASL_TOO_SMALL_BUFFER;
00104 }
00105
00106 if (out)
00107 strcpy (out, tmp);
00108 *outlen = tmplen + 1;
00109 free (tmp);
00110 }
00111
00112 return rc;
00113 }
00114
00115 static int
00116 _gsasl_step (Gsasl_session * sctx,
00117 const char *input, size_t input_len,
00118 char *output, size_t * output_len)
00119 {
00120 char *tmp;
00121 size_t tmplen;
00122 int rc;
00123
00124 rc = gsasl_step (sctx, input, input_len, &tmp, &tmplen);
00125
00126 if (rc == GSASL_OK || rc == GSASL_NEEDS_MORE)
00127 {
00128 if (tmplen >= *output_len)
00129 {
00130 free (tmp);
00131
00132 return GSASL_TOO_SMALL_BUFFER;
00133 }
00134
00135 if (output)
00136 memcpy (output, tmp, tmplen);
00137 *output_len = tmplen;
00138 free (tmp);
00139 }
00140
00141 return rc;
00142 }
00143
00166 int
00167 gsasl_client_step (Gsasl_session * sctx,
00168 const char *input,
00169 size_t input_len, char *output, size_t * output_len)
00170 {
00171 return _gsasl_step (sctx, input, input_len, output, output_len);
00172 }
00173
00196 int
00197 gsasl_server_step (Gsasl_session * sctx,
00198 const char *input,
00199 size_t input_len, char *output, size_t * output_len)
00200 {
00201 return _gsasl_step (sctx, input, input_len, output, output_len);
00202 }
00203
00204 static int
00205 _gsasl_step64 (Gsasl_session * sctx,
00206 const char *b64input, char *b64output, size_t b64output_len)
00207 {
00208 char *tmp;
00209 int rc;
00210
00211 rc = gsasl_step64 (sctx, b64input, &tmp);
00212
00213 if (rc == GSASL_OK || rc == GSASL_NEEDS_MORE)
00214 {
00215 if (b64output_len <= strlen (tmp))
00216 {
00217 free (tmp);
00218
00219 return GSASL_TOO_SMALL_BUFFER;
00220 }
00221
00222 if (b64output)
00223 strcpy (b64output, tmp);
00224 free (tmp);
00225 }
00226
00227 return rc;
00228 }
00229
00244 int
00245 gsasl_client_step_base64 (Gsasl_session * sctx,
00246 const char *b64input,
00247 char *b64output, size_t b64output_len)
00248 {
00249 return _gsasl_step64 (sctx, b64input, b64output, b64output_len);
00250 }
00251
00266 int
00267 gsasl_server_step_base64 (Gsasl_session * sctx,
00268 const char *b64input,
00269 char *b64output, size_t b64output_len)
00270 {
00271 return _gsasl_step64 (sctx, b64input, b64output, b64output_len);
00272 }
00273
00283 void
00284 gsasl_client_finish (Gsasl_session * sctx)
00285 {
00286 gsasl_finish (sctx);
00287 }
00288
00298 void
00299 gsasl_server_finish (Gsasl_session * sctx)
00300 {
00301 gsasl_finish (sctx);
00302 }
00303
00314 Gsasl *
00315 gsasl_client_ctx_get (Gsasl_session * sctx)
00316 {
00317 return sctx->ctx;
00318 }
00319
00334 void
00335 gsasl_client_application_data_set (Gsasl_session * sctx,
00336 void *application_data)
00337 {
00338 gsasl_appinfo_set (sctx, application_data);
00339 }
00340
00355 void *
00356 gsasl_client_application_data_get (Gsasl_session * sctx)
00357 {
00358 return gsasl_appinfo_get (sctx);
00359 }
00360
00371 Gsasl *
00372 gsasl_server_ctx_get (Gsasl_session * sctx)
00373 {
00374 return sctx->ctx;
00375 }
00376
00391 void
00392 gsasl_server_application_data_set (Gsasl_session * sctx,
00393 void *application_data)
00394 {
00395 gsasl_appinfo_set (sctx, application_data);
00396 }
00397
00412 void *
00413 gsasl_server_application_data_get (Gsasl_session * sctx)
00414 {
00415 return gsasl_appinfo_get (sctx);
00416 }
00417
00431 int
00432 gsasl_randomize (int strong, char *data, size_t datalen)
00433 {
00434 if (strong)
00435 return gsasl_random (data, datalen);
00436 return gsasl_nonce (data, datalen);
00437 }
00438
00449 Gsasl *
00450 gsasl_ctx_get (Gsasl_session * sctx)
00451 {
00452 return sctx->ctx;
00453 }
00454
00473 int
00474 gsasl_encode_inline (Gsasl_session * sctx,
00475 const char *input, size_t input_len,
00476 char *output, size_t * output_len)
00477 {
00478 char *tmp;
00479 size_t tmplen;
00480 int res;
00481
00482 res = gsasl_encode (sctx, input, input_len, &tmp, &tmplen);
00483 if (res == GSASL_OK)
00484 {
00485 if (*output_len < tmplen)
00486 return GSASL_TOO_SMALL_BUFFER;
00487 *output_len = tmplen;
00488 memcpy (output, tmp, tmplen);
00489 free (output);
00490 }
00491
00492 return res;
00493 }
00494
00513 int
00514 gsasl_decode_inline (Gsasl_session * sctx,
00515 const char *input, size_t input_len,
00516 char *output, size_t * output_len)
00517 {
00518 char *tmp;
00519 size_t tmplen;
00520 int res;
00521
00522 res = gsasl_decode (sctx, input, input_len, &tmp, &tmplen);
00523 if (res == GSASL_OK)
00524 {
00525 if (*output_len < tmplen)
00526 return GSASL_TOO_SMALL_BUFFER;
00527 *output_len = tmplen;
00528 memcpy (output, tmp, tmplen);
00529 free (output);
00530 }
00531
00532 return res;
00533 }
00534
00548 void
00549 gsasl_application_data_set (Gsasl * ctx, void *appdata)
00550 {
00551 ctx->application_hook = appdata;
00552 }
00553
00567 void *
00568 gsasl_application_data_get (Gsasl * ctx)
00569 {
00570 return ctx->application_hook;
00571 }
00572
00586 void
00587 gsasl_appinfo_set (Gsasl_session * sctx, void *appdata)
00588 {
00589 sctx->application_data = appdata;
00590 }
00591
00605 void *
00606 gsasl_appinfo_get (Gsasl_session * sctx)
00607 {
00608 return sctx->application_data;
00609 }
00610
00626 const char *
00627 gsasl_server_suggest_mechanism (Gsasl * ctx, const char *mechlist)
00628 {
00629 return NULL;
00630 }
00631
00646 void
00647 gsasl_client_callback_authentication_id_set (Gsasl * ctx,
00648 Gsasl_client_callback_authentication_id
00649 cb)
00650 {
00651 ctx->cbc_authentication_id = cb;
00652 }
00653
00669 Gsasl_client_callback_authentication_id
00670 gsasl_client_callback_authentication_id_get (Gsasl * ctx)
00671 {
00672 return ctx ? ctx->cbc_authentication_id : NULL;
00673 }
00674
00689 void
00690 gsasl_client_callback_authorization_id_set (Gsasl * ctx,
00691 Gsasl_client_callback_authorization_id
00692 cb)
00693 {
00694 ctx->cbc_authorization_id = cb;
00695 }
00696
00712 Gsasl_client_callback_authorization_id
00713 gsasl_client_callback_authorization_id_get (Gsasl * ctx)
00714 {
00715 return ctx ? ctx->cbc_authorization_id : NULL;
00716 }
00717
00732 void
00733 gsasl_client_callback_password_set (Gsasl * ctx,
00734 Gsasl_client_callback_password cb)
00735 {
00736 ctx->cbc_password = cb;
00737 }
00738
00739
00755 Gsasl_client_callback_password
00756 gsasl_client_callback_password_get (Gsasl * ctx)
00757 {
00758 return ctx ? ctx->cbc_password : NULL;
00759 }
00760
00775 void
00776 gsasl_client_callback_passcode_set (Gsasl * ctx,
00777 Gsasl_client_callback_passcode cb)
00778 {
00779 ctx->cbc_passcode = cb;
00780 }
00781
00782
00798 Gsasl_client_callback_passcode
00799 gsasl_client_callback_passcode_get (Gsasl * ctx)
00800 {
00801 return ctx ? ctx->cbc_passcode : NULL;
00802 }
00803
00820 void
00821 gsasl_client_callback_pin_set (Gsasl * ctx, Gsasl_client_callback_pin cb)
00822 {
00823 ctx->cbc_pin = cb;
00824 }
00825
00826
00842 Gsasl_client_callback_pin
00843 gsasl_client_callback_pin_get (Gsasl * ctx)
00844 {
00845 return ctx ? ctx->cbc_pin : NULL;
00846 }
00847
00865 void
00866 gsasl_client_callback_service_set (Gsasl * ctx,
00867 Gsasl_client_callback_service cb)
00868 {
00869 ctx->cbc_service = cb;
00870 }
00871
00887 Gsasl_client_callback_service
00888 gsasl_client_callback_service_get (Gsasl * ctx)
00889 {
00890 return ctx ? ctx->cbc_service : NULL;
00891 }
00892
00908 void
00909 gsasl_client_callback_anonymous_set (Gsasl * ctx,
00910 Gsasl_client_callback_anonymous cb)
00911 {
00912 ctx->cbc_anonymous = cb;
00913 }
00914
00930 Gsasl_client_callback_anonymous
00931 gsasl_client_callback_anonymous_get (Gsasl * ctx)
00932 {
00933 return ctx ? ctx->cbc_anonymous : NULL;
00934 }
00935
00950 void
00951 gsasl_client_callback_qop_set (Gsasl * ctx, Gsasl_client_callback_qop cb)
00952 {
00953 ctx->cbc_qop = cb;
00954 }
00955
00971 Gsasl_client_callback_qop
00972 gsasl_client_callback_qop_get (Gsasl * ctx)
00973 {
00974 return ctx ? ctx->cbc_qop : NULL;
00975 }
00976
00994 void
00995 gsasl_client_callback_maxbuf_set (Gsasl * ctx,
00996 Gsasl_client_callback_maxbuf cb)
00997 {
00998 ctx->cbc_maxbuf = cb;
00999 }
01000
01016 Gsasl_client_callback_maxbuf
01017 gsasl_client_callback_maxbuf_get (Gsasl * ctx)
01018 {
01019 return ctx ? ctx->cbc_maxbuf : NULL;
01020 }
01021
01037 void
01038 gsasl_client_callback_realm_set (Gsasl * ctx, Gsasl_client_callback_realm cb)
01039 {
01040 ctx->cbc_realm = cb;
01041 }
01042
01058 Gsasl_client_callback_realm
01059 gsasl_client_callback_realm_get (Gsasl * ctx)
01060 {
01061 return ctx ? ctx->cbc_realm : NULL;
01062 }
01063
01079 void
01080 gsasl_server_callback_validate_set (Gsasl * ctx,
01081 Gsasl_server_callback_validate cb)
01082 {
01083 ctx->cbs_validate = cb;
01084 }
01085
01101 Gsasl_server_callback_validate
01102 gsasl_server_callback_validate_get (Gsasl * ctx)
01103 {
01104 return ctx ? ctx->cbs_validate : NULL;
01105 }
01106
01122 void
01123 gsasl_server_callback_retrieve_set (Gsasl * ctx,
01124 Gsasl_server_callback_retrieve cb)
01125 {
01126 ctx->cbs_retrieve = cb;
01127 }
01128
01144 Gsasl_server_callback_retrieve
01145 gsasl_server_callback_retrieve_get (Gsasl * ctx)
01146 {
01147 return ctx ? ctx->cbs_retrieve : NULL;
01148 }
01149
01165 void
01166 gsasl_server_callback_cram_md5_set (Gsasl * ctx,
01167 Gsasl_server_callback_cram_md5 cb)
01168 {
01169 ctx->cbs_cram_md5 = cb;
01170 }
01171
01187 Gsasl_server_callback_cram_md5
01188 gsasl_server_callback_cram_md5_get (Gsasl * ctx)
01189 {
01190 return ctx ? ctx->cbs_cram_md5 : NULL;
01191 }
01192
01208 void
01209 gsasl_server_callback_digest_md5_set (Gsasl * ctx,
01210 Gsasl_server_callback_digest_md5 cb)
01211 {
01212 ctx->cbs_digest_md5 = cb;
01213 }
01214
01230 Gsasl_server_callback_digest_md5
01231 gsasl_server_callback_digest_md5_get (Gsasl * ctx)
01232 {
01233 return ctx->cbs_digest_md5;
01234 }
01235
01250 void
01251 gsasl_server_callback_external_set (Gsasl * ctx,
01252 Gsasl_server_callback_external cb)
01253 {
01254 ctx->cbs_external = cb;
01255 }
01256
01272 Gsasl_server_callback_external
01273 gsasl_server_callback_external_get (Gsasl * ctx)
01274 {
01275 return ctx ? ctx->cbs_external : NULL;
01276 }
01277
01292 void
01293 gsasl_server_callback_anonymous_set (Gsasl * ctx,
01294 Gsasl_server_callback_anonymous cb)
01295 {
01296 ctx->cbs_anonymous = cb;
01297 }
01298
01314 Gsasl_server_callback_anonymous
01315 gsasl_server_callback_anonymous_get (Gsasl * ctx)
01316 {
01317 return ctx ? ctx->cbs_anonymous : NULL;
01318 }
01319
01335 void
01336 gsasl_server_callback_realm_set (Gsasl * ctx, Gsasl_server_callback_realm cb)
01337 {
01338 ctx->cbs_realm = cb;
01339 }
01340
01356 Gsasl_server_callback_realm
01357 gsasl_server_callback_realm_get (Gsasl * ctx)
01358 {
01359 return ctx ? ctx->cbs_realm : NULL;
01360 }
01361
01378 void
01379 gsasl_server_callback_qop_set (Gsasl * ctx, Gsasl_server_callback_qop cb)
01380 {
01381 ctx->cbs_qop = cb;
01382 }
01383
01399 Gsasl_server_callback_qop
01400 gsasl_server_callback_qop_get (Gsasl * ctx)
01401 {
01402 return ctx ? ctx->cbs_qop : NULL;
01403 }
01404
01422 void
01423 gsasl_server_callback_maxbuf_set (Gsasl * ctx,
01424 Gsasl_server_callback_maxbuf cb)
01425 {
01426 ctx->cbs_maxbuf = cb;
01427 }
01428
01444 Gsasl_server_callback_maxbuf
01445 gsasl_server_callback_maxbuf_get (Gsasl * ctx)
01446 {
01447 return ctx ? ctx->cbs_maxbuf : NULL;
01448 }
01449
01466 void
01467 gsasl_server_callback_cipher_set (Gsasl * ctx,
01468 Gsasl_server_callback_cipher cb)
01469 {
01470 ctx->cbs_cipher = cb;
01471 }
01472
01488 Gsasl_server_callback_cipher
01489 gsasl_server_callback_cipher_get (Gsasl * ctx)
01490 {
01491 return ctx ? ctx->cbs_cipher : NULL;
01492 }
01493
01515 void
01516 gsasl_server_callback_securid_set (Gsasl * ctx,
01517 Gsasl_server_callback_securid cb)
01518 {
01519 ctx->cbs_securid = cb;
01520 }
01521
01537 Gsasl_server_callback_securid
01538 gsasl_server_callback_securid_get (Gsasl * ctx)
01539 {
01540 return ctx ? ctx->cbs_securid : NULL;
01541 }
01542
01560 void
01561 gsasl_server_callback_gssapi_set (Gsasl * ctx,
01562 Gsasl_server_callback_gssapi cb)
01563 {
01564 ctx->cbs_gssapi = cb;
01565 }
01566
01582 Gsasl_server_callback_gssapi
01583 gsasl_server_callback_gssapi_get (Gsasl * ctx)
01584 {
01585 return ctx ? ctx->cbs_gssapi : NULL;
01586 }
01587
01604 void
01605 gsasl_server_callback_service_set (Gsasl * ctx,
01606 Gsasl_server_callback_service cb)
01607 {
01608 ctx->cbs_service = cb;
01609 }
01610
01626 Gsasl_server_callback_service
01627 gsasl_server_callback_service_get (Gsasl * ctx)
01628 {
01629 return ctx ? ctx->cbs_service : NULL;
01630 }
01631
01632 #if HAVE_LIBIDN
01633 # include <stringprep.h>
01634 #endif
01635
01662 char *
01663 gsasl_stringprep_nfkc (const char *in, ssize_t len)
01664 {
01665 char *out = NULL;
01666
01667 #if HAVE_LIBIDN
01668 out = stringprep_utf8_nfkc_normalize (in, len);
01669 #endif
01670
01671 return out;
01672 }
01673
01693 char *
01694 gsasl_stringprep_saslprep (const char *in, int *stringprep_rc)
01695 {
01696 char *out = NULL;
01697 #if HAVE_LIBIDN
01698 int rc;
01699
01700 rc = stringprep_profile (in, &out, "SASLprep", 0);
01701 if (stringprep_rc)
01702 *stringprep_rc = rc;
01703 if (rc != STRINGPREP_OK)
01704 out = NULL;
01705 #endif
01706
01707 return out;
01708 }
01709
01727 char *
01728 gsasl_stringprep_trace (const char *in, int *stringprep_rc)
01729 {
01730 char *out = NULL;
01731 #if HAVE_LIBIDN
01732 int rc;
01733
01734 rc = stringprep_profile (in, &out, "trace", 0);
01735 if (stringprep_rc)
01736 *stringprep_rc = rc;
01737 if (rc != STRINGPREP_OK)
01738 out = NULL;
01739 #endif
01740
01741 return out;
01742 }
01743
01768 int
01769 gsasl_md5pwd_get_password (const char *filename,
01770 const char *username, char *key, size_t * keylen)
01771 {
01772 char *tmp;
01773 size_t tmplen;
01774 int res;
01775 FILE *fh;
01776
01777 fh = fopen (filename, "r");
01778 if (fh == NULL)
01779 return GSASL_FOPEN_ERROR;
01780 fclose (fh);
01781
01782 res = gsasl_simple_getpass (filename, username, &tmp);
01783 if (res != GSASL_OK)
01784 return res;
01785
01786 tmplen = strlen (tmp);
01787
01788 if (*keylen < tmplen + 1)
01789 {
01790 free (tmp);
01791 return GSASL_TOO_SMALL_BUFFER;
01792 }
01793
01794 *keylen = tmplen;
01795
01796 if (key)
01797 memcpy (key, tmp, tmplen);
01798
01799 free (tmp);
01800
01801 return GSASL_OK;
01802 }
01803
01804 #include <minmax.h>
01805
01822 int
01823 gsasl_base64_encode (char const *src,
01824 size_t srclength, char *target, size_t targsize)
01825 {
01826 int rc;
01827 char *out;
01828 size_t outlen;
01829 int copied;
01830
01831 rc = gsasl_base64_to (src, srclength, &out, &outlen);
01832 if (rc)
01833 return -1;
01834
01835 copied = MIN (outlen, targsize);
01836 memcpy (target, out, copied);
01837 free (out);
01838
01839 return copied;
01840 }
01841
01857 int
01858 gsasl_base64_decode (char const *src, char *target, size_t targsize)
01859 {
01860 int rc;
01861 char *out;
01862 size_t outlen;
01863 int copied;
01864
01865 rc = gsasl_base64_from (src, strlen (src), &out, &outlen);
01866 if (rc)
01867 return -1;
01868
01869 copied = MIN (outlen, targsize);
01870 memcpy (target, out, copied);
01871 free (out);
01872
01873 return copied;
01874 }
01875
01876 static const char *
01877 pmap (Gsasl_session * sctx, Gsasl_property prop, char *buf, size_t buflen)
01878 {
01879 int res;
01880
01881 buf[0] = '\0';
01882
01883
01884
01885 switch (prop)
01886 {
01887 case GSASL_SERVICE:
01888 {
01889 Gsasl_client_callback_service cb_service
01890 = gsasl_client_callback_service_get (sctx->ctx);
01891 if (!cb_service)
01892 break;
01893 res = cb_service (sctx, buf, &buflen, NULL, 0, NULL, 0);
01894 if (res != GSASL_OK)
01895 break;
01896 buf[buflen] = '\0';
01897 gsasl_property_set (sctx, prop, buf);
01898 break;
01899 }
01900
01901 case GSASL_HOSTNAME:
01902 {
01903 Gsasl_client_callback_service cb_service
01904 = gsasl_client_callback_service_get (sctx->ctx);
01905 if (!cb_service)
01906 break;
01907 res = cb_service (sctx, NULL, 0, buf, &buflen, NULL, 0);
01908 if (res != GSASL_OK)
01909 break;
01910 buf[buflen] = '\0';
01911 gsasl_property_set (sctx, prop, buf);
01912 break;
01913 }
01914
01915 case GSASL_ANONYMOUS_TOKEN:
01916 {
01917 Gsasl_client_callback_anonymous cb_anonymous
01918 = gsasl_client_callback_anonymous_get (sctx->ctx);
01919 if (!cb_anonymous)
01920 break;
01921 res = cb_anonymous (sctx, buf, &buflen);
01922 if (res != GSASL_OK)
01923 break;
01924 buf[buflen] = '\0';
01925 gsasl_property_set (sctx, prop, buf);
01926 break;
01927 }
01928
01929 case GSASL_AUTHID:
01930 {
01931 Gsasl_client_callback_authentication_id cb_authentication_id
01932 = gsasl_client_callback_authentication_id_get (sctx->ctx);
01933 if (!cb_authentication_id)
01934 break;
01935 res = cb_authentication_id (sctx, buf, &buflen);
01936 if (res != GSASL_OK)
01937 break;
01938 buf[buflen] = '\0';
01939 gsasl_property_set (sctx, prop, buf);
01940 break;
01941 }
01942
01943 case GSASL_AUTHZID:
01944 {
01945 Gsasl_client_callback_authorization_id cb_authorization_id
01946 = gsasl_client_callback_authorization_id_get (sctx->ctx);
01947 if (!cb_authorization_id)
01948 break;
01949 res = cb_authorization_id (sctx, buf, &buflen);
01950 if (res != GSASL_OK)
01951 break;
01952 buf[buflen] = '\0';
01953 gsasl_property_set (sctx, prop, buf);
01954 break;
01955 }
01956
01957 case GSASL_PASSWORD:
01958 {
01959 Gsasl_client_callback_password cb_password
01960 = gsasl_client_callback_password_get (sctx->ctx);
01961 if (!cb_password)
01962 break;
01963 res = cb_password (sctx, buf, &buflen);
01964 if (res != GSASL_OK)
01965 break;
01966 buf[buflen] = '\0';
01967 gsasl_property_set (sctx, prop, buf);
01968 break;
01969 }
01970
01971 case GSASL_PASSCODE:
01972 {
01973 Gsasl_client_callback_passcode cb_passcode
01974 = gsasl_client_callback_passcode_get (sctx->ctx);
01975 if (!cb_passcode)
01976 break;
01977 res = cb_passcode (sctx, buf, &buflen);
01978 if (res != GSASL_OK)
01979 break;
01980 buf[buflen] = '\0';
01981 gsasl_property_set (sctx, prop, buf);
01982 break;
01983 }
01984
01985 case GSASL_PIN:
01986 {
01987 Gsasl_client_callback_pin cb_pin
01988 = gsasl_client_callback_pin_get (sctx->ctx);
01989 if (!cb_pin)
01990 break;
01991 res = cb_pin (sctx, sctx->suggestedpin, buf, &buflen);
01992 if (res != GSASL_OK)
01993 break;
01994 buf[buflen] = '\0';
01995 gsasl_property_set (sctx, prop, buf);
01996 break;
01997 }
01998
01999 case GSASL_REALM:
02000 {
02001 Gsasl_client_callback_realm cb_realm
02002 = gsasl_client_callback_realm_get (sctx->ctx);
02003 if (!cb_realm)
02004 break;
02005 res = cb_realm (sctx, buf, &buflen);
02006 if (res != GSASL_OK)
02007 break;
02008 buf[buflen] = '\0';
02009 gsasl_property_set (sctx, prop, buf);
02010 break;
02011 }
02012
02013 #if USE_DIGEST_MD5
02014 case GSASL_QOP:
02015 {
02016 Gsasl_client_callback_qop cb_qop
02017 = gsasl_client_callback_qop_get (sctx->ctx);
02018 int serverqops;
02019 Gsasl_qop qop;
02020 if (!cb_qop)
02021 break;
02022 serverqops = digest_md5_qopstr2qops (sctx->qops);
02023 if (serverqops == -1)
02024 return NULL;
02025 qop = cb_qop (sctx, serverqops);
02026 if (qop & 0x07)
02027 gsasl_property_set (sctx, prop, digest_md5_qops2qopstr (qop));
02028 break;
02029 }
02030 break;
02031 #endif
02032
02033 default:
02034 break;
02035 }
02036
02037 return gsasl_property_fast (sctx, prop);
02038 }
02039
02040 const char *
02041 _gsasl_obsolete_property_map (Gsasl_session * sctx, Gsasl_property prop)
02042 {
02043 const char *ret;
02044 char *buf;
02045
02046 buf = malloc (BUFSIZ);
02047 if (!buf)
02048 return NULL;
02049
02050 ret = pmap (sctx, prop, buf, BUFSIZ - 1);
02051
02052 free (buf);
02053
02054 return ret;
02055 }
02056
02057 int
02058 _gsasl_obsolete_callback (Gsasl * ctx, Gsasl_session * sctx,
02059 Gsasl_property prop)
02060 {
02061 int res;
02062
02063
02064
02065 switch (prop)
02066 {
02067 case GSASL_VALIDATE_ANONYMOUS:
02068 {
02069 Gsasl_server_callback_anonymous cb_anonymous;
02070 if (!sctx->anonymous_token)
02071 break;
02072 cb_anonymous = gsasl_server_callback_anonymous_get (sctx->ctx);
02073 if (!cb_anonymous)
02074 break;
02075 res = cb_anonymous (sctx, sctx->anonymous_token);
02076 return res;
02077 break;
02078 }
02079
02080 case GSASL_VALIDATE_EXTERNAL:
02081 {
02082 Gsasl_server_callback_external cb_external
02083 = gsasl_server_callback_external_get (sctx->ctx);
02084 if (!cb_external)
02085 break;
02086 res = cb_external (sctx);
02087 return res;
02088 break;
02089 }
02090
02091 case GSASL_VALIDATE_SECURID:
02092 {
02093 Gsasl_server_callback_securid cb_securid
02094 = gsasl_server_callback_securid_get (sctx->ctx);
02095 #define MAX_SECURID 32
02096 char buf[MAX_SECURID + 1];
02097 size_t buflen = MAX_SECURID;
02098 if (!cb_securid)
02099 break;
02100 res = cb_securid (sctx, sctx->authid, sctx->authzid, sctx->passcode,
02101 sctx->pin, buf, &buflen);
02102 if (buflen > 0 && buflen < MAX_SECURID)
02103 {
02104 buf[buflen] = '\0';
02105 gsasl_property_set (sctx, GSASL_SUGGESTED_PIN, buf);
02106 }
02107 return res;
02108 break;
02109 }
02110
02111 case GSASL_VALIDATE_GSSAPI:
02112 {
02113 Gsasl_server_callback_gssapi cb_gssapi
02114 = gsasl_server_callback_gssapi_get (sctx->ctx);
02115 if (!cb_gssapi)
02116 break;
02117 res = cb_gssapi (sctx, sctx->gssapi_display_name, sctx->authzid);
02118 return res;
02119 break;
02120 }
02121
02122 case GSASL_VALIDATE_SIMPLE:
02123 {
02124 Gsasl_server_callback_validate cb_validate
02125 = gsasl_server_callback_validate_get (sctx->ctx);
02126 if (!cb_validate)
02127 break;
02128 res = cb_validate (sctx, sctx->authzid, sctx->authid, sctx->password);
02129 return res;
02130 break;
02131 }
02132
02133 case GSASL_PASSWORD:
02134 {
02135 Gsasl_server_callback_retrieve cb_retrieve
02136 = gsasl_server_callback_retrieve_get (sctx->ctx);
02137 char *buf;
02138 size_t buflen = BUFSIZ - 1;
02139 if (!cb_retrieve)
02140 break;
02141 buf = malloc (BUFSIZ);
02142 if (!buf)
02143 return GSASL_MALLOC_ERROR;
02144 res = cb_retrieve (sctx, sctx->authid, sctx->authzid,
02145 sctx->hostname, buf, &buflen);
02146 if (res == GSASL_OK)
02147 gsasl_property_set_raw (sctx, GSASL_PASSWORD, buf, buflen);
02148
02149 free (buf);
02150 return res;
02151 break;
02152 }
02153
02154 #if USE_DIGEST_MD5
02155 case GSASL_QOPS:
02156 {
02157 Gsasl_server_callback_qop cb_qop
02158 = gsasl_server_callback_qop_get (sctx->ctx);
02159 Gsasl_qop qops;
02160 if (!cb_qop)
02161 break;
02162 qops = cb_qop (sctx);
02163 if (qops & 0x07)
02164 gsasl_property_set (sctx, GSASL_QOPS, digest_md5_qops2qopstr(qops));
02165 return GSASL_OK;
02166 break;
02167 }
02168 #endif
02169
02170 default:
02171 break;
02172 }
02173
02174 return GSASL_NO_CALLBACK;
02175 }