3504319445d95051951c2cf91c7c7ab0feb9cdf4
[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 $maxage = config('jsonCacheMaxAge');
7 header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $maxage) . ' GMT');
8 header("Cache-Control: maxage=$maxage");
9
10 function exit_with_error($status, $details = array()) {
11     $details['status'] = $status;
12     merge_additional_details($details);
13
14     echo json_encode($details);
15     exit(1);
16 }
17
18 function echo_success($details = array()) {
19     $details['status'] = 'OK';
20     merge_additional_details($details);
21
22     echo json_encode($details);
23 }
24
25 function exit_with_success($details = array()) {
26     echo_success($details);
27     exit(0);
28 }
29
30 $additional_exit_details = array();
31
32 function set_exit_detail($name, $value) {
33     global $additional_exit_details;
34     $additional_exit_details[$name] = $value;
35 }
36
37 function merge_additional_details(&$details) {
38     global $additional_exit_details;
39     foreach ($additional_exit_details as $name => $value) {
40         if (!array_key_exists($name, $details))
41             $details[$name] = $value;
42     }
43 }
44
45 function connect() {
46     $db = new Database;
47     if (!$db->connect())
48         exit_with_error('DatabaseConnectionError');
49     return $db;
50 }
51
52 function camel_case_words_separated_by_underscore($name) {
53     return implode('', array_map('ucfirst', explode('_', $name)));
54 }
55
56 function require_format($key, $value, $pattern) {
57     if (!preg_match($pattern, $value))
58         exit_with_error('Invalid' . camel_case_words_separated_by_underscore($key), array('value' => $value));
59 }
60
61 function require_existence_of($array, $list_of_arguments, $prefix = '') {
62     if ($prefix)
63         $prefix .= '_';
64     foreach ($list_of_arguments as $key => $pattern) {
65         $name = camel_case_words_separated_by_underscore($prefix . $key);
66         if (!array_key_exists($key, $array))
67             exit_with_error($name . 'NotSpecified');
68         require_format($name, $array[$key], $pattern);
69     }
70 }
71
72 function ensure_privileged_api_data() {
73     global $HTTP_RAW_POST_DATA;
74
75     if ($_SERVER['REQUEST_METHOD'] != 'POST')
76         exit_with_error('InvalidRequestMethod');
77
78     if (!isset($HTTP_RAW_POST_DATA))
79         exit_with_error('InvalidRequestContent');
80
81     $data = json_decode($HTTP_RAW_POST_DATA, true);
82
83     if ($data === NULL)
84         exit_with_error('InvalidRequestContent');
85
86     return $data;
87 }
88
89 function ensure_privileged_api_data_and_token() {
90     $data = ensure_privileged_api_data();
91     if (!verify_token(array_get($data, 'token')))
92         exit_with_error('InvalidToken');
93     return $data;
94 }
95
96 function compute_token() {
97     if (!array_key_exists('CSRFSalt', $_COOKIE) || !array_key_exists('CSRFExpiration', $_COOKIE))
98         return NULL;
99     $user = array_get($_SERVER, 'REMOTE_USER');
100     $salt = $_COOKIE['CSRFSalt'];
101     $expiration = $_COOKIE['CSRFExpiration'];
102     return hash('sha256', "$salt|$user|$expiration");
103 }
104
105 function verify_token($token) {
106     $expected_token = compute_token();
107     return $expected_token && $token == $expected_token && $_COOKIE['CSRFExpiration'] > time();
108 }
109
110 ?>