Completed
Pull Request — master (#228)
by r
05:18
created

Auth   A

Complexity

Total Complexity 22

Size/Duplication

Total Lines 151
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 86.96%

Importance

Changes 0
Metric Value
dl 0
loc 151
ccs 60
cts 69
cp 0.8696
rs 10
c 0
b 0
f 0
wmc 22
lcom 1
cbo 1

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A getAccessKey() 0 4 1
A sign() 0 5 1
A signWithData() 0 5 1
B signRequest() 0 17 5
A verifyCallback() 0 5 1
A privateDownloadUrl() 0 15 2
B copyPolicy() 0 12 5
A authorization() 0 5 1
B uploadToken() 0 30 4
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 34
        }
41 54
        if (array_key_exists('query', $url)) {
42 6
            $data .= '?' . $url['query'];
43 4
        }
44 54
        $data .= "\n";
45
46 54
        if ($body !== null && $contentType === 'application/x-www-form-urlencoded') {
47 24
            $data .= $body;
48 16
        }
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 6
        } 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 10
        }
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 14
        }
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 2
            }
147 2
        }
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