Validate repository route names

Commit
4ebaabde0740563ffa8d0ea4c3e74f2d66e9c5b1
Author
Marius Peter <dev@marius-peter.com>
Author date
Committer
Marius Peter <dev@marius-peter.com>
Committer date
Changed files
lib/resolvers.ml
index e0b85c3c..e6302956 100644..100644
@@ -4,9 +4,20 @@
4 4 open Lwt_result.Syntax
5 5 open Config
6 6
7 Added: let is_valid_repo_name repo =
8 Added: let invalid_char = function '/' | '\\' | '\x00' -> true | _ -> false in
9 Added: repo <> "" && repo <> "." && repo <> ".."
10 Added: && (not (String.starts_with ~prefix:"." repo))
11 Added: && not (String.exists invalid_char repo)
12 Added:
13 Added: let validate_repo_name repo =
14 Added: if is_valid_repo_name repo then Lwt_result.return repo
15 Added: else Lwt_result.fail (`Msg ("invalid repository name " ^ repo))
16 Added:
7 17 let full_path path = Filename.concat config.git_project_root path
8 18
9 19 let store repo =
20 Added: let* repo = validate_repo_name repo in
10 21 let path = full_path repo |> Fpath.v in
11 22 Store.v ~dotgit:path path
12 23
test/dune
index 7b9beb44..e4a34b1a 100644..100644
@@ -1,2 +1,3 @@
1 1 (test
2 Removed: (name test_ogit))
2 Added: (name test_ogit)
3 Added: (libraries ogit))
test/test_ogit.ml
index e69de29b..81edb95d 100644..100644
@@ -0,0 +1,11 @@
1 Added: let () =
2 Added: assert (Ogit.Resolvers.is_valid_repo_name "project.git");
3 Added: assert (Ogit.Resolvers.is_valid_repo_name "project");
4 Added: assert (not (Ogit.Resolvers.is_valid_repo_name ""));
5 Added: assert (not (Ogit.Resolvers.is_valid_repo_name ".hidden"));
6 Added: assert (not (Ogit.Resolvers.is_valid_repo_name "."));
7 Added: assert (not (Ogit.Resolvers.is_valid_repo_name ".."));
8 Added: assert (not (Ogit.Resolvers.is_valid_repo_name "../outside"));
9 Added: assert (not (Ogit.Resolvers.is_valid_repo_name "nested/repo"));
10 Added: assert (not (Ogit.Resolvers.is_valid_repo_name "nested\\repo"));
11 Added: assert (not (Ogit.Resolvers.is_valid_repo_name "bad\x00repo"))