added hawk.py

This commit is contained in:
jeena 2013-07-23 12:08:18 +02:00
parent 4c4ea8c386
commit 63ecbb13d6

59
hawk.py Normal file
View file

@ -0,0 +1,59 @@
#!/usr/bin/env python2
#
# This module lets you create a header for your Hawk authentification.
#
# Usage:
#
# import hawk
# print hawk.mkheader("https://example.com/foo/bar?baz=bum#test", "get", "1234", "5678", "abcdef")
#
# License: This script is public domain.
# Copyright: 2013 Jeena Paradies
#
import string, random, time, datetime, hmac, hashlib, base64
from urlparse import urlparse
def mkheader(url, http_method, hawk_id, key, app_id=None):
nonce = mknonce(8)
parsed_url = urlparse(url)
n = datetime.datetime.now()
time_stamp = str(time.mktime(n.timetuple()))
port = parsed_url.port
if not port:
if parsed_url.scheme == "https":
port = "443"
else:
port = "80"
fragment = ""
if parsed_url.fragment:
fragment = "#" + parsed_url.fragment
normalized_string = "hawk.1.header\n"\
+ time_stamp + "\n"\
+ nonce + "\n"\
+ http_method.upper() + "\n"\
+ parsed_url.path + parsed_url.query + fragment + "\n"\
+ parsed_url.hostname.lower() + "\n"\
+ str(port) + "\n"\
+ "\n\n" # we don't use payload yet and we don't use ext
app = ""
if app_id:
app = ", app=\"" + app_id + "\"" # we need this later in the header
normalized_string += app_id + "\n\n" # adding app_id to the string and delegate should be empty
mac = base64.encodestring(hmac.new(key, normalized_string, hashlib.sha256).digest())
return 'Hawk id="' + hawk_id + '", mac="' + mac + '", ts="' + time_stamp + '", nonce="' + nonce + '"' + app
def mknonce(length=6, chars=(string.ascii_uppercase + string.digits)):
return ''.join(random.choice(chars) for x in range(length))
if __name__ == "__main__":
print mkheader("https://example.com/foo/bar?baz=bum#test", "get", "1234", "5678", "abcdef")