#!/usr/bin/python

# Copyright 2006 Evan Prodromou <evan@prodromou.name>
# Licensed under the Academic Free License version 3.0
# Version 0.1

from sys import argv
from urllib2 import urlopen, URLError
import sha
from HTMLParser import HTMLParser, HTMLParseError

MICROID_BUFFER_SIZE = 4096

def make_microid(comm_url, page_url):
    comhash = sha.new(comm_url)
    pagehash = sha.new(page_url)
    combo = comhash.hexdigest() + pagehash.hexdigest()
    allhash = sha.new(combo)
    return allhash.hexdigest()

class MicroIDFinder(HTMLParser):
    _inHead = 0
    _microid = None

    def handle_starttag(self, tag, attrs):
        if tag.lower() == 'head':
            self._inHead = 1
        elif (self._inHead and tag.lower() == 'meta' and self._getattr(attrs, 'name') == 'microid'):
            self._microid = self._getattr(attrs, 'content')

    def handle_endtag(self, tag):
        if tag.lower() == 'head':
            self._inHead = 0

    def get_microid(self):
        return self._microid

    def _getattr(self, attrs, name):
        for attr in attrs:
            if attr[0] == name:
                return attr[1]
        return None

def fetch_microid(page_url):
    found = None
    finder = MicroIDFinder()
    try:
        uhandle = urlopen(page_url)
        html = uhandle.read(MICROID_BUFFER_SIZE)
        while html:
            finder.feed(html)
            html = uhandle.read(MICROID_BUFFER_SIZE)
        found = finder.get_microid()
    except URLError, ue:
        pass
    except HTMLParseError, he:
        pass
    except ValueError, ve: # from opening a bad URL
        pass
    return found

def verify_microid(comm_url, page_url):
    lookfor = make_microid(comm_url, page_url)
    found = fetch_microid(page_url)
    return found == lookfor

if __name__ == '__main__':
    verify = verify_microid(argv[1], argv[2])
    if verify:
        print "Verified."
    else:
        print "Not verified."

