public Repository createRepository(final Project.NameKey name) throws RepositoryNotFoundException { if (isUnreasonableName(name)) { throw new RepositoryNotFoundException("Invalid name: " + name); } try { File dir = FileKey.resolve(gitDirOf(name), FS.DETECTED); FileKey loc; if (dir != null) { // Already exists on disk, use the repository we found. // loc = FileKey.exact(dir, FS.DETECTED); } else { // It doesn't exist under any of the standard permutations // of the repository name, so prefer the standard bare name. // String n = name.get(); if (!n.endsWith(Constants.DOT_GIT_EXT)) { n = n + Constants.DOT_GIT_EXT; } loc = FileKey.exact(new File(basePath, n), FS.DETECTED); } return RepositoryCache.open(loc, false); } catch (IOException e1) { final RepositoryNotFoundException e2; e2 = new RepositoryNotFoundException("Cannot open repository " + name); e2.initCause(e1); throw e2; } }
private boolean isUnreasonableName(final Project.NameKey nameKey) { final String name = nameKey.get(); if (name.length() == 0) return true; // no empty paths if (name.indexOf('\\') >= 0) return true; // no windows/dos stlye paths if (name.charAt(0) == '/') return true; // no absolute paths if (new File(name).isAbsolute()) return true; // no absolute paths if (name.startsWith("../")) return true; // no "l../etc/passwd" if (name.contains("/../")) return true; // no "foo/../etc/passwd" if (name.contains("/./")) return true; // "foo/./foo" is insane to ask if (name.contains("//")) return true; // windows UNC path can be "//..." return false; // is a reasonable name }
private File gitDirOf(Project.NameKey name) { return new File(getBasePath(), name.get()); }