summaryrefslogtreecommitdiff
path: root/bin/swift-form-signature
blob: 91c76699f01d4d1c85b8ccabb04bf53d8a5c7528 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/usr/bin/env python
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import hmac
from hashlib import sha1
from os.path import basename
from sys import argv, exit
from time import time


if __name__ == '__main__':
    if len(argv) != 7:
        prog = basename(argv[0])
        print 'Syntax: %s <path> <redirect> <max_file_size> ' \
              '<max_file_count> <seconds> <key>' % prog
        print
        print 'Where:'
        print '  <path>            The prefix to use for form uploaded'
        print '                    objects. For example:'
        print '                    /v1/account/container/object_prefix_ would'
        print '                    ensure all form uploads have that path'
        print '                    prepended to the browser-given file name.'
        print '  <redirect>        The URL to redirect the browser to after'
        print '                    the uploads have completed.'
        print '  <max_file_size>   The maximum file size per file uploaded.'
        print '  <max_file_count>  The maximum number of uploaded files'
        print '                    allowed.'
        print '  <seconds>         The number of seconds from now to allow'
        print '                    the form post to begin.'
        print '  <key>             The X-Account-Meta-Temp-URL-Key for the'
        print '                    account.'
        print
        print 'Example output:'
        print '    Expires: 1323842228'
        print '  Signature: 18de97e47345a82c4dbfb3b06a640dbb'
        exit(1)
    path, redirect, max_file_size, max_file_count, seconds, key = argv[1:]
    try:
        max_file_size = int(max_file_size)
    except ValueError:
        max_file_size = -1
    if max_file_size < 0:
        print 'Please use a <max_file_size> value greater than or equal to 0.'
        exit(1)
    try:
        max_file_count = int(max_file_count)
    except ValueError:
        max_file_count = 0
    if max_file_count < 1:
        print 'Please use a positive <max_file_count> value.'
        exit(1)
    try:
        expires = int(time() + int(seconds))
    except ValueError:
        expires = 0
    if expires < 1:
        print 'Please use a positive <seconds> value.'
        exit(1)
    parts = path.split('/', 4)
    # Must be four parts, ['', 'v1', 'a', 'c'], must be a v1 request, have
    # account and container values, and optionally have an object prefix.
    if len(parts) < 4 or parts[0] or parts[1] != 'v1' or not parts[2] or \
            not parts[3]:
        print '<path> must point to a container at least.'
        print 'For example: /v1/account/container'
        print '         Or: /v1/account/container/object_prefix'
        exit(1)
    sig = hmac.new(key, '%s\n%s\n%s\n%s\n%s' % (path, redirect, max_file_size,
                                                max_file_count, expires),
                   sha1).hexdigest()
    print '  Expires:', expires
    print 'Signature:', sig