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

代理服务器

开发平台:

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: method_uname.c,v 1.30 1999/12/22 09:29:25 karls Exp $";
  46. __BEGIN_DECLS
  47. static int
  48. recv_unamever __P((int s, struct request_t *request,
  49.  struct negotiate_state_t *state));
  50. static int
  51. recv_ulen __P((int s, struct request_t *request,
  52. struct negotiate_state_t *state));
  53. static int
  54. recv_uname __P((int s, struct request_t *request,
  55.  struct negotiate_state_t *state));
  56. static int
  57. recv_plen __P((int s, struct request_t *request,
  58. struct negotiate_state_t *state));
  59. static int
  60. recv_passwd __P((int s, struct request_t *request,
  61.   struct negotiate_state_t *state));
  62. __END_DECLS
  63. int
  64. method_uname(s, request, state)
  65. int s;
  66. struct request_t *request;
  67. struct negotiate_state_t *state;
  68. {
  69. state->rcurrent = recv_unamever;
  70. return state->rcurrent(s, request, state);
  71. }
  72. static int
  73. recv_unamever(s, request, state)
  74. int s;
  75. struct request_t *request;
  76. struct negotiate_state_t *state;
  77. {
  78. INIT(sizeof(request->auth->mdata.uname.version));
  79. CHECK(&request->auth->mdata.uname.version, NULL);
  80. switch (request->auth->mdata.uname.version) {
  81. case SOCKS_UNAMEVERSION:
  82. break;
  83. default:
  84. slog(LOG_DEBUG, "unknown version on uname packet from client: %d",
  85. request->auth->mdata.uname.version);
  86. return -1;
  87. }
  88. state->rcurrent = recv_ulen;
  89. return state->rcurrent(s, request, state);
  90. }
  91. static int
  92. recv_ulen(s, request, state)
  93. int s;
  94. struct request_t *request;
  95. struct negotiate_state_t *state;
  96. {
  97. INIT(sizeof(*request->auth->mdata.uname.name));
  98. CHECK(request->auth->mdata.uname.name, NULL);
  99. OCTETIFY(*request->auth->mdata.uname.name);
  100. state->rcurrent = recv_uname;
  101. return state->rcurrent(s, request, state);
  102. }
  103. static int
  104. recv_uname(s, request, state)
  105. int s;
  106. struct request_t *request;
  107. struct negotiate_state_t *state;
  108. {
  109. const size_t ulen = (size_t)*request->auth->mdata.uname.name;
  110. INIT(ulen);
  111. CHECK(request->auth->mdata.uname.name + 1, NULL);
  112. /* convert to string. */
  113. memcpy(request->auth->mdata.uname.name, request->auth->mdata.uname.name + 1,
  114. ulen);
  115. request->auth->mdata.uname.name[ulen] = NUL;
  116. state->rcurrent = recv_plen;
  117. return state->rcurrent(s, request, state);
  118. }
  119. static int
  120. recv_plen(s, request, state)
  121. int s;
  122. struct request_t *request;
  123. struct negotiate_state_t *state;
  124. {
  125. INIT(sizeof(*request->auth->mdata.uname.password));
  126. CHECK(request->auth->mdata.uname.password, NULL);
  127. OCTETIFY(*request->auth->mdata.uname.password);
  128. state->rcurrent = recv_passwd;
  129. return state->rcurrent(s, request, state);
  130. }
  131. static int
  132. recv_passwd(s, request, state)
  133. int s;
  134. struct request_t *request;
  135. struct negotiate_state_t *state;
  136. {
  137. /* const char *function = "recv_passwd()"; */
  138. const size_t plen = (size_t)*request->auth->mdata.uname.password;
  139. int status;
  140. unsigned char response[1 /* version. */
  141. + 1 /* status. */
  142. ];
  143. INIT(plen);
  144. CHECK(request->auth->mdata.uname.password + 1, NULL);
  145. /* convert to string. */
  146. memcpy(request->auth->mdata.uname.password,
  147. request->auth->mdata.uname.password + 1, plen);
  148. request->auth->mdata.uname.password[plen] = NUL;
  149. switch (status
  150. = (unsigned char) passwordcheck(request->auth->mdata.uname.name,
  151. request->auth->mdata.uname.password)) {
  152. case 0:
  153. request->auth->matched = 1;
  154. break; /* ok. */
  155. case 1: {
  156. char *name = request->auth->mdata.uname.name;
  157. snprintf(state->emsg, sizeof(state->emsg),
  158. "denied access to non-existing user "%s"",
  159. strcheck(name = str2vis(name, strlen(name))));
  160. free(name);
  161. break;
  162. }
  163. case 2: {
  164. char *name = request->auth->mdata.uname.name;
  165. snprintf(state->emsg, sizeof(state->emsg),
  166. "password authentication failed for user "%s"",
  167. strcheck(name = str2vis(name, strlen(name))));
  168. free(name);
  169. break;
  170. }
  171. default:
  172. SERRX(status);
  173. }
  174. bzero(request->auth->mdata.uname.password,
  175. sizeof(request->auth->mdata.uname.password));
  176. response[UNAME_VERSION] = request->auth->mdata.uname.version;
  177. response[UNAME_STATUS] = (unsigned char)status;
  178. if (writen(s, response, sizeof(response)) != sizeof(response))
  179. return -1;
  180. if (status == 0) { /* 0 is success. */
  181. state->rcurrent = recv_sockspacket;
  182. return state->rcurrent(s, request, state);
  183. }
  184. errno = 0;
  185. return -1;
  186. }