authneg.c
上传用户:zm130024
上传日期:2007-01-04
资源大小:432k
文件大小:4k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1997, 1998, 1999
  3.  *      Inferno Nettverk A/S, Norway.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. The above copyright notice, this list of conditions and the following
  9.  *    disclaimer must appear in all copies of the software, derivative works
  10.  *    or modified versions, and any portions thereof, aswell as in all
  11.  *    supporting documentation.
  12.  * 2. All advertising materials mentioning features or use of this software
  13.  *    must display the following acknowledgement:
  14.  *      This product includes software developed by
  15.  *      Inferno Nettverk A/S, Norway.
  16.  * 3. The name of the author may not be used to endorse or promote products
  17.  *    derived from this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  20.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  21.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  22.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  23.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  24.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  28.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29.  *
  30.  * Inferno Nettverk A/S requests users of this software to return to
  31.  *
  32.  *  Software Distribution Coordinator  or  sdc@inet.no
  33.  *  Inferno Nettverk A/S
  34.  *  Oslo Research Park
  35.  *  Gaustadal閑n 21
  36.  *  N-0349 Oslo
  37.  *  Norway
  38.  *
  39.  * any improvements or extensions that they make and grant Inferno Nettverk A/S
  40.  * the rights to redistribute these changes.
  41.  *
  42.  */
  43. #include "common.h"
  44. static const char rcsid[] =
  45. "$Id: authneg.c,v 1.45 1999/07/10 13:52:28 karls Exp $";
  46. int
  47. negotiate_method(s, packet)
  48. int s;
  49. struct socks_t *packet;
  50. {
  51. const char *function = "negotiate_method()";
  52. int rc;
  53. char request[ 1 /* version */
  54. + 1 /* number of methods. */
  55. + AUTHMETHOD_MAX /* the methods. */
  56. ];
  57. const size_t requestlen = 1 /* version. */
  58. + 1 /* nmethods. */
  59. + packet->gw.state.methodc; /* methods. */
  60. unsigned char response[ 1 /* version. */
  61.  + 1 /* selected method. */
  62.  ];
  63. SASSERTX(packet->gw.state.methodc > 0);
  64. /* create request packet. */
  65. request[AUTH_VERSION] = packet->req.version;
  66. request[AUTH_NMETHODS] = packet->gw.state.methodc;
  67. for (rc = 0; rc < packet->gw.state.methodc; ++rc)
  68. request[AUTH_METHODS + rc] = (char)packet->gw.state.methodv[rc];
  69. /* send list over methods we support */
  70. if (writen(s, request, requestlen) != (ssize_t)requestlen)
  71. return -1;
  72. /* read servers response for method it wants to use */
  73. if (readn(s, response, sizeof(response)) != sizeof(response))
  74. return -1;
  75. if (request[AUTH_VERSION] != response[AUTH_VERSION]) {
  76. swarnx("%s: got replyversion %d, expected %d",
  77.       function, response[AUTH_VERSION], request[AUTH_VERSION]);
  78. errno = ECONNREFUSED;
  79. return -1;
  80. }
  81. packet->version = request[AUTH_VERSION];
  82. packet->auth.method = response[AUTH_METHOD];
  83. switch (packet->auth.method) {
  84. case AUTHMETHOD_NONE:
  85. rc = 0;
  86. break;
  87. case AUTHMETHOD_UNAME:
  88. if (clientmethod_uname(s, &packet->gw.host, packet->req.version)
  89. == 0)
  90. rc = 0;
  91. else
  92. rc = -1;
  93. break;
  94. case AUTHMETHOD_NOACCEPT:
  95. swarnx("%s: server accepted no authentication method", function);
  96. rc = -1;
  97. break;
  98. default:
  99. swarnx("%s: server selected method not offered: %d",
  100. function, response[AUTH_METHOD]);
  101. rc = -1;
  102. }
  103. if (rc == 0) {
  104. slog(LOG_DEBUG,
  105. "%s: established socks v%d connection using authentication method %d",
  106. function, packet->version, packet->auth.method);
  107. }
  108. else
  109. errno = ECONNREFUSED;
  110. return rc;
  111. }