Files
2026-07-30 11:19:44 +05:30

279 lines
8.3 KiB
C

/*
******************************************************************************
* INTERPEAK EXAMPLE SOURCE FILE
*
* Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipftps_example.c,v $ $Revision: 1.12.10.5 $
* $Source: /home/interpeak/CVSRoot/ipappl/config/ipftps_example.c,v $
* $Author: qsun $
* $State: Exp $ $Locker: $
*
* INTERPEAK_COPYRIGHT_STRING
* Design and implementation by Ulf Olofsson <ulf@interpeak.se>
******************************************************************************
*/
/*
modification history
--------------------
01h,08Oct13,qsn Usage update for WIND00420146
01g,26jul12,h_x Fix WIND00362583
01f,03Aug10,rjq New file for Networking Configuration VSB restructuring.
01e,01dec09,rjq Fix for defect WIND00185613.
01d,02oct07,uol Remove default ftp/interpeak username/password.
01c,03jan07,kch Updated CVS revision log entry for Jan 03 code drop.
01b,28dec06,tkf Remove debug statements.
01a,11dec06,kch Integrated to VxWorks build infrastructure.
*/
/*
****************************************************************************
* 1 DESCRIPTION
****************************************************************************
*/
/*
****************************************************************************
* 2 CONFIGURATION
****************************************************************************
*/
#include "ipftps_config.h"
/*
****************************************************************************
* 3 INCLUDE FILES
****************************************************************************
*/
#ifdef IP_PORT_UNIX
#define IPCOM_USE_CLIB_PROTO
#elif defined(IPCOM_USE_CLIB_PROTO)
#undef IPCOM_USE_CLIB_PROTO
#endif
#include <ipcom.h>
#include <ipcom_config.h>
#include <ipcom_os.h>
#include <ipcom_auth.h>
#include "ipftps.h"
#ifdef IP_PORT_VXWORKS
#include <vxWorks.h>
#include <private/loginLibP.h>
#endif
/*
****************************************************************************
* 4 DEFINES
****************************************************************************
*/
/*
****************************************************************************
* 5 TYPES
****************************************************************************
*/
/* typedef to make compiler happy... */
typedef int (*ipftps_cb)(Ipftps_session *session, char *password);
#if defined(IP_WB_BUILD)
/*
* forward declarations for the user-defined ftp server authentication
* callback hook to satisfy the compiler.
*/
#ifdef FTPS_AUTH_CALLBACK_HOOK
int FTPS_AUTH_CALLBACK_HOOK (Ipftps_session *, char *);
#else
#undef FTPS_AUTH_CALLBACK_HOOK
#define FTPS_AUTH_CALLBACK_HOOK IP_NULL
#endif
#endif
/*
****************************************************************************
* 6 EXTERN PROTOTYPES
****************************************************************************
*/
/*
****************************************************************************
* 7 LOCAL PROTOTYPES
****************************************************************************
*/
int
ipftps_authenticate_default_callback(Ipftps_session *session, char *password);
/*
****************************************************************************
* 8 DATA
****************************************************************************
*/
/*
****************************************************************************
* 9 LOCAL FUNCTIONS
****************************************************************************
*/
/*
****************************************************************************
* 10 PUBLIC FUNCTIONS
****************************************************************************
*/
/*
****************************************************************************
* ipftps_authenticate_default_callback - default ftps callback routine
*
* This is an example implementation of the ftp server authentication
* callback routine. It is called if no ftp server callback routine is
* assigned to the macro FTPS_AUTH_CALLBACK_HOOK.
*
* NOMANUAL
*/
int
ipftps_authenticate_default_callback(Ipftps_session *session, char *password)
{
/*
** This is a simple authentication skeleton,
** please modify to suit your purposes.
*/
#ifdef IP_PORT_VXWORKS
#ifdef IPFTPS_USE_TEST
if(0)
#else
if (systemSecurityIsEnabled == FALSE)
#endif
{
#endif
if (ipcom_strcmp(session->username, "anonymous") == 0)
{
/* IPCOM_LOG1(INFO, "Anonymous login with password %s", password); */
/* Access restrictions apply for anonymous users */
session->readonly = 1;
}
#ifdef IP_PORT_VXWORKS
}
#endif
#ifdef IPFTPS_USE_TEST
else if (ipcom_strcmp(session->username, "ftp") == 0 &&
ipcom_strcmp(password, "interpeak") == 0)
{
/* IPCOM_LOG1(INFO, "Hard-coded 'ftp' login with password %s",
password); */
}
#endif
#if defined(IP_WB_BUILD)
#ifdef INCLUDE_IPCOM_USE_AUTH
else if (ipcom_auth_login(session->username, password,
IP_NULL, IP_NULL, IP_NULL) == IPCOM_SUCCESS)
{
/* IPCOM_LOG1(INFO, "User '%s' login", session->username); */
}
#endif
#else
#ifdef IPCOM_USE_AUTH
else if (ipcom_auth_login(session->username, password,
IP_NULL, IP_NULL, IP_NULL) == IPCOM_SUCCESS)
{
/* IPCOM_LOG1(INFO, "User '%s' login", session->username); */
}
#endif
#endif
else
{
/* IPCOM_LOG2(WARNING, "Login attempt with user: %s, pw: %s",
session->username, password); */
return 1;
}
#if 0
/*
** Set security parameters individually for the session if the
** default values defined as sysvars aren't appropriate:
**
** readonly: Write commands disallowed.
** proxy: Allow that data and control connections
** use different IP addresses.
** lportbase: Use local ports above this value.
** Set to 0 to use port 20.
** pportbase: Refuse to connect to peer ports <= this value.
** Set to 65535 to entirely disable PORT and EPRT commands.
** root: Root directory for the session.
*/
session->readonly = 1; /* Readonly mode */
session->proxy = 0; /* Disable proxy FTP */
session->lportbase = 49151; /* Use local ports from lportbase+1 */
session->pportbase = 1023; /* Reject peer ports <= pportbase */
/* Limit access to the filesystem */
/* Note: using ipcom_strdup is necessary here, internally session->root
* points to a buffer that can only hold default/configured content.
*/
ipftps_free(session->root);
if ((session->root = ipcom_strdup("/pub")) == IP_NULL)
{
IPCOM_LOG(ERR, "Out of memory") IPCOM_END;
return 1;
}
/* Note: session->cwd points to an internally allocated buffer which you can use directly */
ipcom_strcpy(session->cwd, "/pub");
#endif
/* IPCOM_LOG1(INFO, "User %s logged in", session->username); */
return 0;
}
/*****************************************************************************
*
* ipftps_authenticate - ftp server authentication callback routine
*
* The FTP sessions may be configured individually by setting session options.
* This is done after the authentication is complete, and enables clients to
* be given permissions according to general policies, local databases or
* even a RADIUS request to a remote host. The options are normally set in
* the ipftps_authenticate() routine and are accessed through the session
* pointer.
*
* .IP <session>
* Session descriptor.
* .IP <password>
* Password.
*
* RETURNS:
* 0 for successful authentication, 1 otherwise.
*
* NOMANUAL
*/
IP_PUBLIC int
ipftps_authenticate(Ipftps_session *session, char *password)
{
ipftps_cb ftps_cb;
/*eliminate warning when compiling with gnu*/
#if defined(IP_WB_BUILD) && defined(FTPS_AUTH_CALLBACK_HOOK)
ftps_cb = FTPS_AUTH_CALLBACK_HOOK;
#else
ftps_cb = ipftps_authenticate_default_callback;
#endif
return ftps_cb(session, password);
}
/*
****************************************************************************
* END OF FILE
****************************************************************************
*/