49 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Bash
		
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Bash
		
	
	
| #!/bin/sh
 | |
| 
 | |
| VALID_CREDS_FILE=custom-auth.valid
 | |
| CHALLENGE_FILE=custom-auth.challenge
 | |
| 
 | |
| #
 | |
| # If $VALID_CREDS_FILE exists in $HTTPD_ROOT_PATH, consider each line as a valid
 | |
| # credential for the current request. Each line in the file is considered a
 | |
| # valid HTTP Authorization header value. For example:
 | |
| #
 | |
| # Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
 | |
| #
 | |
| # If $CHALLENGE_FILE exists in $HTTPD_ROOT_PATH, output the contents as headers
 | |
| # in a 401 response if no valid authentication credentials were included in the
 | |
| # request. For example:
 | |
| #
 | |
| # WWW-Authenticate: Bearer authorize_uri="id.example.com" p=1 q=0
 | |
| # WWW-Authenticate: Basic realm="example.com"
 | |
| #
 | |
| 
 | |
| if test -n "$HTTP_AUTHORIZATION" && \
 | |
| 	grep -Fqs "creds=${HTTP_AUTHORIZATION}" "$VALID_CREDS_FILE"
 | |
| then
 | |
| 	idno=$(grep -F "creds=${HTTP_AUTHORIZATION}" "$VALID_CREDS_FILE" | sed -e 's/^id=\([a-z0-9-][a-z0-9-]*\) .*$/\1/')
 | |
| 	status=$(sed -ne "s/^id=$idno.*status=\\([0-9][0-9][0-9]\\).*\$/\\1/p" "$CHALLENGE_FILE" | head -n1)
 | |
| 	# Note that although git-http-backend returns a status line, it
 | |
| 	# does so using a CGI 'Status' header. Because this script is an
 | |
| 	# No Parsed Headers (NPH) script, we must return a real HTTP
 | |
| 	# status line.
 | |
| 	# This is only a test script, so we don't bother to check for
 | |
| 	# the actual status from git-http-backend and always return 200.
 | |
| 	echo "HTTP/1.1 $status Nonspecific Reason Phrase"
 | |
| 	if test "$status" -eq 200
 | |
| 	then
 | |
| 		exec "$GIT_EXEC_PATH"/git-http-backend
 | |
| 	else
 | |
| 		sed -ne "s/^id=$idno.*response=//p" "$CHALLENGE_FILE"
 | |
| 		echo
 | |
| 		exit
 | |
| 	fi
 | |
| fi
 | |
| 
 | |
| echo 'HTTP/1.1 401 Authorization Required'
 | |
| if test -f "$CHALLENGE_FILE"
 | |
| then
 | |
| 	sed -ne 's/^id=default.*response=//p' "$CHALLENGE_FILE"
 | |
| fi
 | |
| echo
 |