Completed
Push — dev ( 328898...8c5951 )
by Gaige
01:19
created

Builder   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 122
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 0

Importance

Changes 0
Metric Value
wmc 12
lcom 0
cbo 0
dl 0
loc 122
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A sri() 0 8 1
A versioning() 0 4 1
A attribute() 0 17 3
A crossOrigin() 0 4 1
A selectAlgorithm() 0 16 5
A parseExtension() 0 4 1
1
<?php
2
3
4
namespace ExoUNX\Vasri;
5
6
use Exception;
7
8
/**
9
 * Builds resources for the access class
10
 * Class Builder
11
 *
12
 * @package ExoUNX\Vasri
13
 * @author  Gaige Lama <[email protected]>
14
 * @license MIT License
15
 * @link    https://github.com/ExoUNX/Vasri
16
 */
17
class Builder
18
{
19
20
    /**
21
     * SHA256 Hash Algorithm
22
     */
23
    private const SHA256 = 'sha256';
24
25
    /**
26
     * SHA384 Hash Algorithm
27
     */
28
    private const SHA384 = 'sha384';
29
30
    /**
31
     * SHA512 Hash Algorithm
32
     */
33
    private const SHA512 = 'sha512';
34
35
    /**
36
     * Constructs a valid SRI string
37
     *
38
     * @param  string  $file
39
     *
40
     *
41
     * @return string
42
     * @throws Exception
43
     */
44
    public function sri(string $file)
45
    {
46
        $algorithm = self::selectAlgorithm();
47
48
        return $algorithm.'-'.base64_encode(
49
                hash_file($algorithm, public_path($file), true)
50
            );
51
    }
52
53
    /**
54
     * Constructs a query string containing the md5 hash of the input file
55
     *
56
     * @param  string  $file
57
     *
58
     * @return string
59
     */
60
    public function versioning(string $file)
61
    {
62
        return '?id='.hash_file('md5', public_path($file));
63
    }
64
65
    /**
66
     * Sets the HTML attribute based on the file extension and throws an exception if invalid
67
     *
68
     * @param  string  $file
69
     *
70
     * @return string
71
     * @throws Exception
72
     */
73
    public function attribute(string $file): string
74
    {
75
        $extension = self::parseExtension($file);
76
77
        switch ($extension) {
78
            case 'css':
79
                $attribute = 'href';
80
                break;
81
            case 'js':
82
                $attribute = 'src';
83
                break;
84
            default:
85
                throw new Exception('Invalid or Unsupported Extension');
86
        }
87
88
        return $attribute;
89
    }
90
91
    /**
92
     * Constructs crossOrigin attribute
93
     *
94
     * @param  string  $keyword
95
     *
96
     * @return string
97
     */
98
    public function crossOrigin(string $keyword): string
99
    {
100
        return "crossorigin=\"".$keyword."\"";
101
    }
102
103
    /**
104
     * Checks config for hash algorithm and if nothing is found default to SHA384
105
     *
106
     * @return string
107
     * @throws Exception
108
     */
109
    private static function selectAlgorithm(): string
110
    {
111
        if ( ! empty(config('vasri.hash-algorithm'))) {
112
            $algorithm = config('vasri.hash-algorithm');
113
            if ($algorithm !== self::SHA256
114
                && $algorithm !== self::SHA384
115
                && $algorithm !== self::SHA512
116
            ) {
117
                throw new Exception('Invalid or Unsupported Hash Algorithm');
118
            }
119
        } else {
120
            $algorithm = self::SHA384;
121
        }
122
123
        return $algorithm;
124
    }
125
126
    /**
127
     * Removes everything but the short extension
128
     *
129
     * @param  string  $path
130
     *
131
     * @return string
132
     */
133
    private static function parseExtension(string $path): string
134
    {
135
        return preg_replace("#\?.*#", "", pathinfo($path, PATHINFO_EXTENSION));
136
    }
137
138
}
139