Passed
Branch monitor-2.5.x (577716)
by Tim
01:35
created

Cert::invokeTest()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 25
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 17
nc 6
nop 0
dl 0
loc 25
rs 9.7
c 0
b 0
f 0
1
<?php
2
3
namespace SimpleSAML\Modules\Monitor\TestCase;
4
5
use \SimpleSAML\Modules\Monitor\State as State;
6
use \SimpleSAML\Modules\Monitor\TestData as TestData;
7
use \SimpleSAML\Modules\Monitor\TestResult as TestResult;
8
9
class Cert extends \SimpleSAML\Modules\Monitor\TestCaseFactory
10
{
11
    /**
12
     * @var array
13
     */
14
    private $certInfo = array();
15
16
    /**
17
     * @return integer|null
18
     */
19
    private $expiration = null;
20
21
    /**
22
     * @param integer|null;
23
     */
24
    private $certExpirationWarning = null;
25
26
    /**
27
     * @var TestData $testData
28
     *
29
     * @return void
30
     */
31
    protected function initialize($testData)
32
    {
33
        $this->setCategory($testData->getInputItem('category'));
34
        $this->setCertInfo($testData->getInputItem('certData'));
35
        $this->setCertExpirationWarning($testData->getInputItem('certExpirationWarning'));
36
37
        parent::initialize($testData);
38
    }
39
40
    /**
41
     * @return string
42
     */
43
    public function getSubject()
44
    {
45
        $certInfo = $this->getCertInfo();
46
        if (array_key_exists('CN', $certInfo['subject']) && !empty($certInfo['subject'])) {
47
            return 'CN='.$certInfo['subject']['CN'];
48
        } else {
49
            return 'SN='.$certInfo['serialNumber'];
50
        }
51
    }
52
53
    /**
54
     * @param array $certInfo
55
     *
56
     * @return void
57
     */
58
    protected function setCertInfo($certInfo)
59
    {
60
        assert(is_array($certInfo));
61
        $this->certInfo = $certInfo;
62
    }
63
64
    /**
65
     * @return array|null
66
     */
67
    protected function getCertInfo()
68
    {
69
        assert(is_array($this->certInfo));
70
        return $this->certInfo;
71
    }
72
73
    /**
74
     * @param integer $certExpirationWarning
75
     *
76
     * @return void
77
     */
78
    protected function setCertExpirationWarning($certExpirationWarning)
79
    {
80
        assert(is_int($certExpirationWarning));
81
        $this->certExpirationWarning = $certExpirationWarning;
82
    }
83
84
    /**
85
     * @return integer|null
86
     */
87
    protected function getCertExpirationWarning()
88
    {
89
        assert(is_int($this->certExpirationWarning));
90
        return $this->certExpirationWarning;
91
    }
92
93
    /**
94
     * @return integer
95
     */
96
    protected function getExpiration()
97
    {
98
        assert(is_int($this->expiration));
99
        return $this->expiration;
100
    }
101
102
    /**
103
     * @param integer $expiration
104
     * 
105
     * @return void
106
     */
107
    private function setExpiration($expiration)
108
    {
109
        assert(is_int($expiration));
110
        $this->expiration = $expiration;
111
    }
112
113
    /**
114
     * @return void
115
     */
116
    protected function calculateExpiration()
117
    {
118
        $certInfo = $this->getCertInfo();
119
        $expiration = (int)(($certInfo['validTo_time_t'] - time()) / 86400);
120
        $this->setExpiration($expiration);
121
    }
122
123
    /**
124
     * @return void
125
     */
126
    public function invokeTest()
127
    {
128
        $this->calculateExpiration();
129
130
        $threshold = $this->getCertExpirationWarning();
131
        $expiration = $this->getExpiration();
132
133
        $days = abs($expiration);
134
        $daysStr = $days . ' ' . (($days === 1) ? 'day' : 'days');
135
136
        $testResult = new TestResult($this->getCategory(), $this->getSubject());
137
138
        if ($expiration < 0) {
139
            $testResult->setState(State::ERROR);
140
            $testResult->setMessage('Certificate has expired ' . $daysStr . ' ago');
141
        } else if ($expiration <= $threshold) {
142
            $testResult->setState(State::WARNING);
143
            $testResult->setMessage('Certificate will expire in ' . $daysStr);
144
        } else {
145
            $testResult->setState(State::OK);
146
            $testResult->setMessage('Certificate valid for another ' . $daysStr);
147
        }
148
149
        $testResult->addOutput($expiration, 'expiration');
150
        $this->setTestResult($testResult);
151
    }
152
}
153