summaryrefslogtreecommitdiffstats
path: root/libexec
diff options
context:
space:
mode:
authorjedgar <jedgar@FreeBSD.org>2001-01-20 01:34:22 +0000
committerjedgar <jedgar@FreeBSD.org>2001-01-20 01:34:22 +0000
commit7aee899b936bf92c700e61cbd6c0f7983cc0fa80 (patch)
treef92b3cb2a5ab5a2bd8bff261d3524ff23c559040 /libexec
parent4d5acb37f2fef7b99637885736fbcbb0d762da6a (diff)
downloadFreeBSD-src-7aee899b936bf92c700e61cbd6c0f7983cc0fa80.zip
FreeBSD-src-7aee899b936bf92c700e61cbd6c0f7983cc0fa80.tar.gz
Limit commands that can be issued when not logged in:
TYPE, STRU, MODE, ALLO, STAT, ABOR, SITE IDLE, SYST, REST Reviewed by: kris, sheldon
Diffstat (limited to 'libexec')
-rw-r--r--libexec/ftpd/ftpcmd.y160
1 files changed, 90 insertions, 70 deletions
diff --git a/libexec/ftpd/ftpcmd.y b/libexec/ftpd/ftpcmd.y
index 4084d8f..d6a002b 100644
--- a/libexec/ftpd/ftpcmd.y
+++ b/libexec/ftpd/ftpcmd.y
@@ -355,72 +355,82 @@ cmd
if ($2)
long_passive("EPSV", PF_UNSPEC);
}
- | TYPE SP type_code CRLF
+ | TYPE check_login SP type_code CRLF
{
- switch (cmd_type) {
-
- case TYPE_A:
- if (cmd_form == FORM_N) {
- reply(200, "Type set to A.");
- type = cmd_type;
- form = cmd_form;
- } else
- reply(504, "Form must be N.");
- break;
+ if ($2) {
+ switch (cmd_type) {
+
+ case TYPE_A:
+ if (cmd_form == FORM_N) {
+ reply(200, "Type set to A.");
+ type = cmd_type;
+ form = cmd_form;
+ } else
+ reply(504, "Form must be N.");
+ break;
- case TYPE_E:
- reply(504, "Type E not implemented.");
- break;
+ case TYPE_E:
+ reply(504, "Type E not implemented.");
+ break;
- case TYPE_I:
- reply(200, "Type set to I.");
- type = cmd_type;
- break;
+ case TYPE_I:
+ reply(200, "Type set to I.");
+ type = cmd_type;
+ break;
- case TYPE_L:
+ case TYPE_L:
#if NBBY == 8
- if (cmd_bytesz == 8) {
- reply(200,
- "Type set to L (byte size 8).");
- type = cmd_type;
- } else
- reply(504, "Byte size must be 8.");
+ if (cmd_bytesz == 8) {
+ reply(200,
+ "Type set to L (byte size 8).");
+ type = cmd_type;
+ } else
+ reply(504, "Byte size must be 8.");
#else /* NBBY == 8 */
- UNIMPLEMENTED for NBBY != 8
+ UNIMPLEMENTED for NBBY != 8
#endif /* NBBY == 8 */
+ }
}
}
- | STRU SP struct_code CRLF
+ | STRU check_login SP struct_code CRLF
{
- switch ($3) {
+ if ($2) {
+ switch ($4) {
- case STRU_F:
- reply(200, "STRU F ok.");
- break;
+ case STRU_F:
+ reply(200, "STRU F ok.");
+ break;
- default:
- reply(504, "Unimplemented STRU type.");
+ default:
+ reply(504, "Unimplemented STRU type.");
+ }
}
}
- | MODE SP mode_code CRLF
+ | MODE check_login SP mode_code CRLF
{
- switch ($3) {
-
- case MODE_S:
- reply(200, "MODE S ok.");
- break;
+ if ($2) {
+ switch ($4) {
- default:
- reply(502, "Unimplemented MODE type.");
+ case MODE_S:
+ reply(200, "MODE S ok.");
+ break;
+
+ default:
+ reply(502, "Unimplemented MODE type.");
+ }
}
}
- | ALLO SP NUMBER CRLF
+ | ALLO check_login SP NUMBER CRLF
{
- reply(202, "ALLO command ignored.");
+ if ($2) {
+ reply(202, "ALLO command ignored.");
+ }
}
- | ALLO SP NUMBER SP R SP NUMBER CRLF
+ | ALLO check_login SP NUMBER SP R SP NUMBER CRLF
{
- reply(202, "ALLO command ignored.");
+ if ($2) {
+ reply(202, "ALLO command ignored.");
+ }
}
| RETR check_login SP pathname CRLF
{
@@ -474,9 +484,11 @@ cmd
if ($4 != NULL)
free($4);
}
- | STAT CRLF
+ | STAT check_login CRLF
{
- statcmd();
+ if ($2) {
+ statcmd();
+ }
}
| DELE check_login_ro SP pathname CRLF
{
@@ -498,9 +510,10 @@ cmd
}
free($4);
}
- | ABOR CRLF
+ | ABOR check_login CRLF
{
- reply(225, "ABOR command successful.");
+ if ($2)
+ reply(225, "ABOR command successful.");
}
| CWD check_login CRLF
{
@@ -612,24 +625,27 @@ cmd
if ($8 != NULL)
free($8);
}
- | SITE SP IDLE CRLF
+ | SITE SP check_login IDLE CRLF
{
- reply(200,
- "Current IDLE time limit is %d seconds; max %d",
- timeout, maxtimeout);
+ if ($3)
+ reply(200,
+ "Current IDLE time limit is %d seconds; max %d",
+ timeout, maxtimeout);
}
- | SITE SP IDLE SP NUMBER CRLF
+ | SITE SP check_login IDLE SP NUMBER CRLF
{
- if ($5 < 30 || $5 > maxtimeout) {
- reply(501,
- "Maximum IDLE time must be between 30 and %d seconds",
- maxtimeout);
- } else {
- timeout = $5;
- (void) alarm((unsigned) timeout);
- reply(200,
- "Maximum IDLE time set to %d seconds",
- timeout);
+ if ($3) {
+ if ($6 < 30 || $6 > maxtimeout) {
+ reply(501,
+ "Maximum IDLE time must be between 30 and %d seconds",
+ maxtimeout);
+ } else {
+ timeout = $6;
+ (void) alarm((unsigned) timeout);
+ reply(200,
+ "Maximum IDLE time set to %d seconds",
+ timeout);
+ }
}
}
| STOU check_login_ro SP pathname CRLF
@@ -639,8 +655,9 @@ cmd
if ($4 != NULL)
free($4);
}
- | SYST CRLF
+ | SYST check_login CRLF
{
+ if ($2)
#ifdef unix
#ifdef BSD
reply(215, "UNIX Type: L%d Version: BSD-%d",
@@ -722,12 +739,15 @@ rcmd
}
}
}
- | REST SP byte_size CRLF
+ | REST check_login SP byte_size CRLF
{
- fromname = (char *) 0;
- restart_point = $3; /* XXX $3 is only "int" */
- reply(350, "Restarting at %qd. %s", restart_point,
- "Send STORE or RETRIEVE to initiate transfer.");
+ if ($2) {
+ fromname = (char *) 0;
+ restart_point = $4; /* XXX $4 is only "int" */
+ reply(350, "Restarting at %qd. %s",
+ restart_point,
+ "Send STORE or RETRIEVE to initiate transfer.");
+ }
}
;
OpenPOWER on IntegriCloud