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

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

Python code on the server will now receive the private string from the
client. This is the basic requirement for doing bbftp authentication
within python.

Slightly higher level message passing functions ndg_message_send/recv are now
bound to python callbacks bbftpd.send and bbftpd.recv.

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;
132  char default_privatestr[] = "none";
133  int len;
134
135  /* Send version verification message.  */
136  if (ndg_message_send(NDG_HANDSHAKE, strlen(NDG_HANDSHAKE) + 1, logmessage) == -1) {
137    return -1;
138  }
139 
140  /* Receive response */
141  if (ndg_message_recv(&msg, &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  free(msg);
149
150  /* Send the privatestr */
151  // If there is no private string, send default
152  if (privatestr == NULL) {
153    privatestr = default_privatestr;
154  }
155
156  if (ndg_message_send(privatestr, strlen(privatestr) + 1, logmessage) == -1) {
157    return -1;
158  }
159
160  return  0 ;
161}
162
163/*
164 * Higher level message transfer functions.
165 *
166 */
167
168/**
169 * Send a message, declaring it's length to the client.
170 *
171 * @param buffer a pointer to the message buffer
172 * @param length the number of bytes to send
173 * @param[out] loggmessage is filled with the error message on error
174 * @return 0 if OK, -1 if error
175 */
176static int ndg_message_send(char *buffer, int length, char *logmessage) {
177  char ctrl[NDG_MESSAGE_LEN];
178
179  sprintf(ctrl, "NDG-msg: %i", length);
180  if (bbftp_private_send(ctrl, NDG_MESSAGE_LEN, logmessage) == -1) {
181    return -1;
182  }
183
184  if (bbftp_private_send(buffer, length, logmessage) == -1) {
185    return -1;
186  }
187
188  return 0;
189}
190
191/**
192 * Receive a message of variable length
193 *
194 * @param[out] buffer is set to newly allocated message buffer
195 * @param[out] length is set to the length of the message
196 * @param[out] logmessage is filled with the logmessage on error
197 * @return 0 if OK, -1 if error
198 */
199static int ndg_message_recv(char **buffer, int *length, char *logmessage) {
200  char ctrl[NDG_MESSAGE_LEN];
201
202  if (bbftp_private_recv(ctrl, NDG_MESSAGE_LEN, logmessage) == -1) {
203    return -1;
204  }
205  if (sscanf(ctrl, "NDG-msg: %i", length) != 1) {
206    sprintf(logmessage, "ndg_message_recv ctrl error: %40s", ctrl);
207    return -1;
208  }
209
210  if ((*buffer = (char *)malloc(*length * sizeof(char))) == NULL) {
211    sprintf(logmessage, "ngd_message_recv malloc error");
212    return -1;
213  }
214
215  if (bbftp_private_recv(*buffer, *length, logmessage) == -1) {
216    free(*buffer); *buffer = NULL;
217    return -1;
218  }
219
220  return 0;
221}
222 
Note: See TracBrowser for help on using the repository browser.