From 94dd133a951d4736fd5258d14fc12aec602b95b7 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Sat, 6 Aug 2011 21:09:43 +0000
Subject: [PATCH] Added 'U' (Upload Files) exemption, allows uploads to any
 directory (regardless of configured upload requirements) and exceed the "max
 files" settings per dir.

---
 src/sbbs3/ftpsrvr.c  | 30 +++++++++++++++++++++---------
 text/menu/exempt.asc |  2 +-
 2 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index bf7cd921da..2f312f213d 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -124,7 +124,7 @@ BOOL direxist(char *dir)
 
 BOOL dir_op(scfg_t* cfg, user_t* user, client_t* client, uint dirnum)
 {
-	return(user->level>=SYSOP_LEVEL || user->exempt&FLAG('R')
+	return(user->level>=SYSOP_LEVEL
 		|| (cfg->dir[dirnum]->op_ar[0] && chk_ar(cfg,cfg->dir[dirnum]->op_ar,user,client)));
 }
 
@@ -4067,7 +4067,7 @@ static void ctrl_thread(void* arg)
 					continue;
 				}
 
-				if(delecmd && !dir_op(&scfg,&user,&client,dir)) {
+				if(delecmd && !dir_op(&scfg,&user,&client,dir) && !(user.exempt&FLAG('R'))) {
 					lprintf(LOG_WARNING,"%04d !%s has insufficient access to delete files in /%s/%s"
 						,sock,user.alias
 						,scfg.lib[scfg.dir[dir]->lib]->sname
@@ -4270,13 +4270,25 @@ static void ctrl_thread(void* arg)
 
 				append=(strnicmp(cmd,"APPE",4)==0);
 			
-				if(!chk_ar(&scfg,scfg.dir[dir]->ul_ar,&user,&client)) {
-					lprintf(LOG_WARNING,"%04d !%s has insufficient access to upload to /%s/%s"
-						,sock,user.alias
-						,scfg.lib[scfg.dir[dir]->lib]->sname
-						,scfg.dir[dir]->code_suffix);
-					sockprintf(sock,"553 Insufficient access.");
-					continue;
+				if(!dir_op(&scfg,&user,&client,dir) && !(user.exempt&FLAG('U'))) {
+					if(!chk_ar(&scfg,scfg.dir[dir]->ul_ar,&user,&client)) {
+						lprintf(LOG_WARNING,"%04d !%s cannot upload to /%s/%s (insufficient access)"
+							,sock,user.alias
+							,scfg.lib[scfg.dir[dir]->lib]->sname
+							,scfg.dir[dir]->code_suffix);
+						sockprintf(sock,"553 Insufficient access.");
+						continue;
+					}
+
+					if(scfg.dir[dir]->maxfiles && getfiles(&scfg,dir)>=scfg.dir[dir]->maxfiles) {
+						lprintf(LOG_WARNING,"%04d !%s cannot upload to /%s/%s (directory full: %u files)"
+							,sock,user.alias
+							,scfg.lib[scfg.dir[dir]->lib]->sname
+							,scfg.dir[dir]->code_suffix
+							,getfiles(&scfg,dir));
+						sockprintf(sock,"553 Directory full.");
+						continue;
+					}
 				}
 				if(*p=='-'
 					|| strcspn(p,ILLEGAL_FILENAME_CHARS)!=strlen(p)
diff --git a/text/menu/exempt.asc b/text/menu/exempt.asc
index 17790cf677..30eb907da9 100644
--- a/text/menu/exempt.asc
+++ b/text/menu/exempt.asc
@@ -4,4 +4,4 @@ C=Chat Page	    J=Chat Cost 	Q=Quiet/Anon Node   X=Xtrn Program Cost
 D=Download Cost     K=                  R=Remove Files      Y=
 E=Expire by Time    L=Logons            S=NetMail Cost      Z=
 F=CR/FR/RR NetMail  M=Modem Rate        T=Time Online
-G=Multiple Nodes    N=Node Locking      U=
+G=Multiple Nodes    N=Node Locking      U=Upload Files
-- 
GitLab