in core/src/main/java/org/apache/ftpserver/command/impl/RMD.java [54:133]
public void execute(final FtpIoSession session,
final FtpServerContext context, final FtpRequest request)
throws IOException, FtpException {
// reset state variables
session.resetState();
// argument check
String fileName = request.getArgument();
if (fileName == null) {
session.write(LocalizedFileActionFtpReply.translate(session, request, context,
FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS,
"RMD", null, null));
return;
}
// get file object
FtpFile file = null;
try {
file = session.getFileSystemView().getFile(fileName);
} catch (Exception ex) {
LOG.debug("Exception getting file object", ex);
}
if (file == null) {
session.write(LocalizedFileActionFtpReply.translate(session, request, context,
FtpReply.REPLY_550_REQUESTED_ACTION_NOT_TAKEN,
"RMD.permission", fileName, file));
return;
}
fileName = file.getAbsolutePath();
// first let's make sure the path is a directory
if (!file.isDirectory()) {
session.write(LocalizedFileActionFtpReply.translate(session, request, context,
FtpReply.REPLY_550_REQUESTED_ACTION_NOT_TAKEN,
"RMD.invalid", fileName, file));
return;
}
// then make sure that the client did not request the deletion of
// current working directory.
FtpFile cwd = session.getFileSystemView().getWorkingDirectory();
if(file.equals(cwd)) {
session.write(LocalizedFileActionFtpReply.translate(session, request, context,
FtpReply.REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN, "RMD.busy",
fileName, file));
return;
}
// now check to see if the user have permission to delete this directory
if (!file.isRemovable()) {
session.write(LocalizedFileActionFtpReply.translate(session, request, context,
FtpReply.REPLY_550_REQUESTED_ACTION_NOT_TAKEN,
"RMD.permission", fileName, file));
return;
}
// now delete directory
if (file.delete()) {
session.write(LocalizedFileActionFtpReply.translate(session, request, context,
FtpReply.REPLY_250_REQUESTED_FILE_ACTION_OKAY, "RMD",
fileName, file));
// write log message
String userName = session.getUser().getName();
LOG.info("Directory remove : " + userName + " - " + fileName);
// notify statistics object
ServerFtpStatistics ftpStat = (ServerFtpStatistics) context
.getFtpStatistics();
ftpStat.setRmdir(session, file);
} else {
session.write(LocalizedFileActionFtpReply.translate(session, request, context,
FtpReply.REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN, "RMD",
fileName, file));
}
}