Completed
Pull Request — master (#228)
by r
04:17
created

Auth::uploadToken()   B

Complexity

Conditions 4
Paths 8

Size

Total Lines 30
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 4.0218

Importance

Changes 0
Metric Value
cc 4
eloc 21
nc 8
nop 6
dl 0
loc 30
ccs 16
cts 18
cp 0.8889
crap 4.0218
rs 8.5806
c 0
b 0
f 0
1
<?php
2
namespace Qiniu;
3
4
use Qiniu\Zone;
5
6
final class Auth
7
{
8
    private $accessKey;
9
    private $secretKey;
10
11
    public function __construct($accessKey, $secretKey)
12
    {
13
        $this->accessKey = $accessKey;
14
        $this->secretKey = $secretKey;
15
    }
16
17 6
    public function getAccessKey()
18
    {
19 6
        return $this->accessKey;
20
    }
21
22 93
    public function sign($data)
23
    {
24 93
        $hmac = hash_hmac('sha1', $data, $this->secretKey, true);
25 93
        return $this->accessKey . ':' . \Qiniu\base64_urlSafeEncode($hmac);
26
    }
27
28 24
    public function signWithData($data)
29
    {
30 24
        $encodedData = \Qiniu\base64_urlSafeEncode($data);
31 24
        return $this->sign($encodedData) . ':' . $encodedData;
32
    }
33
34 54
    public function signRequest($urlString, $body, $contentType = null)
35
    {
36 54
        $url = parse_url($urlString);
37 54
        $data = '';
38 54
        if (array_key_exists('path', $url)) {
39 51
            $data = $url['path'];
40 51
        }
41 54
        if (array_key_exists('query', $url)) {
42 6
            $data .= '?' . $url['query'];
43 6
        }
44 54
        $data .= "\n";
45
46 54
        if ($body !== null && $contentType === 'application/x-www-form-urlencoded') {
47 24
            $data .= $body;
48 24
        }
49 54
        return $this->sign($data);
50
    }
51
52
    public function verifyCallback($contentType, $originAuthorization, $url, $body)
53
    {
54
        $authorization = 'QBox ' . $this->signRequest($url, $body, $contentType);
55
        return $originAuthorization === $authorization;
56
    }
57
58 12
    public function privateDownloadUrl($baseUrl, $expires = 3600)
59
    {
60 12
        $deadline = time() + $expires;
61
62 12
        $pos = strpos($baseUrl, '?');
63 12
        if ($pos !== false) {
64 9
            $baseUrl .= '&e=';
65 9
        } else {
66 3
            $baseUrl .= '?e=';
67
        }
68 12
        $baseUrl .= $deadline;
69
70 12
        $token = $this->sign($baseUrl);
71 12
        return "$baseUrl&token=$token";
72
    }
73
74 21
    public function uploadToken(
75
        $bucket,
76
        $key = null,
77
        $expires = 3600,
78
        $policy = null,
79
        $strictPolicy = true,
80
        Zone $zone = null
81
    ) {
82 21
        $deadline = time() + $expires;
83 21
        $scope = $bucket;
84 21
        if ($key !== null) {
85 15
            $scope .= ':' . $key;
86 15
        }
87
88 21
        $args = self::copyPolicy($args, $policy, $strictPolicy);
89 21
        $args['scope'] = $scope;
90 21
        $args['deadline'] = $deadline;
91
92 21
        if ($zone === null) {
93 21
            $zone = new Zone();
94 21
        }
95
96 21
        list($upHosts, $err) = $zone->getUpHosts($this->accessKey, $bucket);
97 21
        if ($err === null) {
98
            $args['upHosts'] = $upHosts;
99
        }
100
        
101 21
        $b = json_encode($args);
102 21
        return $this->signWithData($b);
103
    }
104
105
    /**
106
     *上传策略,参数规格详见
107
     *http://developer.qiniu.com/docs/v6/api/reference/security/put-policy.html
108
     */
109
    private static $policyFields = array(
110
        'callbackUrl',
111
        'callbackBody',
112
        'callbackHost',
113
        'callbackBodyType',
114
        'callbackFetchKey',
115
116
        'returnUrl',
117
        'returnBody',
118
119
        'endUser',
120
        'saveKey',
121
        'insertOnly',
122
123
        'detectMime',
124
        'mimeLimit',
125
        'fsizeMin',
126
        'fsizeLimit',
127
128
        'persistentOps',
129
        'persistentNotifyUrl',
130
        'persistentPipeline',
131
        
132
        'deleteAfterDays',
133
        'fileType',
134
135
        'upHosts',
136
    );
137
138 21
    private static function copyPolicy(&$policy, $originPolicy, $strictPolicy)
139
    {
140 21
        if ($originPolicy === null) {
141 18
            return array();
142
        }
143 3
        foreach ($originPolicy as $key => $value) {
144 3
            if (!$strictPolicy || in_array((string) $key, self::$policyFields, true)) {
145 3
                $policy[$key] = $value;
146 3
            }
147 3
        }
148 3
        return $policy;
149
    }
150
151 51
    public function authorization($url, $body = null, $contentType = null)
152
    {
153 51
        $authorization = 'QBox ' . $this->signRequest($url, $body, $contentType);
154 51
        return array('Authorization' => $authorization);
155
    }
156
}
157