ibm-information-center/dist/eclipse/plugins/i5OS.ic.rzaiq_5.4.0.1/rzaiqexamplogonc.htm

627 lines
37 KiB
HTML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en-us" xml:lang="en-us">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="security" content="public" />
<meta name="Robots" content="index,follow" />
<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
<meta name="DC.Type" content="reference" />
<meta name="DC.Title" content="Example: FTP server logon exit program in C code" />
<meta name="abstract" content="This is an example of a simple File Transfer Protocol (FTP) Server Logon exit program. It is written in C programming language." />
<meta name="description" content="This is an example of a simple File Transfer Protocol (FTP) Server Logon exit program. It is written in C programming language." />
<meta name="DC.Relation" scheme="URI" content="rzaiqlepi.htm" />
<meta name="copyright" content="(C) Copyright IBM Corporation 2004, 2006" />
<meta name="DC.Rights.Owner" content="(C) Copyright IBM Corporation 2004, 2006" />
<meta name="DC.Format" content="XHTML" />
<meta name="DC.Identifier" content="rzaiqexamplogonc" />
<meta name="DC.Language" content="en-us" />
<!-- All rights reserved. Licensed Materials Property of IBM -->
<!-- US Government Users Restricted Rights -->
<!-- Use, duplication or disclosure restricted by -->
<!-- GSA ADP Schedule Contract with IBM Corp. -->
<link rel="stylesheet" type="text/css" href="./ibmdita.css" />
<link rel="stylesheet" type="text/css" href="./ic.css" />
<title>Example: FTP server logon exit program in C code</title>
</head>
<body id="rzaiqexamplogonc"><a name="rzaiqexamplogonc"><!-- --></a>
<!-- Java sync-link --><script language="Javascript" src="../rzahg/synch.js" type="text/javascript"></script>
<h1 class="topictitle1">Example: FTP server logon exit program in C code</h1>
<div><p>This is an example of a simple File Transfer Protocol (FTP) Server
Logon exit program. It is written in C programming language.</p>
<div class="section"><p>This code is not complete, but provides a starting point to help
you create your own program.</p>
<div class="note"><span class="notetitle">Note:</span> By using the code examples, you agree
to the terms of the <a href="codedisclaimer.htm">Code license and disclaimer information</a>.</div>
<p>(Pre
formatted text in the following example will flow outside the frame.)</p>
<pre class="screen"> /* Module Description *************************************************/
/* */
/**********************************************************************/
/* */
/* Note: This program is a sample only and has NOT undergone any */
/ formal review or testing. */
/* */
/**********************************************************************/
/* */
/* Source File Name: qtmfsvrlgn.c */
/* */
/* Module Name: FTP Server Logon exit program. */
/* */
/* Service Program Name: n/a */
/* */
/* Source File Description: */
/* This example exit program provides additional control over the */
/* process of authenticating a user to a TCP/IP application server.*/
/* When installed, this example exit program would be called each */
/* time a user attempts to log on to the server. */
/* */
/**********************************************************************/
/* */
/* Function List: main - FTP Server Logon exit program main. */
/* qtmfsvrlgn - FTP Server Logon exit function. */
/* CheckClientAddress - Check originating sessions IP */
/* address. */
/* */
/* End Module Description *********************************************/
#define _QTMFSVRLGN_C
/**********************************************************************/
/* All file scoped includes go here */
/**********************************************************************/
#ifndef __stdio_h
#include &lt;stdio.h&gt;
#endif
#ifndef __ctype_h
#include &lt;ctype.h&gt;
#endif
#ifndef __string_h
#include &lt;string.h&gt;
#endif
#ifndef __stdlib_h
#include &lt;stdlib.h&gt;
#endif
#include "qusec.h" /* Include for API error code structure */
#include "qsyrusri.h" /* Include for User Information API */
/**********************************************************************/
/* All file scoped Constants go here */
/**********************************************************************/
#define EQ ==
#define NEQ !=
#define BLANK ' '
#define FWIDTH 128 /* Width of one database file record */
#define FNAME 21 /* Qualified database file name width */
/* Valid characters for Client IP address. The CheckClientAddress() */
/* function will check the Client IP address input argument */
/* (ClientIPaddr_p) to ensure it is in valid dotted-decimal format. */
/* This is one example of an input validity check. */
const char ValidChars[] = "0123456789.";
/**********************************************************************/
/* All file scoped type declarations go here */
/**********************************************************************/
/**********************************************************************/
/* All file-scoped macro calls go here */
/**********************************************************************/
/**********************************************************************/
/* All internal function prototypes go here */
/**********************************************************************/
static void qtmfsvrlgn
(int,char *,int,char *,int,char *,int,int *,char *,char *,char *);
static int CheckClientAddress(char *, int);
/**********************************************************************/
/* All file scoped variable declarations go here */
/**********************************************************************/
/**********************************************************************/
/* ** NOTE ** */
/* The following client IP address are for example purposes only. Any */
/* resemblance to actual system IP addresses is purely coincidental. */
/**********************************************************************/
/* EXCLUSIVE system lists, ie - Logon attempts from any client IP */
/* addresses NOT in one of these lists */
/* are allowed to continue. */
/* Reject server logon attempts of users attempting to log in from */
/* these client systems (return code = 0) */
char Reject[] = "1.2.3.4 5.6.7.8";
/* Limit logon abilities of users attempting to log in as ANONYMOUS */
/* from these client systems (return code = 6). */
/* In this example program, the initial current library is set and */
/* returned as an output parameter for users attempting to log in */
/* as ANONYMOUS from these specific client systems. */
char Limit[] = "9.8.7.6 4.3.2.1 8.7.6.5";
/* Function Specification *********************************************/
/* */
/* Function Name: Main */
/* */
/* Descriptive Name: FTP Server Logon exit program main. */
/* */
/* This example exit program allows access to a TCP/IP server to */
/* be controlled by the address of the originating session, gives */
/* additional control over the initial current library to a user, */
/* and provides the capability to implement "anonymous" FTP. */
/* */
/* Notes: */
/* */
/* Dependencies: */
/* FTP Server Logon exit point QIBM_QTMF_SVR_LOGON was registered */
/* during FTP product installation. */
/* */
/* Restrictions: */
/* */
/* None */
/* */
/* Messages: */
/* */
/* None */
/* */
/* Side Effects: */
/* */
/* None */
/* */
/* Functions/Macros called: */
/* */
/* qtmfsvrlgn - Server Logon exit function. */
/* */
/* Input: */
/* int * argv[1] - Identifies requesting application */
/* (FTP Client =0, FTP Server = 1). */
/* char * argv[2] - User identifier from client program. */
/* (For FTP server, this is user CMD data */
/* int * argv[3] - Length (in bytes) of User ID string. */
/* char * argv[4] - Authentication string from client. */
/* (For FTP server, this is the password) */
/* int * argv[5] - Length (bytes) Authentication string. */
/* char * argv[6] - Internet Protocol address from which */
/* the session originates. */
/* int * argv[7] - Length (in bytes) of IP address. */
/* int * argv[8] - Return code (received as 0). */
/* char * argv[9] - User profile (received as blanks). */
/* char * argv[10] - Password (received as blanks). */
/* char * argv[11] - Initial current library (received as blanks)*/
/* */
/* Exit Normal: Return Return Code, User Profile, Password, Initial */
/* Current Library to server application. */
/* */
/* Exit Error: None */
/* */
/* End Function Specification *****************************************/
void main(int argc, char *argv[])
{
/********************************************************************/
/* Code */
/********************************************************************/
/********************************************************************/
/* Collect input arguments and call function to determine if client */
/* should be allowed to log in to an FTP server application. */
/********************************************************************/
qtmfsvrlgn(*((int *)(argv[1])), /* Application Identifier
(Input) */
argv[2], /* User Identifier (Input) */
*((int *)(argv[3])), /* Length User of
Identifier(Input) */
argv[4], /* Authentication String (Input) */
*((int *)(argv[5])), /* Length of Authentication string */
(Input) */
argv[6], /* Client IP Address (Input) */
*((int *)(argv[7])), /* Length of Client IP Address */
(Input) */
(int *)(argv[8]), /* Return Code (Output)*/
argv[9], /* User Profile (Output)*/
argv[10], /* Password (Output)*/
argv[11]); /* Initial Current Library (Output)*/
return;
}
/* Function Specification *********************************************/
/* */
/* Function Name: qtmfsvrlgn */
/* */
/* Descriptive Name: Server Logon exit function. */
/* */
/* This exit function provides control over user authentication to */
/* an FTP server. */
/* */
/* Notes: */
/* */
/* Dependencies: */
/* */
/* FTP Server Logon exit point QIBM_QTMF_SVR_LOGON was */
/* registered during FTP product installation. */
/* */
/* Restrictions: */
/* */
/* None */
/* */
/* Messages: */
/* */
/* None */
/* */
/* Side Effects: */
/* */
/* None */
/* */
/* Functions/Macros called: */
/* */
/* CheckClientAddress - Check the ClientIPaddr_p input argument.*/
/* memcpy - Copy bytes from source to destination. */
/* memset - Set bytes to value. */
/* strstr - Locate first occurrence of substring. */
/* sprintf - Formatted print to buffer. */
/* */
/* Input: */
/* int ApplId - Application Identifier (Server = 1). */
/* char * UserId_p - User identifier from client program. */
/* (For FTP server, USER subcommand data)*/
/* int Lgth_UserId - Length (in bytes) of user ID string. */
/* char * AuthStr_p - Authentication string from client. */
/* (For FTP server, this is the password)*/
/* int Lgth_AuthStr - Length (bytes) Authentication string. */
/* char * ClientIPaddr_p - Internet Protocol address from which */
/* the session originates. */
/* int * Lgth_ClientIPaddr - Length (in bytes) of IP address. */
/* */
/* Output: */
/* int * ReturnCode: Indicates degree of success of operation: */
/* ReturnCode = 0 - Reject logon. */
/* ReturnCode = 1 - Continue logon; use initial current library*/
/* ReturnCode = 2 - Continue logon; override initial current */
/* library */
/* ReturnCode = 3 - Continue logon; override user, password */
/* ReturnCode = 4 - Continue logon; override user, password, */
/* current library */
/* ReturnCode = 5 - Accept logon; override user profile */
/* ReturnCode = 6 - Accept logon; override user profile, */
/* current library */
/* char * UserProfile - User profile to use for this session */
/* char * Password - Password to use for this session */
/* char * Init_Cur_Lib - Initial current library for this session */
/* */
/* Exit Normal: (See OUTPUT) */
/* */
/* Exit Error: None */
/* */
/* End Function Specification *****************************************/
static void qtmfsvrlgn(int ApplId, /* Entry point */
char *UserId_p,
int Lgth_UserId,
char *AuthStr_p,
int Lgth_AuthStr,
char *ClientIPaddr_p,
int Lgth_ClientIPaddr,
int *ReturnCode,
char *UserProfile_p,
char *Password_p,
char *InitCurrLib_p)
{
/********************************************************************/
/* Local Variables */
/********************************************************************/
/* The following lists serve as an example of an additional layer */
/* of control over user authentication to an application server. */
/* Here, logon operations using the following user identifiers */
/* will be allowed to continue, but the output parameters returned */
/* by this example exit program will vary depending on which list */
/* a user identifier (UserId_p) is found in. */
/* For example, attempts to logon as FTPUSR11 or FTPUSR2 will be */
/* allowed, and this example exit will return the initial current */
/* library as an output parameter along with a return code of 2. */
/********************************************************************/
/* Continue the logon operation, Return Code = 1 */
char Return1[] = "FTPUSR10 ";
/* Continue the logon operation, Return Code = 2 */
char Return2[] = "FTPUSR11 FTPUSR2 ";
/* Continue the logon operation, Return Code = 3 */
char Return3[] = "FTPUSR12 FTPUSR3 FTPUSR23 ";
/* Continue the logon operation, Return Code = 4 */
char Return4[] = "FTPUSER FTPUSR4 FTPUSR24 FTPUSR94 ";
int rc; /* Results of server logon request */
Qsy_USRI0300_T Receiver_var; /* QSYRUSRI API Receiver variable */
int Lgth_Receiver_var; /* Receiver variable length */
char Format_Name[8]; /* Format name buffer */
char User_Id[10]; /* User Identifier buffer */
Qus_EC_t error_code = /* QSYRUSRI API error code structure: */
{
sizeof(Qus_EC_t), /* Set bytes provided */
0, /* Initialize bytes available */
' ',' ',' ',' ',' ',' ',' ' /* Initialize Exception Id */
};
char *pcTest_p; /* Upper-case User Identifier pointer*/
int i; /* "For" loop counter variable */
/********************************************************************/
/* Code */
/********************************************************************/
/* Test validity of application ID input argument. */
if(1 NEQ ApplId)
{
/* ERROR - Not FTP server application. */
/* Return Code of 0 is used here to indicate */
/* that an incorrect input argument was received. */
/* The server logon operation will be rejected. */
rc = 0; /* Application ID not valid */
} /* End If the application identifier is NOT for FTP server */
else /* FTP server application identifier */
{
/* Validate the client IP address input argument. */
rc = CheckClientAddress(ClientIPaddr_p,
Lgth_ClientIPaddr);
if(0 NEQ rc) /* Valid, acceptable client address */
{
/* Initialize User_Id; used to hold upper-cased user identifier */
memset(User_Id, BLANK, sizeof(User_Id));
/* Initialize pcTest_p to point to UserId_p input argument. */
pcTest_p = UserId_p;
/* Uppercase all of the user ID to compare for ANONYMOUS user. */
for(i = 0; i &lt; Lgth_UserId; i++)
{
User_Id[i] = (char)toupper(*pcTest_p);
pcTest_p += 1;
}
/* If user has logged in as ANONYMOUS. */
if(0 == memcmp("ANONYMOUS ", User_Id, 10))
{
/* Determine how to continue with ANONYMOUS logon attempt. */
if(NULL NEQ strstr(Limit, ClientIPaddr_p))
{
/* If users system IP address is found in the "Limit" list, */
/* return ReturnCode of 6, user profile and initial */
/* current library values as output parameters. */
memcpy(UserProfile_p, "USERA1 ", 10);
memcpy(InitCurrLib_p, "PUBLIC ", 10);
rc = 6;
}
else
{
/* Users system IP address is NOT found in the "Limit" list,*/
/* return ReturnCode of 5, user profile output parameter; */
/* use the initial current library that is specified by the */
/* user profile information. */
memcpy(UserProfile_p, "USERA1 ", 10);
rc = 5;
}
} /* End If USER is ANONYMOUS */
else /* Else USER is not ANONYMOUS */
{
/* Set receiver variable length. */
Lgth_Receiver_var = sizeof(Qsy_USRI0300_T);
/* Set return information format. */
memcpy(Format_Name, "USRI0300", sizeof(Format_Name));
/* Set user identifier passed in. */
memset(User_Id, BLANK, sizeof(User_Id));
memcpy(User_Id, UserId_p, Lgth_UserId);
/* Call QSYRUSRI - Retrieve User Information API */
QSYRUSRI(&amp;Receiver_var, /* Return Information receiver var */
Lgth_Receiver_var,/* Receiver variable length */
Format_Name, /* Return information format name */
User_Id, /* User ID seeking information */
&amp;error_code); /* Error return information */
/* Check if an error occurred (byte_available not equal 0) */
if(0 NEQ error_code.Bytes_Available)
{
/* Return ReturnCode of 0 only (Reject logon); */
rc = 0; /* Reject the logon operation */
*ReturnCode = rc; /* Assign result to ReturnCode */
}
else /* No error occurred from Retrieve User Info */
{ /* (Bytes_Available = 0) */
/* Set current library for user profile. */
memcpy(InitCurrLib_p, Receiver_var.Current_Library, 10);
if(NULL NEQ strstr("*CRTDFT ",
Receiver_var.Current_Library))
{
memcpy(InitCurrLib_p, "FTPDEFAULT", 10);
}
else
{
if(NULL NEQ strstr(Return1, UserId_p))
{
/* Return ReturnCode of 1 (Continue logon); */
/* Also return user profile and password output */
/* parameters to endure they are ignored by the server.*/
memcpy(UserProfile_p, UserId_p, Lgth_UserId);
memcpy(Password_p, AuthStr_p, Lgth_AuthStr);
rc = 1; /* Continue the logon operation */
}
else
{
if(NULL NEQ strstr(Return2, UserId_p))
{
/* Return ReturnCode of 2, and initial current library*/
/* Also return user profile and password values */
/* even though they will be ignored by the server. */
memcpy(UserProfile_p, UserId_p, Lgth_UserId);
memcpy(Password_p, AuthStr_p, Lgth_AuthStr);
memcpy(InitCurrLib_p, "FTPEXT2",
strlen("FTPEXT2"));
rc = 2; /* Continue logon; return InitCurLib */
}
else
{
if(NULL NEQ strstr(Return3, UserId_p))
{
/* Return ReturnCode of 3, user profile, password. */
/* Also return initial current library value, */
/* even though it will be ignored. */
memcpy(UserProfile_p, UserId_p, Lgth_UserId);
memcpy(Password_p, AuthStr_p, Lgth_AuthStr);
memcpy(InitCurrLib_p, "FTPEXT3",
strlen("FTPEXT3")); /* Server ignores */
rc = 3;
}
else
{
if(NULL NEQ strstr(Return4, UserId_p))
{
/*Return ReturnCode of 4, user profile, */
/* password, and initial current library values */
memcpy(UserProfile_p, UserId_p, Lgth_UserId);
memcpy(Password_p, AuthStr_p, Lgth_AuthStr);
memcpy(InitCurrLib_p, "FTPEXT4",
strlen("FTPEXT4"));
rc = 4;
}
else
/* This is the default return code for logon */
/* attempts using any user identifier not */
/* explicitly found in one of the four lists in */
/* the local variables section of this function. */
{
/*Return ReturnCode of 1, continue logon operation*/
rc = 1;
}
}
}
}
}
} /* End No error occurred (byte_available = 0) */
} /* End Else USER is not ANONYMOUS */
} /* End Valid, acceptable client address */
} /* End FTP server application identifier */
*ReturnCode = rc;
return;
} /* End program qtmfsvrlgn.c */
/* Function Specification *********************************************/
/* */
/* Function Name: CheckClientAddress */
/* */
/* Descriptive Name: Check the IP address of the originating session */
/* from the input argument (ClientIPaddr_p) to */
/* ensure it is in valid dotted-decimal format, */
/* and that the client system is allowed access. */
/* This is an example of an input validity check. */
/* */
/* Notes: */
/* */
/* Dependencies: */
/* None */
/* */
/* Restrictions: */
/* None */
/* */
/* Messages: */
/* None */
/* */
/* Side Effects: */
/* None */
/* */
/* Functions/Macros called: */
/* */
/* strspn - Search for first occurrence of a string. */
/* */
/* Input: */
/* char * ClientIPaddr_p - Internet Protocol address from which */
/* the session originates. */
/* int * Lgth_ClientIPaddr - Length (in bytes) of IP address. */
/* */
/* Output: */
/* int rc - Return code indicating validity of IP */
/* address from ClientIPaddr_p input. */
/* 0 = Reject the logon operation. */
/* ClientIPaddr_p is one that is not */
/* allowed, or contains a character */
/* that is not valid. */
/* 1 = Continue the logon operation. */
/* */
/* Exit Normal: (See OUTPUT) */
/* */
/* Exit Error: None. */
/* */
/* End Function Specification *****************************************/
static int CheckClientAddress(char *ClientIPaddr_p, /* Entry point */
int Lgth_ClientIPaddr)
{
/********************************************************************/
/* Local Variables */
/********************************************************************/
int rc; /* Return code */
/********************************************************************/
/* Code */
/********************************************************************/
/* Check that client IP address input argument is dotted-decimal */
/* format of minimum length, with no leading blanks or periods, */
/* and contains only valid characters. */
if((Lgth_ClientIPaddr &lt; 7) || /* Minimum IP address size */
(strspn(ClientIPaddr_p, ValidChars) &lt; Lgth_ClientIPaddr)||
(strspn(ClientIPaddr_p, ".") EQ 1)|| /* Leading '.' in IP */
(strspn(ClientIPaddr_p, " ") EQ 1)) /* Leading blank in IP */
{
/* Client's IP address not valid, or contains an incorrect character */
rc = 0; /* Client IP address input argument not valid */
}
else
{
/* Is client system allowed to log in to FTP server? */
if(NULL NEQ strstr(Reject, ClientIPaddr_p))
{
/* Return code = 0 - Reject the server logon operation, as the */
/* client IP address is found in the global */
/* "Reject" list. */
rc = 0; /* Reject the logon operation */
}
else
{
/* Continue the server logon operation checks. */
rc = 1; /* Continue the logon operation */
}
}
return(rc);
}
#undef _QTMFSVRLGN_C </pre>
</div>
</div>
<div>
<div class="familylinks">
<div class="parentlink"><strong>Parent topic:</strong> <a href="rzaiqlepi.htm" title="You can control the authentication of users to a TCP/IP application server with the TCP/IP Application Server Logon exit point.">Server logon exit point</a></div>
</div>
</div>
</body>
</html>