#!/usr/bin/env python
#
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
""" Test server for testing Negotiate Authorization

This is a minimal dummy server for testing HTTP Negotiate Authorization.
It is currently only used for manual testing.

To use:
- Start on host.
- Use chrome://inspect to forward port 8080 from the target device to
the host.
- From Chrome on the target connect to localhost:8080.
- If HTTP Negotiate is working correctly the page should load as
"Talked to SPNEGO Authenticator"

Please see //tools/android/kerberos/README.md for detailed instructions.

"""

# TODO(dgn) Replace with an EmbeddedTestServer based server in the test apk once
# the java version is ready. See http://crbug.com/488192


import time
import BaseHTTPServer


HOST_NAME = 'localhost'
PORT_NUMBER = 8080

SUCCESS_HTML = ('<html><head>'
                '<title>SPNEGO Negotiation completed!</title>'
                '</head><body>'
                '<p><b><big>Talked to SPNEGO Authenticator</big></b></p>'
                '</body></html>')

FAILURE_HTML = ('<html><head>'
                '<title>Not Authorized</title>'
                '</head><body>'
                '<p><big>Did not talk to SPNEGO Authenticator</big></p>'
                '</body></html>')

WRONG_HEADER_HTML = ('<html><head>'
                     '<title>Not Authorized</title>'
                     '</head><body>'
                     '<p><big>Bad header value. Found "%s"</big></p>'
                     '</body></html>')


class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  def do_HEAD(self):
    self.send_response(401, 'negotiate')
    self.send_header('WWW-Authenticate', 'negotiate')
    self.end_headers()

  def do_GET(self):
    """Respond to a GET request."""
    print('Path: ' + self.path)
    print(self.headers)
    auth_header = self.headers.getheader('Authorization')

    if not auth_header:
      self.send_response(401)
      self.send_header('WWW-Authenticate', 'negotiate')
      self.send_header('Content-type', 'text/html')
      self.end_headers()
      self.wfile.write(FAILURE_HTML)
    elif not auth_header.startswith('Negotiate '):
      self.send_response(403)
      self.send_header('Content-type', 'text/html')
      self.end_headers()
      self.wfile.write(WRONG_HEADER_HTML % auth_header)
    else:
      self.send_response(200)
      self.send_header('Content-type', 'text/html')
      self.end_headers()
      self.wfile.write(SUCCESS_HTML)


if __name__ == '__main__':
  server_class = BaseHTTPServer.HTTPServer
  httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)
  print('%s Server Starts - %s:%s' % (time.asctime(), HOST_NAME, PORT_NUMBER))
  try:
    httpd.serve_forever()
  except KeyboardInterrupt:
    pass
  httpd.server_close()
  print('%s Server Stops - %s:%s' % (time.asctime(), HOST_NAME, PORT_NUMBER))
