source: trunk/website/scripts/BuildServer.php @ 2385

Revision 2385, 1.8 KB checked in by lowjoel, 3 years ago (diff)

Added the HTTP Digest Authentication bit for registering builds done by build slaves.

Line 
1<?php
2
3//HTTP Digest authentication code, modified from http://php.net/manual/en/features.http-auth.php
4define('HTTP_DIGEST_REALM', 'Build Server');
5
6//Function to challenge the user
7function http_digest_challenge() {
8    header('HTTP/1.1 401 Unauthorized');
9    header(sprintf('WWW-Authenticate: Digest realm="%s",qop="auth",nonce="%s",opaque="%s"',
10        HTTP_DIGEST_REALM, uniqid(), md5(HTTP_DIGEST_REALM)));
11    exit;
12}
13
14//Function to parse the HTTP auth header
15function http_digest_parse($txt) {
16    // protect against missing data
17    $needed_parts = array('nonce' => 1,
18        'nc' => 1,
19        'cnonce' => 1,
20        'qop' => 1,
21        'username' => 1,
22        'uri' => 1,
23        'response' => 1
24    );
25    $data = array();
26
27    preg_match_all('@(\w+)=(?:(?:\'([^\']+)\'|"([^"]+)")|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);
28
29    foreach ($matches as $m)
30    {
31        $data[$m[1]] = $m[2] ? $m[2] : ($m[3] ? $m[3] : $m[4]);
32        unset($needed_parts[$m[1]]);
33    }
34
35    return $needed_parts ? false : $data;
36}
37
38//user => password
39$users = array('admin' => 'mypass', 'guest' => 'guest');
40
41//Challenge the client if we did not receive the digest
42if (empty($_SERVER['PHP_AUTH_DIGEST']))
43    http_digest_challenge();
44
45//Analyze the PHP_AUTH_DIGEST variable
46$credentials = http_digest_parse($_SERVER['PHP_AUTH_DIGEST']);
47if (!$credentials || !isset($users[$credentials['username']]))
48    http_digest_challenge();
49
50//Check the response
51$A1 = md5($credentials['username'] . ':' . HTTP_DIGEST_REALM . ':' . $users[$credentials['username']]);
52$A2 = md5($_SERVER['REQUEST_METHOD'] . ':' . $credentials['uri']);
53$valid_response = md5($A1 . ':' . $credentials['nonce'] . ':' . $credentials['nc'] . ':' .
54        $credentials['cnonce'] . ':' . $credentials['qop'] . ':' . $A2);
55if ($credentials['response'] != $valid_response)
56    http_digest_challenge();
57
58
59?>
Note: See TracBrowser for help on using the repository browser.