~tribaal/txaws/xss-hardening

« back to all changes in this revision

Viewing changes to txaws/storage/client.py

  • Committer: Tristan Seligmann
  • Date: 2009-04-27 23:53:32 UTC
  • mfrom: (3.1.5 client)
  • Revision ID: mithrandi@mithrandi.net-20090427235332-l8azkl1kvn5pjtay
mergeĀ lp:~lifeless/txaws/client

Show diffs side-by-side

added added

removed removed

Lines of Context:
8
8
"""
9
9
 
10
10
 
11
 
import md5, hmac, sha
 
11
from hashlib import md5
12
12
from base64 import b64encode
13
13
 
14
 
try:
15
 
    from xml.etree.ElementTree import XML
16
 
except ImportError:
17
 
    from elementtree.ElementTree import XML
18
14
 
19
15
from epsilon.extime import Time
20
16
 
21
17
from twisted.web.client import getPage
22
18
from twisted.web.http import datetimeToString
23
19
 
 
20
from txaws.credentials import AWSCredentials
 
21
from txaws.util import XML
 
22
 
24
23
 
25
24
def calculateMD5(data):
26
 
    digest = md5.new(data).digest()
27
 
    return b64encode(digest)
28
 
 
29
 
 
30
 
def hmac_sha1(secret, data):
31
 
    digest = hmac.new(secret, data, sha).digest()
 
25
    digest = md5(data).digest()
32
26
    return b64encode(digest)
33
27
 
34
28
 
35
29
class S3Request(object):
36
30
    def __init__(self, verb, bucket=None, objectName=None, data='',
37
31
            contentType=None, metadata={}, rootURI='https://s3.amazonaws.com',
38
 
            accessKey=None, secretKey=None):
 
32
            creds=None):
39
33
        self.verb = verb
40
34
        self.bucket = bucket
41
35
        self.objectName = objectName
43
37
        self.contentType = contentType
44
38
        self.metadata = metadata
45
39
        self.rootURI = rootURI
46
 
        self.accessKey = accessKey
47
 
        self.secretKey = secretKey
 
40
        self.creds = creds
48
41
        self.date = datetimeToString()
49
42
 
50
 
        if (accessKey is not None and secretKey is None) or (accessKey is None and secretKey is not None):
51
 
            raise ValueError('Must provide both accessKey and secretKey, or neither')
52
 
 
53
43
    def getURIPath(self):
54
44
        path = '/'
55
45
        if self.bucket is not None:
72
62
        if self.contentType is not None:
73
63
            headers['Content-Type'] = self.contentType
74
64
 
75
 
        if self.accessKey is not None:
 
65
        if self.creds is not None:
76
66
            signature = self.getSignature(headers)
77
 
            headers['Authorization'] = 'AWS %s:%s' % (self.accessKey, signature)
 
67
            headers['Authorization'] = 'AWS %s:%s' % (self.creds.access_key, signature)
78
68
 
79
69
        return headers
80
70
 
94
84
        text += headers.get('Date', '') + '\n'
95
85
        text += self.getCanonicalizedAmzHeaders(headers)
96
86
        text += self.getCanonicalizedResource()
97
 
        return hmac_sha1(self.secretKey, text)
 
87
        return self.creds.sign(text)
98
88
 
99
89
    def submit(self):
100
90
        return self.getPage(url=self.getURI(), method=self.verb, postdata=self.data, headers=self.getHeaders())
109
99
    rootURI = 'https://s3.amazonaws.com/'
110
100
    requestFactory = S3Request
111
101
 
112
 
    def __init__(self, accessKey, secretKey):
113
 
        self.accessKey = accessKey
114
 
        self.secretKey = secretKey
 
102
    def __init__(self, creds):
 
103
        self.creds = creds
115
104
 
116
105
    def makeRequest(self, *a, **kw):
117
106
        """
120
109
        This uses the requestFactory attribute, adding the credentials to the
121
110
        arguments passed in.
122
111
        """
123
 
        return self.requestFactory(accessKey=self.accessKey, secretKey=self.secretKey, *a, **kw)
 
112
        return self.requestFactory(creds=self.creds, *a, **kw)
124
113
 
125
114
    def _parseBucketList(self, response):
126
115
        """