source: TI05-delivery/trunk/src/bbftp-client-3.2.0/bbftpc/bbftp_private_user.c @ 1078

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI05-delivery/trunk/src/bbftp-client-3.2.0/bbftpc/bbftp_private_user.c@1078
Revision 1078, 9.4 KB checked in by spascoe, 14 years ago (diff)

Implemented higher level auth message passing (the receiver doesn't
need to know the message length). The client will use this mechanism to
send the private string. This is working with stand alone bbftp client/server.

Embedded bbftpd is broken until I make corresponding
changes to the python API.

Line 
1/*
2 * bbftpc/bbftp_private_user.c
3 * Copyright (C) 1999, 2000, 2001, 2002 IN2P3, CNRS
4 * bbftp@in2p3.fr
5 * http://doc.in2p3.fr/bbftp
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20 */ 
21
22/****************************************************************************
23
24 
25 
26 bbftp_private_user.c   v 2.1.0 2001/05/21  - Routines creation
27
28*****************************************************************************/
29#include <stdio.h>
30
31#include <bbftp_private_user.h>
32#include <client.h>
33
34/*
35** username contain a pointer to the string given with the -u flag
36*/
37extern char *username ;
38/*
39** privatestr contain a pointer to the string given with the -P flag
40*/
41extern char *privatestr ;
42
43extern int debug;
44
45/* From bbftp_util.c */
46void printmessage(FILE *strm , int flag, int errcode, int tok, char *fmt, ...);
47
48
49/* prototypes */
50static int ndg_message_recv(char **buffer, int *length, char *logmessage);
51static int ndg_message_send(char *buffer, int length, char *logmessage);
52
53/*******************************************************************************
54** bbftp_private_getargs :                                                     *
55**                                                                             *
56**      Routine to get arguments for private authentication. This routine is   *
57**      called after several tests have been made. The variable to be set are  *
58**      to be define in bbftp_private_user.h to be used by other routines.     *
59**                                                                             *
60**      OUPUT variable :                                                       *
61**          logmessage :  to write the error message in case of error          *
62**                                                                             *
63**      GLOBAL VARIABLE USED :                                                 *
64**                                                                             *
65**                                                                             *
66**      RETURN:                                                                *
67**          -1  Unrecoverable error                                            *
68**           0  OK                                                             *
69**                                                                             *
70*******************************************************************************/
71
72int bbftp_private_getargs(char *logmessage)
73{
74    return 0 ;
75}
76
77/*******************************************************************************
78** bbftp_private_auth :                                                        *
79**                                                                             *
80**      Routine to do the private authentication. This routine just have to    *
81**      send or to receive private data to the bbftpd daemon. For that it will *
82**      use the two routines :                                                 *
83**          bbftp_private_send                                                 *
84**          bbftp_private_recv                                                 *
85**      The reception of the OK or BAD message will be done by the calling     *
86**      routine, so if this routine has no check to do (for example just       *
87**      sending username and password) it will just call bbftp_private_send    *
88**      twice and let the calling program check if it is OK or BAD.            *
89**                                                                             *
90**      The bbftp_private_send routine has to be called with the following     *
91**      parameters:                                                            *
92**                                                                             *
93**      int bbftp_private_send(char *buffertosend,int buffertosendlength,      *
94**                             char *logmessage)                               *
95**          char    *buffertosend = string to be send to the daemon            *
96**          int     buffertosendlength = length of the string                  *
97**          char    *logmessage                                                *
98**                                                                             *
99**      and return 0 in case of success, -1 in case of error with logmessage   *
100**      filled                                                                 *
101**                                                                             *
102**      The bbftp_private_recv routine has to be called with the following     *
103**      parameters:                                                            *
104**                                                                             *
105**      int bbftp_private_recv(char *buffertorecv,int lengthtoreceive,         *
106**                             char *logmessage)                               *
107**          char    *buffertorecv = buffer to put data received from the       *
108**                                  daemon                                     *
109**          int     lengthtorecv = length of the buffer                        *
110**          char    *logmessage                                                *
111**                                                                             *
112**      and return number of byte received in case of success, -1 in case of   *
113**      error with logmessage filled                                           *
114**      It is the duty of the programmer to be sure that the buffer is large   *
115**      enought                                                                *
116**                                                                             *
117**                                                                             *
118**      OUPUT variable :                                                       *
119**          logmessage :  to write the error message in case of error          *
120**                                                                             *
121**      GLOBAL VARIABLE USED :                                                 *
122**                                                                             *
123**      RETURN:                                                                *
124**          -1  Unrecoverable error                                            *
125**           0  OK                                                             *
126**                                                                             *
127*******************************************************************************/
128
129int bbftp_private_auth(char *logmessage) 
130{
131  char msg[NDG_MESSAGE_LEN];
132  char default_privatestr[] = "none";
133 
134  /* Send version verification message.  */
135  sprintf(msg, "%.*s", NDG_MESSAGE_LEN - 1, NDG_HANDSHAKE);
136  if (bbftp_private_send(msg, NDG_MESSAGE_LEN, logmessage) == -1) {
137    return -1;
138  }
139
140  /* Receive response */
141  if (bbftp_private_recv(msg, NDG_MESSAGE_LEN, logmessage) == -1) {
142    return -1;
143  }
144
145  if (debug) {
146    printmessage(stdout,CASE_NORMAL,0,0,"Received Auth handshake: %s\n", msg) ;
147  }
148
149  /* Send the privatestr */
150  // If there is no private string, send default
151  if (privatestr == NULL) {
152    privatestr = default_privatestr;
153  }
154
155  if (ndg_message_send(privatestr, strlen(privatestr) + 1, logmessage) == -1) {
156    return -1;
157  }
158
159  return  0 ;
160}
161
162/*
163 * Higher level message transfer functions.
164 *
165 */
166
167/**
168 * Send a message, declaring it's length to the client.
169 *
170 * @param buffer a pointer to the message buffer
171 * @param length the number of bytes to send
172 * @param[out] loggmessage is filled with the error message on error
173 * @return 0 if OK, -1 if error
174 */
175static int ndg_message_send(char *buffer, int length, char *logmessage) {
176  char ctrl[NDG_MESSAGE_LEN];
177
178  sprintf(ctrl, "NDG-msg: %i", length);
179  if (bbftp_private_send(ctrl, NDG_MESSAGE_LEN, logmessage) == -1) {
180    return -1;
181  }
182
183  if (bbftp_private_send(buffer, length, logmessage) == -1) {
184    return -1;
185  }
186
187  return 0;
188}
189
190/**
191 * Receive a message of variable length
192 *
193 * @param[out] buffer is set to newly allocated message buffer
194 * @param[out] length is set to the length of the message
195 * @param[out] logmessage is filled with the logmessage on error
196 * @return 0 if OK, -1 if error
197 */
198static int ndg_message_recv(char **buffer, int *length, char *logmessage) {
199  char ctrl[NDG_MESSAGE_LEN];
200
201  if (bbftp_private_recv(ctrl, NDG_MESSAGE_LEN, logmessage) == -1) {
202    return -1;
203  }
204  if (sscanf(ctrl, "NDG-msg: %i", length) != 1) {
205    sprintf(logmessage, "ndg_message_recv ctrl error: %40s", ctrl);
206    return -1;
207  }
208
209  if ((*buffer = (char *)malloc(*length * sizeof(char))) == NULL) {
210    sprintf(logmessage, "ngd_message_recv malloc error");
211    return -1;
212  }
213
214  if (bbftp_private_recv(buffer, *length, logmessage) == -1) {
215    free(*buffer); *buffer = NULL;
216    return -1;
217  }
218
219  return 0;
220}
221 
Note: See TracBrowser for help on using the repository browser.