/** * Set the base directory of persistent databases, unless the database is in the user home folder * (~). * * @param dir the new base directory */ public void setBaseDir(String dir) { if (persistent) { String absDir = FileUtils.unwrap(FileUtils.toRealPath(dir)); boolean absolute = FileUtils.isAbsolute(name); String n; String prefix = null; if (dir.endsWith(SysProperties.FILE_SEPARATOR)) { dir = dir.substring(0, dir.length() - 1); } if (absolute) { n = name; } else { n = FileUtils.unwrap(name); prefix = name.substring(0, name.length() - n.length()); // 比如nio:./test,此时prefix就是"nio:" n = dir + SysProperties.FILE_SEPARATOR + n; } String normalizedName = FileUtils.unwrap(FileUtils.toRealPath(n)); if (normalizedName.equals(absDir) || !normalizedName.startsWith(absDir)) { // database name matches the baseDir or // database name is clearly outside of the baseDir throw DbException.get(ErrorCode.IO_EXCEPTION_1, normalizedName + " outside " + absDir); } if (absDir.endsWith("/") || absDir.endsWith("\\")) { // no further checks are needed for C:/ and similar } else if (normalizedName.charAt(absDir.length()) != '/') { // database must be within the directory // (with baseDir=/test, the database name must not be // /test2/x and not /test2) throw DbException.get(ErrorCode.IO_EXCEPTION_1, normalizedName + " outside " + absDir); } if (!absolute) { // 可能是个bug,应该用absDir替换dir, // 否则当设置了baseDir时,还是不能用没有jdbc:h2:mydb这样的url, // 但是在getName()中还是抛错,并且错误信息提示设置baseDir name = prefix + dir + SysProperties.FILE_SEPARATOR + FileUtils.unwrap(name); } } }