in sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java [1420:1517]
protected void doRealPath(Buffer buffer, int id) throws IOException {
// do things here.
String path = buffer.getString();
boolean debugEnabled = log.isDebugEnabled();
ServerSession session = getServerSession();
if (debugEnabled) {
log.debug("doRealPath({})[id={}] SSH_FXP_REALPATH (path={})", session, id, path);
}
path = GenericUtils.trimToEmpty(path);
if (GenericUtils.isEmpty(path)) {
path = ".";
}
Map<String, ?> attrs = Collections.emptyMap();
Map.Entry<Path, Boolean> result;
try {
int version = getVersion();
if (version < SftpConstants.SFTP_V6) {
/*
* See http://www.openssh.com/txt/draft-ietf-secsh-filexfer-02.txt:
*
* The SSH_FXP_REALPATH request can be used to have the server canonicalize any given path name to an
* absolute path.
*
* See also SSHD-294
*/
Path p = resolveFile(path);
LinkOption[] options = getPathResolutionLinkOption(SftpConstants.SSH_FXP_REALPATH, "", p);
result = doRealPathV345(id, path, p, options);
} else {
/*
* See https://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.9
*
* This field is optional, and if it is not present in the packet, it is assumed to be
* SSH_FXP_REALPATH_NO_CHECK.
*/
int control = SftpConstants.SSH_FXP_REALPATH_NO_CHECK;
if (buffer.available() > 0) {
control = buffer.getUByte();
if (debugEnabled) {
log.debug("doRealPath({}) - control=0x{} for path={}",
session, Integer.toHexString(control), path);
}
}
Collection<String> extraPaths = new LinkedList<>();
while (buffer.available() > 0) {
extraPaths.add(buffer.getString());
}
Path p = resolveFile(path);
LinkOption[] options = getPathResolutionLinkOption(SftpConstants.SSH_FXP_REALPATH, "", p);
result = doRealPathV6(id, path, extraPaths, p, options);
p = result.getKey();
Boolean status = result.getValue();
switch (control) {
case SftpConstants.SSH_FXP_REALPATH_STAT_IF:
if (status == null) {
attrs = handleUnknownStatusFileAttributes(
p, SftpConstants.SSH_FILEXFER_ATTR_ALL, options);
} else if (status) {
try {
attrs = getAttributes(p, options);
} catch (IOException e) {
debug("doRealPath({}) - failed ({}) to retrieve attributes of {}: {}",
session, e.getClass().getSimpleName(), p, e.getMessage(), e);
}
} else {
if (debugEnabled) {
log.debug("doRealPath({}) - dummy attributes for non-existing file: {}", session, p);
}
}
break;
case SftpConstants.SSH_FXP_REALPATH_STAT_ALWAYS:
if (status == null) {
attrs = handleUnknownStatusFileAttributes(
p, SftpConstants.SSH_FILEXFER_ATTR_ALL, options);
} else if (status) {
attrs = getAttributes(p, options);
} else {
throw new NoSuchFileException(p.toString(), p.toString(), "Real path N/A for target");
}
break;
case SftpConstants.SSH_FXP_REALPATH_NO_CHECK:
break;
default:
log.warn("doRealPath({}) unknown control value 0x{} for path={}",
session, Integer.toHexString(control), p);
}
}
} catch (IOException | RuntimeException e) {
sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_REALPATH, path);
return;
}
sendPath(prepareReply(buffer), id, result.getKey(), attrs);
}