[OCaml] Mobile-friendly clone of cgit.
Validate repository route names
Changed files
lib/resolvers.ml
@@ -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
@@ -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
@@ -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"))