Cache-control should be set only on api/runs
[WebKit-https.git] / Websites / perf.webkit.org / public / include / json-header.php
1 <?php
2
3 require_once('db.php');
4
5 header('Content-type: application/json');
6
7 function exit_with_error($status, $details = array()) {
8     $details['status'] = $status;
9     merge_additional_details($details);
10
11     echo json_encode($details);
12     exit(1);
13 }
14
15 function echo_success($details = array()) {
16     $details['status'] = 'OK';
17     merge_additional_details($details);
18
19     echo json_encode($details);
20 }
21
22 function exit_with_success($details = array()) {
23     echo_success($details);
24     exit(0);
25 }
26
27 $additional_exit_details = array();
28
29 function set_exit_detail($name, $value) {
30     global $additional_exit_details;
31     $additional_exit_details[$name] = $value;
32 }
33
34 function merge_additional_details(&$details) {
35     global $additional_exit_details;
36     foreach ($additional_exit_details as $name => $value) {
37         if (!array_key_exists($name, $details))
38             $details[$name] = $value;
39     }
40 }
41
42 function connect() {
43     $db = new Database;
44     if (!$db->connect())
45         exit_with_error('DatabaseConnectionError');
46     return $db;
47 }
48
49 function camel_case_words_separated_by_underscore($name) {
50     return implode('', array_map('ucfirst', explode('_', $name)));
51 }
52
53 function require_format($name, $value, $pattern) {
54     if (!preg_match($pattern, $value))
55         exit_with_error('Invalid' . $name, array('value' => $value));
56 }
57
58 function require_existence_of($array, $list_of_arguments, $prefix = '') {
59     if ($prefix)
60         $prefix .= '_';
61     foreach ($list_of_arguments as $key => $pattern) {
62         $name = camel_case_words_separated_by_underscore($prefix . $key);
63         if (!array_key_exists($key, $array))
64             exit_with_error($name . 'NotSpecified');
65         require_format($name, $array[$key], $pattern);
66     }
67 }
68
69 function ensure_privileged_api_data() {
70     global $HTTP_RAW_POST_DATA;
71
72     if ($_SERVER['REQUEST_METHOD'] != 'POST')
73         exit_with_error('InvalidRequestMethod');
74
75     if (!isset($HTTP_RAW_POST_DATA))
76         exit_with_error('InvalidRequestContent');
77
78     $data = json_decode($HTTP_RAW_POST_DATA, true);
79
80     if ($data === NULL)
81         exit_with_error('InvalidRequestContent');
82
83     return $data;
84 }
85
86 function ensure_privileged_api_data_and_token() {
87     $data = ensure_privileged_api_data();
88     if (!verify_token(array_get($data, 'token')))
89         exit_with_error('InvalidToken');
90     return $data;
91 }
92
93 function remote_user_name() {
94     return array_get($_SERVER, 'REMOTE_USER');
95 }
96
97 function compute_token() {
98     if (!array_key_exists('CSRFSalt', $_COOKIE) || !array_key_exists('CSRFExpiration', $_COOKIE))
99         return NULL;
100     $user = remote_user_name();
101     $salt = $_COOKIE['CSRFSalt'];
102     $expiration = $_COOKIE['CSRFExpiration'];
103     return hash('sha256', "$salt|$user|$expiration");
104 }
105
106 function verify_token($token) {
107     $expected_token = compute_token();
108     return $expected_token && $token == $expected_token && $_COOKIE['CSRFExpiration'] > time();
109 }
110
111 function verify_slave($db, $params) {
112     array_key_exists('slaveName', $params) or exit_with_error('MissingSlaveName');
113     array_key_exists('slavePassword', $params) or exit_with_error('MissingSlavePassword');
114
115     $slave_info = array(
116         'name' => $params['slaveName'],
117         'password_hash' => hash('sha256', $params['slavePassword'])
118     );
119
120     $matched_slave = $db->select_first_row('build_slaves', 'slave', $slave_info);
121     if (!$matched_slave)
122         exit_with_error('SlaveNotFound', array('name' => $slave_info['name']));
123 }
124
125 ?>