1911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski<?php
2911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski# Copyright (C) 2010 The Android Open Source Project
3911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski#
4911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski# Licensed under the Apache License, Version 2.0 (the "License");
5911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski# you may not use this file except in compliance with the License.
6911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski# You may obtain a copy of the License at
7911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski#
8911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski# http://www.apache.org/licenses/LICENSE-2.0
9911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski#
10911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski# Unless required by applicable law or agreed to in writing, software
11911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski# distributed under the License is distributed on an "AS IS" BASIS,
12911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski# See the License for the specific language governing permissions and
14911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski# limitations under the License.
15911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
16911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski###############################################################################
17911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
18911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski# Lists the content of the LayoutTests directory
19911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski#
20911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski# Usage:
21fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski#   get_layout_tests_dir_contents.php?path=PATH&recurse=RECURSE&separator=SEPARATOR&mode=MODE
22911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski#   where
23911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski#     PATH - relative path in the LayoutTests dir
24fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski#     RECURSE = [true|false] (defaults to true)
25911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski#     SEPARATOR = a string separating paths in result (defaults to \n)
26fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski#     MODE = [folders|files] (defaults to files) - if 'folders' then lists only folders,
27fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski#                                                  if 'files' then only files
28911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
295a45899b92b919e9315351e9e19a8507a9f871b7Steve Block  # The server document root is LayoutTests/http/tests. See run_apache2.py.
305a45899b92b919e9315351e9e19a8507a9f871b7Steve Block  $rootDir = realpath($_SERVER['DOCUMENT_ROOT'] . '..' . DIRECTORY_SEPARATOR . '..');
31911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
32911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski  function getAbsolutePath($relPath) {
33911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski    global $rootDir;
34911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski    return $rootDir . DIRECTORY_SEPARATOR . $relPath;
35911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski  }
36911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
37911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski  function getFilesAsArray($relPath) {
38911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski    return array_slice(scandir(getAbsolutePath($relPath)), 2);
39911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski  }
40911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
41911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski  function isIgnored($basename) {
42911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski    return substr($basename, 0, 1) == '.';
43911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski  }
44911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
45fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski  function getAllFilesUnderAsArray($relPath, $recurse, $mode) {
46911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski    $files = getFilesAsArray($relPath);
47911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski    $result = array();
48911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
49911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski    foreach($files as $i => $value) {
50911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski      if (isIgnored($value)) {
51911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski        continue;
52911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski      }
53911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski      if ($relPath == '') {
54911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski        $filePath = $value;
55911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski      } else {
56911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski        $filePath = $relPath . DIRECTORY_SEPARATOR . $value;
57911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski      }
58911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
59fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski      if (is_dir(getAbsolutePath($filePath))) {
60fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski        if ($mode == 'folders') {
61fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski          $result = array_merge($result, (array)$filePath);
62fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski        }
63fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski        if ($recurse) {
64fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski          $result = array_merge($result, getAllFilesUnderAsArray($filePath, $recurse, $mode));
65fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski        }
66fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski      } else if ($mode == 'files') {
67911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski        $result = array_merge($result, (array)$filePath);
68911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski      }
69911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski    }
70911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
71911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski    return $result;
72911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski  }
73911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
74fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski  function main() {
75fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski    global $rootDir;
76911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
77fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski    if (!isset($_GET['separator'])) {
78fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski      $separator = "\n";
79fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski    } else {
80fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski      $separator = $_GET['separator'];
81fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski    }
82911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
83fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski    $recurse = (strtolower($_GET['recurse']) != 'false');
84911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
85fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski    if (strtolower($_GET['mode']) == 'folders') {
86fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski      $mode = 'folders';
87fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski    } else {
88fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski      $mode = 'files';
89fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski    }
90911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski
915a45899b92b919e9315351e9e19a8507a9f871b7Steve Block    # Very primitive check if path tries to go above DOCUMENT_ROOT or is absolute
927a4fb00a8a53cbb836c3b7730ec1836a38f3c9beSteve Block    $path = $_GET['path'];
937a4fb00a8a53cbb836c3b7730ec1836a38f3c9beSteve Block    if (strpos($path, "..") !== False ||
947a4fb00a8a53cbb836c3b7730ec1836a38f3c9beSteve Block        substr($path, 0, 1) == DIRECTORY_SEPARATOR) {
95fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski      return;
96fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski    }
97fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski
985a45899b92b919e9315351e9e19a8507a9f871b7Steve Block    # If we don't want realpath to append any prefixes we need to pass it an absolute path
997a4fb00a8a53cbb836c3b7730ec1836a38f3c9beSteve Block    $relPath = substr(realpath(getAbsolutePath($path)), strlen($rootDir) + 1);
1007a4fb00a8a53cbb836c3b7730ec1836a38f3c9beSteve Block
1017a4fb00a8a53cbb836c3b7730ec1836a38f3c9beSteve Block    # If the path is not found, return nothing.
1027a4fb00a8a53cbb836c3b7730ec1836a38f3c9beSteve Block    if ($path !== "" && $relPath == "")
1037a4fb00a8a53cbb836c3b7730ec1836a38f3c9beSteve Block      return;
104fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski
1055a45899b92b919e9315351e9e19a8507a9f871b7Steve Block    # If there is an error of some sort it will be output as a part of the answer!
106fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski    foreach (getAllFilesUnderAsArray($relPath, $recurse, $mode) as $i => $value) {
107fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski      echo "$value$separator";
108fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski    }
109911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski  }
110fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski
111fae1cffa2447a0af2d3142ad0d351ef8935ef600Maksymilian Osowski  main();
112911cbadd2256cdae7cab6eba74ff97cd115f260dMaksymilian Osowski?>
113