Wsse::generateHeader()   B
last analyzed

Complexity

Conditions 3
Paths 2

Size

Total Lines 24
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
dl 0
loc 24
ccs 0
cts 20
cp 0
rs 8.9713
c 0
b 0
f 0
cc 3
eloc 16
nc 2
nop 0
crap 12
1
<?php
2
3
/*
4
 * This file is part of the AMFWebServicesClientBundle package.
5
 *
6
 * (c) Amine Fattouch <http://github.com/fattouchsquall>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace AMF\WebServicesClientBundle\Rest\Security;
13
14
/**
15
 * Add security wsse layer to rest webservices.
16
 *
17
 * @author Mohamed Amine Fattouch <[email protected]>
18
 */
19
class Wsse
20
{
21
    /**
22
     * @var string
23
     */
24
    protected $username;
25
26
    /**
27
     * @var string
28
     */
29
    protected $password;
30
31
    /**
32
     * @var array
33
     */
34
    protected $options;
35
36
    /**
37
     * The constructor class.
38
     *
39
     * @param string $username The username of wsse security.
40
     * @param string $password The password of wsse security.
41
     * @param array  $options  Options to encode password.
42
     */
43
    public function __construct($username, $password, array $options = [])
44
    {
45
        $this->username = $username;
46
        $this->password = $password;
47
        $this->options  = $options;
48
    }
49
50
    /**
51
     * Generates header for wsse security.
52
     *
53
     * @throws Exception If the username or password are not provided.
54
     *
55
     * @return array
56
     */
57
    public function generateHeader()
58
    {
59
        $header = [];
60
        if (isset($this->password) && isset($this->username)) {
61
            $now     = new \DateTime('now');
62
            $created = $now->format('Y-m-d H:i:s');
63
64
            $nonce  = $this->generateNonce();
65
            $digest = $this->generatePasswordDigest($nonce, $created);
66
67
            $header['HTTP_AUTHORISATION'] = 'WSSE profile="UsernameToken"';
68
            $header['HTTP_X-WSSE']        = sprintf(
69
                'UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"',
70
                $this->username,
71
                $digest,
72
                base64_encode($nonce),
73
                $created
74
            );
75
76
            return $header;
77
        }
78
79
        throw new \Exception('Username and password must be provided');
80
    }
81
82
    /**
83
     * Generates a random nonce for wsse token.
84
     *
85
     * @return string
86
     */
87
    protected function generateNonce()
88
    {
89
        $chars   = $this->options['nonce_chars'];
90
        $random  = "".microtime();
91
        $random .= mt_rand();
92
93
        $mi = strlen($chars) - 1;
94
        for ($i = 0; $i < $this->options['nonce_length']; $i++) {
95
            $random .= $chars[mt_rand(0, $mi)];
96
        }
97
        $nonce = md5($random);
98
99
        return $nonce;
100
    }
101
102
    /**
103
     * Generates a password digest.
104
     *
105
     * @param string $nonce   The generated nonce.
106
     * @param string $created The date of creation.
107
     *
108
     * @return string
109
     */
110
    protected function generatePasswordDigest($nonce, $created)
111
    {
112
        $passwordDigest = sha1($nonce.$created.$this->password, true);
113
114
        if ($this->options['encode_as_64'] === true) {
115
            $passwordDigest = base64_encode($passwordDigest);
116
        }
117
118
        return $passwordDigest;
119
    }
120
}
121