📄 ftpconnection.java
字号:
* <code>RNFR <SP> <pathname> <CRLF></code><br>
*
* This command specifies the old pathname of the file which is
* to be renamed. This command must be immediately followed by
* a "rename to" command specifying the new file pathname.
*/
public void doRNFR(FtpRequest request, FtpWriter out) throws IOException {
// reset state variable
resetState();
// argument check
if(!request.hasArgument()) {
out.write(mFtpStatus.getResponse(501, request, mUser, null));
return;
}
// set state variable
mbRenFr = true;
// get filenames
String fileName = request.getArgument();
fileName = mUser.getVirtualDirectory().getAbsoluteName(fileName);
mstRenFr = mUser.getVirtualDirectory().getPhysicalName(fileName);
String args[] = {fileName};
out.write(mFtpStatus.getResponse(350, request, mUser, args));
}
/**
* <code>RNTO <SP> <pathname> <CRLF></code><br>
*
* This command specifies the new pathname of the file
* specified in the immediately preceding "rename from"
* command. Together the two commands cause a file to be
* renamed.
*/
public void doRNTO(FtpRequest request, FtpWriter out) throws IOException {
// argument check
if(!request.hasArgument()) {
resetState();
out.write(mFtpStatus.getResponse(501, request, mUser, null));
return;
}
// set state variables
if((!mbRenFr) || (mstRenFr == null)) {
resetState();
out.write(mFtpStatus.getResponse(100, request, mUser, null));
return;
}
// get filenames
String fromFileStr = mUser.getVirtualDirectory().getVirtualName(mstRenFr);
String toFileStr = request.getArgument();
toFileStr = mUser.getVirtualDirectory().getAbsoluteName(toFileStr);
String physicalToFileStr = mUser.getVirtualDirectory().getPhysicalName(toFileStr);
File fromFile = new File(mstRenFr);
File toFile = new File(physicalToFileStr);
String args[] = {fromFileStr, toFileStr};
resetState();
// check permission
if(!mUser.getVirtualDirectory().hasCreatePermission(physicalToFileStr, true)) {
out.write(mFtpStatus.getResponse(553, request, mUser, null));
return;
}
// now rename
if(fromFile.renameTo(toFile)) {
out.write(mFtpStatus.getResponse(250, request, mUser, args));
}
else {
out.write(mFtpStatus.getResponse(553, request, mUser, args));
}
}
/**
* <code>SITE <SP> <string> <CRLF></code><br>
*
* This command is used by the server to provide services
* specific to his system that are essential to file transfer
* but not sufficiently universal to be included as commands in
* the protocol.
*/
public void doSITE(FtpRequest request, FtpWriter out) throws IOException {
SiteCommandHandler siteCmd = new SiteCommandHandler( mConfig, mUser );
out.write( siteCmd.getResponse(request) );
}
/**
* <code>SIZE <SP> <pathname> <CRLF></code><br>
*
* Returns the size of the file in bytes.
*/
public void doSIZE(FtpRequest request, FtpWriter out) throws IOException {
// argument check
if(!request.hasArgument()) {
out.write(mFtpStatus.getResponse(501, request, mUser, null));
return;
}
// reset state variables
resetState();
// get filenames
String fileName = request.getArgument();
fileName = mUser.getVirtualDirectory().getAbsoluteName(fileName);
String physicalName = mUser.getVirtualDirectory().getPhysicalName(fileName);
File reqFile = new File(physicalName);
// print file size
if(reqFile.exists()) {
String args[] = {String.valueOf(reqFile.length())};
out.write(mFtpStatus.getResponse(213, request, mUser, args));
}
else {
out.write(mFtpStatus.getResponse(550, request, mUser, null));
}
}
/**
* <code>STAT [<SP> <pathname>] <CRLF></code><br>
*
* This command shall cause a status response to be sent over
* the control connection in the form of a reply.
*/
public void doSTAT(FtpRequest request, FtpWriter out) throws IOException {
String args[] = {
mConfig.getSelfAddress().getHostAddress(),
mControlSocket.getInetAddress().getHostAddress(),
mUser.getName()
};
out.write(mFtpStatus.getResponse(211, request, mUser, args));
}
/**
* <code>STOR <SP> <pathname> <CRLF></code><br>
*
* This command causes the server-DTP to accept the data
* transferred via the data connection and to store the data as
* a file at the server site. If the file specified in the
* pathname exists at the server site, then its contents shall
* be replaced by the data being transferred. A new file is
* created at the server site if the file specified in the
* pathname does not already exist.
*/
public void doSTOR(FtpRequest request, FtpWriter out) throws IOException {
// set state variables
long skipLen = (mbReset) ? mlSkipLen : 0;
resetState();
// argument check
if(!request.hasArgument()) {
out.write(mFtpStatus.getResponse(501, request, mUser, null));
return;
}
// get filenames
String fileName = request.getArgument();
fileName = mUser.getVirtualDirectory().getAbsoluteName(fileName);
String physicalName = mUser.getVirtualDirectory().getPhysicalName(fileName);
File requestedFile = new File(physicalName);
// get permission
if(!mUser.getVirtualDirectory().hasCreatePermission(physicalName, true)) {
out.write(mFtpStatus.getResponse(550, request, mUser, null));
return;
}
// now transfer file data
out.write(mFtpStatus.getResponse(150, request, mUser, null));
InputStream is = null;
OutputStream os = null;
try {
Socket dataSoc = mDataConnection.getDataSocket();
if (dataSoc == null) {
out.write(mFtpStatus.getResponse(550, request, mUser, null));
return;
}
is = dataSoc.getInputStream();
RandomAccessFile raf = new RandomAccessFile(requestedFile, "rw");
raf.seek(skipLen);
os = mUser.getOutputStream( new FileOutputStream(raf.getFD()) );
StreamConnector msc = new StreamConnector(is, os);
msc.setMaxTransferRate(mUser.getMaxUploadRate());
msc.setObserver(this);
msc.connect();
if(msc.hasException()) {
out.write(mFtpStatus.getResponse(451, request, mUser, null));
return;
}
else {
mConfig.getStatistics().setUpload(requestedFile, mUser, msc.getTransferredSize());
}
out.write(mFtpStatus.getResponse(226, request, mUser, null));
}
catch(IOException ex) {
out.write(mFtpStatus.getResponse(425, request, mUser, null));
}
finally {
IoUtils.close(is);
IoUtils.close(os);
mDataConnection.reset();
}
}
/**
* <code>STOU <CRLF></code><br>
*
* This command behaves like STOR except that the resultant
* file is to be created in the current directory under a name
* unique to that directory. The 250 Transfer Started response
* must include the name generated.
*/
public void doSTOU(FtpRequest request, FtpWriter out) throws IOException {
// reset state variables
resetState();
// get filenames
String fileName = mUser.getVirtualDirectory().getAbsoluteName("ftp.dat");
String physicalName = mUser.getVirtualDirectory().getPhysicalName(fileName);
File requestedFile = new File(physicalName);
requestedFile = IoUtils.getUniqueFile(requestedFile);
fileName = mUser.getVirtualDirectory().getVirtualName(requestedFile.getAbsolutePath());
String args[] = {fileName};
// check permission
if(!mUser.getVirtualDirectory().hasCreatePermission(fileName, false)) {
out.write(mFtpStatus.getResponse(550, request, mUser, null));
return;
}
// now transfer file data
out.write(mFtpStatus.getResponse(150, request, mUser, null));
InputStream is = null;
OutputStream os = null;
try {
Socket dataSoc = mDataConnection.getDataSocket();
if (dataSoc == null) {
out.write(mFtpStatus.getResponse(550, request, mUser, args));
return;
}
is = dataSoc.getInputStream();
os = mUser.getOutputStream( new FileOutputStream(requestedFile) );
StreamConnector msc = new StreamConnector(is, os);
msc.setMaxTransferRate(mUser.getMaxUploadRate());
msc.setObserver(this);
msc.connect();
if(msc.hasException()) {
out.write(mFtpStatus.getResponse(451, request, mUser, null));
return;
}
else {
mConfig.getStatistics().setUpload(requestedFile, mUser, msc.getTransferredSize());
}
out.write(mFtpStatus.getResponse(226, request, mUser, null));
mDataConnection.reset();
out.write(mFtpStatus.getResponse(250, request, mUser, args));
}
catch(IOException ex) {
out.write(mFtpStatus.getResponse(425, request, mUser, null));
}
finally {
IoUtils.close(is);
IoUtils.close(os);
mDataConnection.reset();
}
}
/**
* <code>STRU <SP> <structure-code> <CRLF></code><br>
*
* The argument is a single Telnet character code specifying
* file structure.
*/
public void doSTRU(FtpRequest request, FtpWriter out) throws IOException {
// reset state variables
resetState();
// argument check
if(!request.hasArgument()) {
out.write(mFtpStatus.getResponse(501, request, mUser, null));
return;
}
if (mUser.setStructure(request.getArgument().charAt(0))) {
out.write(mFtpStatus.getResponse(200, request, mUser, null));
}
else {
out.write(mFtpStatus.getResponse(504, request, mUser, null));
}
}
/**
* <code>SYST <CRLF></code><br>
*
* This command is used to find out the type of operating
* system at the server.
*/
public void doSYST(FtpRequest request, FtpWriter out) throws IOException {
// reset state variables
resetState();
String args[] = {mConfig.getSystemName()};
out.write(mFtpStatus.getResponse(215, request, mUser, args));
}
/**
* <code>TYPE <SP> <type-code> <CRLF></code><br>
*
* The argument specifies the representation type.
*/
public void doTYPE(FtpRequest request, FtpWriter out) throws IOException {
// reset state variables
resetState();
// get type from argument
char type = 'A';
if (request.hasArgument()){
type = request.getArgument().charAt(0);
}
// set it
if (mUser.setType(type)) {
out.write(mFtpStatus.getResponse(200, request, mUser, null));
}
else {
out.write(mFtpStatus.getResponse(504, request, mUser, null));
}
}
/**
* <code>USER <SP> <username> <CRLF></code><br>
*
* The argument field is a Telnet string identifying the user.
* The user identification is that which is required by the
* server for access to its file system. This command will
* normally be the first command transmitted by the user after
* the control connections are made.
*/
public void doUSER(FtpRequest request, FtpWriter out) throws IOException {
// set state variables
resetState();
// argument check
if(!request.hasArgument()) {
out.write(mFtpStatus.getResponse(501, request, mUser, null));
return;
}
// check user login status
mbUser = true;
if(mUser.hasLoggedIn()) {
if(mUser.getName().equals(request.getArgument())) {
out.write(mFtpStatus.getResponse(230, request, mUser, null));
return;
}
else {
mConfig.getConnectionService().closeConnection(mUser.getSessionId());
}
}
// set user name and send appropriate message
mUser.setName(request.getArgument());
if(mUser.getIsAnonymous()) {
if(mConfig.isAnonymousLoginAllowed()) {
FtpRequest anoRequest = new FtpRequest(mUser.getName());
out.write(mFtpStatus.getResponse(331, anoRequest, mUser, null));
}
else {
out.write(mFtpStatus.getResponse(530, request, mUser, null));
ConnectionService conService = mConfig.getConnectionService();
if (conService != null) {
conService.closeConnection(mUser.getSessionId());
}
}
}
else {
out.write(mFtpStatus.getResponse(331, request, mUser, null));
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -