/crypto/heimdal/lib/gssapi/krb5/inquire_context.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 110 lines · 62 code · 16 blank · 32 comment · 14 complexity · 5fd17f7fc613cfcabade858fc0fc0b32 MD5 · raw file

  1. /*
  2. * Copyright (c) 1997, 2003 Kungliga Tekniska Hรถgskolan
  3. * (Royal Institute of Technology, Stockholm, Sweden).
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. *
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. *
  13. * 2. Redistributions in binary form must reproduce the above copyright
  14. * notice, this list of conditions and the following disclaimer in the
  15. * documentation and/or other materials provided with the distribution.
  16. *
  17. * 3. Neither the name of the Institute nor the names of its contributors
  18. * may be used to endorse or promote products derived from this software
  19. * without specific prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
  22. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
  25. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31. * SUCH DAMAGE.
  32. */
  33. #include "gsskrb5_locl.h"
  34. OM_uint32 GSSAPI_CALLCONV _gsskrb5_inquire_context (
  35. OM_uint32 * minor_status,
  36. const gss_ctx_id_t context_handle,
  37. gss_name_t * src_name,
  38. gss_name_t * targ_name,
  39. OM_uint32 * lifetime_rec,
  40. gss_OID * mech_type,
  41. OM_uint32 * ctx_flags,
  42. int * locally_initiated,
  43. int * open_context
  44. )
  45. {
  46. krb5_context context;
  47. OM_uint32 ret;
  48. gsskrb5_ctx ctx = (gsskrb5_ctx)context_handle;
  49. gss_name_t name;
  50. if (src_name)
  51. *src_name = GSS_C_NO_NAME;
  52. if (targ_name)
  53. *targ_name = GSS_C_NO_NAME;
  54. GSSAPI_KRB5_INIT (&context);
  55. HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex);
  56. if (src_name) {
  57. name = (gss_name_t)ctx->source;
  58. ret = _gsskrb5_duplicate_name (minor_status, name, src_name);
  59. if (ret)
  60. goto failed;
  61. }
  62. if (targ_name) {
  63. name = (gss_name_t)ctx->target;
  64. ret = _gsskrb5_duplicate_name (minor_status, name, targ_name);
  65. if (ret)
  66. goto failed;
  67. }
  68. if (lifetime_rec) {
  69. ret = _gsskrb5_lifetime_left(minor_status,
  70. context,
  71. ctx->lifetime,
  72. lifetime_rec);
  73. if (ret)
  74. goto failed;
  75. }
  76. if (mech_type)
  77. *mech_type = GSS_KRB5_MECHANISM;
  78. if (ctx_flags)
  79. *ctx_flags = ctx->flags;
  80. if (locally_initiated)
  81. *locally_initiated = ctx->more_flags & LOCAL;
  82. if (open_context)
  83. *open_context = ctx->more_flags & OPEN;
  84. *minor_status = 0;
  85. HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex);
  86. return GSS_S_COMPLETE;
  87. failed:
  88. if (src_name)
  89. _gsskrb5_release_name(NULL, src_name);
  90. if (targ_name)
  91. _gsskrb5_release_name(NULL, targ_name);
  92. HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex);
  93. return ret;
  94. }