#!/usr/bin/env python3

from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import parse_qsl


_HTML_FORM_TEMPLATE = """
<!DOCTYPE html>
<html>
<head>
  <title>Decryption</title>
  <style>
    body {{ text-align: center; padding: 150px; }}
    h1 {{ font-size: 50px; }}
    body {{ font: 20px Helvetica, sans-serif; color: #333; }}
    article {{ display: block; text-align: center; width: 650px; margin: 0 auto;}}
    input {{
      padding: 12px 20px;
      margin: 8px 0;
      box-sizing: border-box;
      border: 1px solid #ccc;
    }}
    input[type=password] {{
      width: 75%;
      font-size: 24px;
    }}
    input[type=submit] {{
      cursor: pointer;
      width: 75%;
    }}
    input[type=submit]:hover {{
      background-color: #d9d9d9;
    }}
  </style>
</head>
<body>
  <article>
      <h1>Decryption</h1>
      <p>Some of your files are encrypted.</p>
      <p>Please provide the decryption password.</p>
      <div>
        <form action="/set-password" method="POST">
          {password_fields}
          <input type="submit" value="Submit">
        </form>
      </div>
  </article>
</body>
</html>
"""

POST_RESPONSE = """
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
/* Center the loader */
#loader {
  position: absolute;
  left: 50%;
  top: 50%;
  z-index: 1;
  width: 150px;
  height: 150px;
  margin: -75px 0 0 -75px;
  border: 16px solid #f3f3f3;
  border-radius: 50%;
  border-top: 16px solid #3498db;
  width: 120px;
  height: 120px;
  -webkit-animation: spin 2s linear infinite;
  animation: spin 2s linear infinite;
}

@-webkit-keyframes spin {
  0% { -webkit-transform: rotate(0deg); }
  100% { -webkit-transform: rotate(360deg); }
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

#myDiv {
  display: none;
  text-align: center;
}
</style>
<script type="text/javascript">

function checkPwnagotchi() {
    var target = 'http://' + document.location.hostname + ':8080/';
    var xhr = new XMLHttpRequest();
    xhr.open('GET', target);
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            if (xhr.status == 200 || xhr.status == 401) {
                window.location.replace(target);
            }else{
                setTimeout(checkPwnagotchi, 1000);
            }
        }
    };
    xhr.send();
}

setTimeout(checkPwnagotchi, 1000);

</script>
</head>
<body style="margin:0;">

<div id="loader"></div>

</body>
</html>
"""

HTML_FORM = None

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(HTML_FORM.encode())

    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        body = self.rfile.read(content_length)
        for mapping, password in parse_qsl(body.decode('UTF-8')):
            with open('/tmp/.pwnagotchi-secret-{}'.format(mapping), 'wt') as pwfile:
                pwfile.write(password)
        self.send_response(200)
        self.end_headers()
        self.wfile.write(POST_RESPONSE.encode())


with open('/root/.pwnagotchi-crypted') as crypted_file:
    mappings = [line.split()[0] for line in crypted_file.readlines()]
    fields = ''.join(['<label for="{m}">Passphrase for {m}:</label>\n<input type="password" id="{m}" name="{m}" value=""><br>'.format(m=m)
              for m in mappings])
    HTML_FORM = _HTML_FORM_TEMPLATE.format(password_fields=fields)

httpd = HTTPServer(('0.0.0.0', 80), SimpleHTTPRequestHandler)
httpd.serve_forever()