Add a new option, '-o', for "Write-only". Disables the RETR command,

preventing anyone from downloading files.  In conjunction with -A, and some
appropriate file permissions, this lets you create an anonymous FTP drop
box for people to upload files to.

The more obvious "-w" flag is already taken by NetBSD's ftpd.  "-o" was
available as an option letter in all three BSDs.
This commit is contained in:
Nik Clayton 2001-08-28 11:59:21 +00:00
parent b4fa8260b8
commit 62513e761e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=82460
3 changed files with 16 additions and 2 deletions

View File

@ -93,6 +93,7 @@ extern int transflag;
extern char tmpline[];
extern int readonly;
extern int noepsv;
extern int noretr;
off_t restart_point;
@ -439,8 +440,11 @@ cmd
}
| RETR check_login SP pathname CRLF
{
if ($2 && $4 != NULL)
if (noretr)
reply(500, "RETR command is disabled");
else if ($2 && $4 != NULL)
retrieve((char *) 0, $4);
if ($4 != NULL)
free($4);
}

View File

@ -50,6 +50,7 @@
.Op Fl S
.Op Fl U
.Op Fl r
.Op Fl o
.Op Fl E
.Op Fl T Ar maxtimeout
.Op Fl t Ar timeout
@ -157,6 +158,9 @@ Allow only anonymous ftp access.
.It Fl r
Put server in read-only mode.
All commands which may modify the local filesystem are disabled.
.It Fl o
Put server in write-only mode.
RETR is disabled, preventing downloads.
.It Fl E
Disable the EPSV command.
This is useful for servers behind older firewalls.

View File

@ -149,6 +149,8 @@ int usedefault = 1; /* for data transfers */
int pdata = -1; /* for passive mode */
int readonly=0; /* Server is in readonly mode. */
int noepsv=0; /* EPSV command is disabled. */
int noretr=0; /* RETR command is disabled. */
sig_atomic_t transflag;
off_t file_size;
off_t byte_count;
@ -299,7 +301,7 @@ main(argc, argv, envp)
#endif /* OLD_SETPROCTITLE */
while ((ch = getopt(argc, argv, "AdlDESURrt:T:u:va:p:46")) != -1) {
while ((ch = getopt(argc, argv, "AdlDESURrt:T:u:voa:p:46")) != -1) {
switch (ch) {
case 'D':
daemon_mode++;
@ -382,6 +384,10 @@ main(argc, argv, envp)
family = AF_INET6;
break;
case 'o':
noretr = 1;
break;
default:
warnx("unknown flag -%c ignored", optopt);
break;