svc_auth.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. * svc_auth.c, Server-side rpc authenticator interface.
  3. *
  4. * Copyright (c) 2010, Oracle America, Inc.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions are
  8. * met:
  9. *
  10. * * Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * * Redistributions in binary form must reproduce the above
  13. * copyright notice, this list of conditions and the following
  14. * disclaimer in the documentation and/or other materials
  15. * provided with the distribution.
  16. * * Neither the name of the "Oracle America, Inc." nor the names of its
  17. * contributors may be used to endorse or promote products derived
  18. * from this software without specific prior written permission.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  23. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  24. * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
  25. * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
  27. * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  28. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  29. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  30. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  31. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  32. */
  33. #include <rpc/rpc.h>
  34. #include <rpc/svc.h>
  35. #include <rpc/svc_auth.h>
  36. #include <shlib-compat.h>
  37. /*
  38. * svcauthsw is the bdevsw of server side authentication.
  39. *
  40. * Server side authenticators are called from authenticate by
  41. * using the client auth struct flavor field to index into svcauthsw.
  42. * The server auth flavors must implement a routine that looks
  43. * like:
  44. *
  45. * enum auth_stat
  46. * flavorx_auth(rqst, msg)
  47. * register struct svc_req *rqst;
  48. * register struct rpc_msg *msg;
  49. *
  50. */
  51. static enum auth_stat _svcauth_null (struct svc_req *, struct rpc_msg *);
  52. /* no authentication */
  53. extern enum auth_stat _svcauth_unix (struct svc_req *, struct rpc_msg *);
  54. /* unix style (uid, gids) */
  55. extern enum auth_stat _svcauth_short (struct svc_req *, struct rpc_msg *);
  56. /* short hand unix style */
  57. extern enum auth_stat _svcauth_des (struct svc_req *, struct rpc_msg *);
  58. /* des style */
  59. static const struct
  60. {
  61. enum auth_stat (*authenticator) (struct svc_req *, struct rpc_msg *);
  62. }
  63. svcauthsw[] =
  64. {
  65. { _svcauth_null }, /* AUTH_NULL */
  66. { _svcauth_unix }, /* AUTH_UNIX */
  67. { _svcauth_short }, /* AUTH_SHORT */
  68. { _svcauth_des } /* AUTH_DES */
  69. };
  70. #define AUTH_MAX 3 /* HIGHEST AUTH NUMBER */
  71. /*
  72. * The call rpc message, msg has been obtained from the wire. The msg contains
  73. * the raw form of credentials and verifiers. authenticate returns AUTH_OK
  74. * if the msg is successfully authenticated. If AUTH_OK then the routine also
  75. * does the following things:
  76. * set rqst->rq_xprt->verf to the appropriate response verifier;
  77. * sets rqst->rq_client_cred to the "cooked" form of the credentials.
  78. *
  79. * NB: rqst->rq_cxprt->verf must be pre-allocated;
  80. * its length is set appropriately.
  81. *
  82. * The caller still owns and is responsible for msg->u.cmb.cred and
  83. * msg->u.cmb.verf. The authentication system retains ownership of
  84. * rqst->rq_client_cred, the cooked credentials.
  85. *
  86. * There is an assumption that any flavour less than AUTH_NULL is
  87. * invalid.
  88. */
  89. enum auth_stat
  90. _authenticate (register struct svc_req *rqst, struct rpc_msg *msg)
  91. {
  92. register int cred_flavor;
  93. rqst->rq_cred = msg->rm_call.cb_cred;
  94. rqst->rq_xprt->xp_verf.oa_flavor = _null_auth.oa_flavor;
  95. rqst->rq_xprt->xp_verf.oa_length = 0;
  96. cred_flavor = rqst->rq_cred.oa_flavor;
  97. if ((cred_flavor <= AUTH_MAX) && (cred_flavor >= AUTH_NULL))
  98. return (*(svcauthsw[cred_flavor].authenticator)) (rqst, msg);
  99. return AUTH_REJECTEDCRED;
  100. }
  101. libc_hidden_nolink_sunrpc (_authenticate, GLIBC_2_1)
  102. static enum auth_stat
  103. _svcauth_null (struct svc_req *rqst, struct rpc_msg *msg)
  104. {
  105. return AUTH_OK;
  106. }