~fkooman/vpn-user-portal

ref: 2.3.10 vpn-user-portal/src/Expiry.php -rw-r--r-- 1.4 KiB
e0bd9cc0François Kooman prepare for release 1 year, 18 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php

/*
 * eduVPN - End-user friendly VPN.
 *
 * Copyright: 2016-2019, The Commons Conservancy eduVPN Programme
 * SPDX-License-Identifier: AGPL-3.0+
 */

namespace LC\Portal;

use DateInterval;
use DateTime;

class Expiry
{
    /**
     * Calculate when a session will expire.
     *
     * The goal is to expire at 04:00 in the current timezone. in case the
     * expiry is set 1 week or longer. The current timezone is considerd as
     * per date.timezone PHP ini value.
     *
     * @return \DateInterval
     */
    public static function calculate(DateInterval $sessionExpiry, DateTime $dateTime = null)
    {
        if (null === $dateTime) {
            $dateTime = new DateTime();
        }
        $expiresAt = clone $dateTime;
        $expiresAt->add($sessionExpiry);
        $sevenDaysFromNow = clone $dateTime;
        $sevenDaysFromNow->add(new DateInterval('P7D'));

        // if we expire less than 7 days from now, keep as is
        if ($expiresAt < $sevenDaysFromNow) {
            return $sessionExpiry;
        }

        // expire in the middle of the night on the day of the expiry
        $nightExpiresAt = clone $expiresAt;
        $nightExpiresAt->modify('04:00');

        // if we are longer than sessionExpiry, subtract a day
        if ($nightExpiresAt > $expiresAt) {
            $nightExpiresAt->modify('yesterday 04:00');

            return $dateTime->diff($nightExpiresAt);
        }

        return $dateTime->diff($nightExpiresAt);
    }
}