|
@@ -23,6 +23,7 @@ import java.io.IOException;
|
|
|
import java.net.DatagramSocket;
|
|
|
import java.net.InetAddress;
|
|
|
import java.net.InetSocketAddress;
|
|
|
+import java.net.SocketAddress;
|
|
|
import java.nio.ByteBuffer;
|
|
|
import java.util.EnumSet;
|
|
|
|
|
@@ -230,15 +231,15 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public GETATTR3Response getattr(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ public GETATTR3Response getattr(XDR xdr, RpcInfo info) {
|
|
|
GETATTR3Response response = new GETATTR3Response(Nfs3Status.NFS3_OK);
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_ONLY)) {
|
|
|
+ if (!checkAccessPrivilege(info, AccessPrivilege.READ_ONLY)) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_ACCES);
|
|
|
return response;
|
|
|
}
|
|
|
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_SERVERFAULT);
|
|
@@ -322,9 +323,9 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public SETATTR3Response setattr(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ public SETATTR3Response setattr(XDR xdr, RpcInfo info) {
|
|
|
SETATTR3Response response = new SETATTR3Response(Nfs3Status.NFS3_OK);
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_SERVERFAULT);
|
|
@@ -370,7 +371,7 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
// check the write access privilege
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_WRITE)) {
|
|
|
+ if (!checkAccessPrivilege(info, AccessPrivilege.READ_WRITE)) {
|
|
|
return new SETATTR3Response(Nfs3Status.NFS3ERR_ACCES, new WccData(
|
|
|
preOpWcc, preOpAttr));
|
|
|
}
|
|
@@ -398,15 +399,15 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public LOOKUP3Response lookup(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ public LOOKUP3Response lookup(XDR xdr, RpcInfo info) {
|
|
|
LOOKUP3Response response = new LOOKUP3Response(Nfs3Status.NFS3_OK);
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_ONLY)) {
|
|
|
+ if (!checkAccessPrivilege(info, AccessPrivilege.READ_ONLY)) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_ACCES);
|
|
|
return response;
|
|
|
}
|
|
|
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_SERVERFAULT);
|
|
@@ -460,15 +461,15 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public ACCESS3Response access(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ public ACCESS3Response access(XDR xdr, RpcInfo info) {
|
|
|
ACCESS3Response response = new ACCESS3Response(Nfs3Status.NFS3_OK);
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_ONLY)) {
|
|
|
+ if (!checkAccessPrivilege(info, AccessPrivilege.READ_ONLY)) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_ACCES);
|
|
|
return response;
|
|
|
}
|
|
|
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_SERVERFAULT);
|
|
@@ -519,15 +520,16 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public READLINK3Response readlink(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ @Override
|
|
|
+ public READLINK3Response readlink(XDR xdr, RpcInfo info) {
|
|
|
READLINK3Response response = new READLINK3Response(Nfs3Status.NFS3_OK);
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_ONLY)) {
|
|
|
+ if (!checkAccessPrivilege(info, AccessPrivilege.READ_ONLY)) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_ACCES);
|
|
|
return response;
|
|
|
}
|
|
|
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_SERVERFAULT);
|
|
@@ -591,12 +593,19 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public READ3Response read(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ public READ3Response read(XDR xdr, RpcInfo info) {
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
+ SocketAddress remoteAddress = info.remoteAddress();
|
|
|
+ return read(xdr, securityHandler, remoteAddress);
|
|
|
+ }
|
|
|
+
|
|
|
+ @VisibleForTesting
|
|
|
+ READ3Response read(XDR xdr, SecurityHandler securityHandler,
|
|
|
+ SocketAddress remoteAddress) {
|
|
|
READ3Response response = new READ3Response(Nfs3Status.NFS3_OK);
|
|
|
final String userName = securityHandler.getUser();
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_ONLY)) {
|
|
|
+ if (!checkAccessPrivilege(remoteAddress, AccessPrivilege.READ_ONLY)) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_ACCES);
|
|
|
return response;
|
|
|
}
|
|
@@ -715,8 +724,17 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public WRITE3Response write(XDR xdr, Channel channel, int xid,
|
|
|
- SecurityHandler securityHandler, InetAddress client) {
|
|
|
+ public WRITE3Response write(XDR xdr, RpcInfo info) {
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
+ RpcCall rpcCall = (RpcCall) info.header();
|
|
|
+ int xid = rpcCall.getXid();
|
|
|
+ SocketAddress remoteAddress = info.remoteAddress();
|
|
|
+ return write(xdr, info.channel(), xid, securityHandler, remoteAddress);
|
|
|
+ }
|
|
|
+
|
|
|
+ @VisibleForTesting
|
|
|
+ WRITE3Response write(XDR xdr, Channel channel, int xid,
|
|
|
+ SecurityHandler securityHandler, SocketAddress remoteAddress) {
|
|
|
WRITE3Response response = new WRITE3Response(Nfs3Status.NFS3_OK);
|
|
|
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
@@ -758,7 +776,7 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
return new WRITE3Response(Nfs3Status.NFS3ERR_STALE);
|
|
|
}
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_WRITE)) {
|
|
|
+ if (!checkAccessPrivilege(remoteAddress, AccessPrivilege.READ_WRITE)) {
|
|
|
return new WRITE3Response(Nfs3Status.NFS3ERR_ACCES, new WccData(
|
|
|
Nfs3Utils.getWccAttr(preOpAttr), preOpAttr), 0, stableHow,
|
|
|
Nfs3Constant.WRITE_COMMIT_VERF);
|
|
@@ -791,8 +809,15 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public CREATE3Response create(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ public CREATE3Response create(XDR xdr, RpcInfo info) {
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
+ SocketAddress remoteAddress = info.remoteAddress();
|
|
|
+ return create(xdr, securityHandler, remoteAddress);
|
|
|
+ }
|
|
|
+
|
|
|
+ @VisibleForTesting
|
|
|
+ CREATE3Response create(XDR xdr, SecurityHandler securityHandler,
|
|
|
+ SocketAddress remoteAddress) {
|
|
|
CREATE3Response response = new CREATE3Response(Nfs3Status.NFS3_OK);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
@@ -838,7 +863,7 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
return new CREATE3Response(Nfs3Status.NFS3ERR_STALE);
|
|
|
}
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_WRITE)) {
|
|
|
+ if (!checkAccessPrivilege(remoteAddress, AccessPrivilege.READ_WRITE)) {
|
|
|
return new CREATE3Response(Nfs3Status.NFS3ERR_ACCES, null,
|
|
|
preOpDirAttr, new WccData(Nfs3Utils.getWccAttr(preOpDirAttr),
|
|
|
preOpDirAttr));
|
|
@@ -922,9 +947,9 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public MKDIR3Response mkdir(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ public MKDIR3Response mkdir(XDR xdr, RpcInfo info) {
|
|
|
MKDIR3Response response = new MKDIR3Response(Nfs3Status.NFS3_OK);
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_SERVERFAULT);
|
|
@@ -960,7 +985,7 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
return new MKDIR3Response(Nfs3Status.NFS3ERR_STALE);
|
|
|
}
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_WRITE)) {
|
|
|
+ if (!checkAccessPrivilege(info, AccessPrivilege.READ_WRITE)) {
|
|
|
return new MKDIR3Response(Nfs3Status.NFS3ERR_ACCES, null, preOpDirAttr,
|
|
|
new WccData(Nfs3Utils.getWccAttr(preOpDirAttr), preOpDirAttr));
|
|
|
}
|
|
@@ -1012,15 +1037,15 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public READDIR3Response mknod(XDR xdr,
|
|
|
- SecurityHandler securityHandler, InetAddress client) {
|
|
|
+ @Override
|
|
|
+ public READDIR3Response mknod(XDR xdr, RpcInfo info) {
|
|
|
return new READDIR3Response(Nfs3Status.NFS3ERR_NOTSUPP);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public REMOVE3Response remove(XDR xdr,
|
|
|
- SecurityHandler securityHandler, InetAddress client) {
|
|
|
+ public REMOVE3Response remove(XDR xdr, RpcInfo info) {
|
|
|
REMOVE3Response response = new REMOVE3Response(Nfs3Status.NFS3_OK);
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_SERVERFAULT);
|
|
@@ -1093,9 +1118,9 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public RMDIR3Response rmdir(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ public RMDIR3Response rmdir(XDR xdr, RpcInfo info) {
|
|
|
RMDIR3Response response = new RMDIR3Response(Nfs3Status.NFS3_OK);
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_SERVERFAULT);
|
|
@@ -1129,7 +1154,7 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
|
|
|
WccData errWcc = new WccData(Nfs3Utils.getWccAttr(preOpDirAttr),
|
|
|
preOpDirAttr);
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_WRITE)) {
|
|
|
+ if (!checkAccessPrivilege(info, AccessPrivilege.READ_WRITE)) {
|
|
|
return new RMDIR3Response(Nfs3Status.NFS3ERR_ACCES, errWcc);
|
|
|
}
|
|
|
|
|
@@ -1175,9 +1200,9 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public RENAME3Response rename(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ public RENAME3Response rename(XDR xdr, RpcInfo info) {
|
|
|
RENAME3Response response = new RENAME3Response(Nfs3Status.NFS3_OK);
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_SERVERFAULT);
|
|
@@ -1221,7 +1246,7 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
return new RENAME3Response(Nfs3Status.NFS3ERR_STALE);
|
|
|
}
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_WRITE)) {
|
|
|
+ if (!checkAccessPrivilege(info, AccessPrivilege.READ_WRITE)) {
|
|
|
WccData fromWcc = new WccData(Nfs3Utils.getWccAttr(fromPreOpAttr),
|
|
|
fromPreOpAttr);
|
|
|
WccData toWcc = new WccData(Nfs3Utils.getWccAttr(toPreOpAttr),
|
|
@@ -1263,15 +1288,15 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public SYMLINK3Response symlink(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ public SYMLINK3Response symlink(XDR xdr, RpcInfo info) {
|
|
|
SYMLINK3Response response = new SYMLINK3Response(Nfs3Status.NFS3_OK);
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_WRITE)) {
|
|
|
+ if (!checkAccessPrivilege(info, AccessPrivilege.READ_WRITE)) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_ACCES);
|
|
|
return response;
|
|
|
}
|
|
|
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_SERVERFAULT);
|
|
@@ -1322,8 +1347,8 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public READDIR3Response link(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ @Override
|
|
|
+ public READDIR3Response link(XDR xdr, RpcInfo info) {
|
|
|
return new READDIR3Response(Nfs3Status.NFS3ERR_NOTSUPP);
|
|
|
}
|
|
|
|
|
@@ -1351,11 +1376,16 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
+ public READDIR3Response readdir(XDR xdr, RpcInfo info) {
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
+ SocketAddress remoteAddress = info.remoteAddress();
|
|
|
+ return readdir(xdr, securityHandler, remoteAddress);
|
|
|
+ }
|
|
|
public READDIR3Response readdir(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ SocketAddress remoteAddress) {
|
|
|
READDIR3Response response = new READDIR3Response(Nfs3Status.NFS3_OK);
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_ONLY)) {
|
|
|
+ if (!checkAccessPrivilege(remoteAddress, AccessPrivilege.READ_ONLY)) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_ACCES);
|
|
|
return response;
|
|
|
}
|
|
@@ -1491,9 +1521,17 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
dirStatus.getModificationTime(), dirList);
|
|
|
}
|
|
|
|
|
|
- public READDIRPLUS3Response readdirplus(XDR xdr,
|
|
|
- SecurityHandler securityHandler, InetAddress client) {
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_ONLY)) {
|
|
|
+ @Override
|
|
|
+ public READDIRPLUS3Response readdirplus(XDR xdr, RpcInfo info) {
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
+ SocketAddress remoteAddress = info.remoteAddress();
|
|
|
+ return readdirplus(xdr, securityHandler, remoteAddress);
|
|
|
+ }
|
|
|
+
|
|
|
+ @VisibleForTesting
|
|
|
+ READDIRPLUS3Response readdirplus(XDR xdr, SecurityHandler securityHandler,
|
|
|
+ SocketAddress remoteAddress) {
|
|
|
+ if (!checkAccessPrivilege(remoteAddress, AccessPrivilege.READ_ONLY)) {
|
|
|
return new READDIRPLUS3Response(Nfs3Status.NFS3ERR_ACCES);
|
|
|
}
|
|
|
|
|
@@ -1643,15 +1681,15 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public FSSTAT3Response fsstat(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ public FSSTAT3Response fsstat(XDR xdr, RpcInfo info) {
|
|
|
FSSTAT3Response response = new FSSTAT3Response(Nfs3Status.NFS3_OK);
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_ONLY)) {
|
|
|
+ if (!checkAccessPrivilege(info, AccessPrivilege.READ_ONLY)) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_ACCES);
|
|
|
return response;
|
|
|
}
|
|
|
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_SERVERFAULT);
|
|
@@ -1711,15 +1749,15 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public FSINFO3Response fsinfo(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ public FSINFO3Response fsinfo(XDR xdr, RpcInfo info) {
|
|
|
FSINFO3Response response = new FSINFO3Response(Nfs3Status.NFS3_OK);
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_ONLY)) {
|
|
|
+ if (!checkAccessPrivilege(info, AccessPrivilege.READ_ONLY)) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_ACCES);
|
|
|
return response;
|
|
|
}
|
|
|
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_SERVERFAULT);
|
|
@@ -1769,15 +1807,15 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public PATHCONF3Response pathconf(XDR xdr, SecurityHandler securityHandler,
|
|
|
- InetAddress client) {
|
|
|
+ public PATHCONF3Response pathconf(XDR xdr, RpcInfo info) {
|
|
|
PATHCONF3Response response = new PATHCONF3Response(Nfs3Status.NFS3_OK);
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_ONLY)) {
|
|
|
+ if (!checkAccessPrivilege(info, AccessPrivilege.READ_ONLY)) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_ACCES);
|
|
|
return response;
|
|
|
}
|
|
|
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_SERVERFAULT);
|
|
@@ -1816,9 +1854,11 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public COMMIT3Response commit(XDR xdr, Channel channel, int xid,
|
|
|
- SecurityHandler securityHandler, InetAddress client) {
|
|
|
+ public COMMIT3Response commit(XDR xdr, RpcInfo info) {
|
|
|
+ //Channel channel, int xid,
|
|
|
+ // SecurityHandler securityHandler, InetAddress client) {
|
|
|
COMMIT3Response response = new COMMIT3Response(Nfs3Status.NFS3_OK);
|
|
|
+ SecurityHandler securityHandler = getSecurityHandler(info);
|
|
|
DFSClient dfsClient = clientCache.getDfsClient(securityHandler.getUser());
|
|
|
if (dfsClient == null) {
|
|
|
response.setStatus(Nfs3Status.NFS3ERR_SERVERFAULT);
|
|
@@ -1849,7 +1889,7 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
return new COMMIT3Response(Nfs3Status.NFS3ERR_STALE);
|
|
|
}
|
|
|
|
|
|
- if (!checkAccessPrivilege(client, AccessPrivilege.READ_WRITE)) {
|
|
|
+ if (!checkAccessPrivilege(info, AccessPrivilege.READ_WRITE)) {
|
|
|
return new COMMIT3Response(Nfs3Status.NFS3ERR_ACCES, new WccData(
|
|
|
Nfs3Utils.getWccAttr(preOpAttr), preOpAttr),
|
|
|
Nfs3Constant.WRITE_COMMIT_VERF);
|
|
@@ -1859,8 +1899,10 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
: (request.getOffset() + request.getCount());
|
|
|
|
|
|
// Insert commit as an async request
|
|
|
- writeManager.handleCommit(dfsClient, handle, commitOffset, channel, xid,
|
|
|
- preOpAttr);
|
|
|
+ RpcCall rpcCall = (RpcCall) info.header();
|
|
|
+ int xid = rpcCall.getXid();
|
|
|
+ writeManager.handleCommit(dfsClient, handle, commitOffset,
|
|
|
+ info.channel(), xid, preOpAttr);
|
|
|
return null;
|
|
|
} catch (IOException e) {
|
|
|
LOG.warn("Exception ", e);
|
|
@@ -1885,11 +1927,16 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private SecurityHandler getSecurityHandler(RpcInfo info) {
|
|
|
+ RpcCall rpcCall = (RpcCall) info.header();
|
|
|
+ return getSecurityHandler(rpcCall.getCredential(), rpcCall.getVerifier());
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
public void handleInternal(ChannelHandlerContext ctx, RpcInfo info) {
|
|
|
RpcCall rpcCall = (RpcCall) info.header();
|
|
|
- final NFSPROC3 nfsproc3 = NFSPROC3.fromValue(rpcCall.getProcedure());
|
|
|
+ final NFSPROC3 nfsproc3 = NFSPROC3.fromValue(rpcCall.getProcedure());
|
|
|
int xid = rpcCall.getXid();
|
|
|
byte[] data = new byte[info.data().readableBytes()];
|
|
|
info.data().readBytes(data);
|
|
@@ -1897,9 +1944,8 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
XDR out = new XDR();
|
|
|
InetAddress client = ((InetSocketAddress) info.remoteAddress())
|
|
|
.getAddress();
|
|
|
- Channel channel = info.channel();
|
|
|
-
|
|
|
Credentials credentials = rpcCall.getCredential();
|
|
|
+
|
|
|
// Ignore auth only for NFSPROC3_NULL, especially for Linux clients.
|
|
|
if (nfsproc3 != NFSPROC3.NULL) {
|
|
|
if (credentials.getFlavor() != AuthFlavor.AUTH_SYS
|
|
@@ -1937,27 +1983,24 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- SecurityHandler securityHandler = getSecurityHandler(credentials,
|
|
|
- rpcCall.getVerifier());
|
|
|
-
|
|
|
NFS3Response response = null;
|
|
|
if (nfsproc3 == NFSPROC3.NULL) {
|
|
|
response = nullProcedure();
|
|
|
} else if (nfsproc3 == NFSPROC3.GETATTR) {
|
|
|
- response = getattr(xdr, securityHandler, client);
|
|
|
+ response = getattr(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.SETATTR) {
|
|
|
- response = setattr(xdr, securityHandler, client);
|
|
|
+ response = setattr(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.LOOKUP) {
|
|
|
- response = lookup(xdr, securityHandler, client);
|
|
|
+ response = lookup(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.ACCESS) {
|
|
|
- response = access(xdr, securityHandler, client);
|
|
|
+ response = access(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.READLINK) {
|
|
|
- response = readlink(xdr, securityHandler, client);
|
|
|
+ response = readlink(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.READ) {
|
|
|
if (LOG.isDebugEnabled()) {
|
|
|
LOG.debug(Nfs3Utils.READ_RPC_START + xid);
|
|
|
}
|
|
|
- response = read(xdr, securityHandler, client);
|
|
|
+ response = read(xdr, info);
|
|
|
if (LOG.isDebugEnabled() && (nfsproc3 == NFSPROC3.READ)) {
|
|
|
LOG.debug(Nfs3Utils.READ_RPC_END + xid);
|
|
|
}
|
|
@@ -1965,36 +2008,36 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
if (LOG.isDebugEnabled()) {
|
|
|
LOG.debug(Nfs3Utils.WRITE_RPC_START + xid);
|
|
|
}
|
|
|
- response = write(xdr, channel, xid, securityHandler, client);
|
|
|
+ response = write(xdr, info);
|
|
|
// Write end debug trace is in Nfs3Utils.writeChannel
|
|
|
} else if (nfsproc3 == NFSPROC3.CREATE) {
|
|
|
- response = create(xdr, securityHandler, client);
|
|
|
+ response = create(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.MKDIR) {
|
|
|
- response = mkdir(xdr, securityHandler, client);
|
|
|
+ response = mkdir(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.SYMLINK) {
|
|
|
- response = symlink(xdr, securityHandler, client);
|
|
|
+ response = symlink(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.MKNOD) {
|
|
|
- response = mknod(xdr, securityHandler, client);
|
|
|
+ response = mknod(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.REMOVE) {
|
|
|
- response = remove(xdr, securityHandler, client);
|
|
|
+ response = remove(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.RMDIR) {
|
|
|
- response = rmdir(xdr, securityHandler, client);
|
|
|
+ response = rmdir(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.RENAME) {
|
|
|
- response = rename(xdr, securityHandler, client);
|
|
|
+ response = rename(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.LINK) {
|
|
|
- response = link(xdr, securityHandler, client);
|
|
|
+ response = link(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.READDIR) {
|
|
|
- response = readdir(xdr, securityHandler, client);
|
|
|
+ response = readdir(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.READDIRPLUS) {
|
|
|
- response = readdirplus(xdr, securityHandler, client);
|
|
|
+ response = readdirplus(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.FSSTAT) {
|
|
|
- response = fsstat(xdr, securityHandler, client);
|
|
|
+ response = fsstat(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.FSINFO) {
|
|
|
- response = fsinfo(xdr, securityHandler, client);
|
|
|
+ response = fsinfo(xdr, info);
|
|
|
} else if (nfsproc3 == NFSPROC3.PATHCONF) {
|
|
|
- response = pathconf(xdr, securityHandler, client);
|
|
|
+ response = pathconf(xdr,info);
|
|
|
} else if (nfsproc3 == NFSPROC3.COMMIT) {
|
|
|
- response = commit(xdr, channel, xid, securityHandler, client);
|
|
|
+ response = commit(xdr, info);
|
|
|
} else {
|
|
|
// Invalid procedure
|
|
|
RpcAcceptedReply.getInstance(xid,
|
|
@@ -2027,8 +2070,21 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
|
|
|
return nfsproc3 == null || nfsproc3.isIdempotent();
|
|
|
}
|
|
|
|
|
|
- private boolean checkAccessPrivilege(final InetAddress client,
|
|
|
+ private boolean checkAccessPrivilege(RpcInfo info,
|
|
|
+ final AccessPrivilege expected) {
|
|
|
+ SocketAddress remoteAddress = info.remoteAddress();
|
|
|
+ return checkAccessPrivilege(remoteAddress, expected);
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean checkAccessPrivilege(SocketAddress remoteAddress,
|
|
|
final AccessPrivilege expected) {
|
|
|
+ // Port monitoring
|
|
|
+ if (!doPortMonitoring(remoteAddress)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check export table
|
|
|
+ InetAddress client = ((InetSocketAddress) remoteAddress).getAddress();
|
|
|
AccessPrivilege access = exports.getAccessPrivilege(client);
|
|
|
if (access == AccessPrivilege.NONE) {
|
|
|
return false;
|