UrlCerts::process()   B
last analyzed

Complexity

Conditions 9
Paths 24

Size

Total Lines 22
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 9

Importance

Changes 0
Metric Value
cc 9
eloc 13
c 0
b 0
f 0
nc 24
nop 1
dl 0
loc 22
ccs 14
cts 14
cp 1
crap 9
rs 8.0555
1
<?php
2
3
namespace kalanis\kw_auth\Methods;
4
5
6
use kalanis\kw_accounts\Interfaces\IAuthCert;
7
use kalanis\kw_address_handler\Handler;
8
use kalanis\kw_auth\Traits\TStamp;
9
10
11
/**
12
 * Class UrlCerts
13
 * @package kalanis\kw_auth\AuthMethods
14
 * Authenticate via certificates
15
 *
16
 * query:
17
 * //dummy/u:whoami/?pass=asdf123ghjk456&timestamp=123456&digest=poiuztrewq
18
 *
19
 * makes following call:
20
 * openssl_verify( $data = '//dummy/u:whoami/?pass=asdf123ghjk456&timestamp=123456&salt=789', $signature = 'poiuztrewq', $key = 'mnbvcx987' )
21
 *
22
 * - it removed digest value and added locally stored salt
23
 */
24
class UrlCerts extends AMethods
25
{
26
    use TStamp;
27
28
    protected const INPUT_NAME = 'name';
29
    protected const INPUT_NAME2 = 'user';
30
    protected const INPUT_STAMP = 'timestamp';
31
    protected const INPUT_DIGEST = 'digest';
32
    protected const INPUT_SALT = 'salt';
33
34
    protected IAuthCert $certAuthenticator;
35
    protected Handler $uriHandler;
36
37 2
    public function __construct(IAuthCert $authenticator, ?AMethods $nextOne, Handler $uriHandler)
38
    {
39 2
        parent::__construct($authenticator, $nextOne);
40 2
        $this->certAuthenticator = $authenticator;
41 2
        $this->uriHandler = $uriHandler;
42 2
    }
43
44 2
    public function process(\ArrayAccess $credentials): void
45
    {
46 2
        $name = $credentials->offsetExists(static::INPUT_NAME) ? strval($credentials->offsetGet(static::INPUT_NAME)) : '' ;
47 2
        $name = $credentials->offsetExists(static::INPUT_NAME2) ? strval($credentials->offsetGet(static::INPUT_NAME2)) : $name ;
48 2
        $stamp = $credentials->offsetExists(static::INPUT_STAMP) ? intval(strval($credentials->offsetGet(static::INPUT_STAMP))) : 0 ;
49
50 2
        $wantedUser = $this->certAuthenticator->getDataOnly(strval($name));
51 2
        $wantedCert = $this->certAuthenticator->getCertData(strval($name));
52 2
        if ($wantedUser && $wantedCert && !empty($stamp) && $this->checkStamp($stamp)) {
53
            // now we have public key and salt from our storage, so it's time to check it
54
55
            // digest out, salt in
56 1
            $digest = strval($this->uriHandler->getParams()->offsetGet(static::INPUT_DIGEST));
57 1
            $this->uriHandler->getParams()->offsetUnset(static::INPUT_DIGEST);
58 1
            $this->uriHandler->getParams()->offsetSet(static::INPUT_SALT, $wantedCert->getSalt());
59 1
            $data = strval($this->uriHandler->getAddress());
60
61
            // verify
62 1
            $result = openssl_verify($data, base64_decode(rawurldecode($digest)), $wantedCert->getPubKey(), OPENSSL_ALGO_SHA256);
63 1
            if (1 === $result) {
64
                // OK
65 1
                $this->loggedUser = $wantedUser;
66
            }
67
        }
68 2
    }
69
70 1
    public function remove(): void
71
    {
72 1
    }
73
}
74