LaravelCookieConsent::getCookieTypesConsent()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 4
c 1
b 0
f 0
nc 3
nop 1
dl 0
loc 7
rs 10
1
<?php
2
3
namespace W3designweb\LaravelCookieConsent\Http\Middleware;
4
5
use Closure;
6
use Illuminate\Http\Response;
7
use Throwable;
8
9
class LaravelCookieConsent
10
{
11
	/**
12
	 * Handle an incoming request.
13
	 * @param $request
14
	 * @param Closure $next
15
	 *
16
	 * @return LaravelCookieConsent|mixed
17
	 * @throws Throwable
18
	 */
19
	public function handle($request, Closure $next)
20
	{
21
		$alreadyAccepted = array_key_exists(config('laravel-cookie-consent.cookie_name'), $request->cookie());
0 ignored issues
show
Bug introduced by
The function config was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

21
		$alreadyAccepted = array_key_exists(/** @scrutinizer ignore-call */ config('laravel-cookie-consent.cookie_name'), $request->cookie());
Loading history...
22
        $cookieTypesAccepted = $this->getCookieTypesConsent($request);
23
		$response = $next($request);
24
		if (! $response instanceof Response) {
25
			return $response;
26
		}
27
		if (! $this->containsBodyTag($response)) {
28
			return $response;
29
		}
30
		return $this->addCookieConsentScriptToResponse($response, $alreadyAccepted, $cookieTypesAccepted);
31
	}
32
33
    /**
34
     * Get the cookie preference for the user
35
     *
36
     * @param $request
37
     * @return array
38
     */
39
    public function getCookieTypesConsent($request): array
40
    {
41
        $cookieTypesConsent = [];
42
        foreach(config('laravel-cookie-consent.cookie_types') as $type => $cookie_name) {
0 ignored issues
show
Bug introduced by
The function config was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

42
        foreach(/** @scrutinizer ignore-call */ config('laravel-cookie-consent.cookie_types') as $type => $cookie_name) {
Loading history...
43
            if(array_key_exists($cookie_name, $request->cookie())) $cookieTypesConsent[] = $cookie_name;
44
        }
45
        return $cookieTypesConsent;
46
    }
47
48
	/**
49
	 * Check if the application contains body tag
50
	 * @param Response $response
51
	 *
52
	 * @return bool
53
	 */
54
	protected function containsBodyTag(Response $response): bool
55
    {
56
		return $this->getLastClosingBodyTagPosition($response->getContent()) != false;
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing $this->getLastClosingBod...response->getContent()) of type integer to the boolean false. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
57
	}
58
59
    /**
60
     * Add cookie consent container to the response
61
     *
62
     * @param Response $response
63
     * @param $alreadyAccepted
64
     * @param $cookieTypesAccepted
65
     *
66
     * @return Response
67
     * @throws Throwable
68
     */
69
	protected function addCookieConsentScriptToResponse(Response $response, $alreadyAccepted, $cookieTypesAccepted): Response
70
    {
71
		$content = $response->getContent();
72
		//if(!$alreadyAccepted) {
73
			$closingBodyTagPosition = $this->getLastClosingBodyTagPosition($content);
74
			$content = ''
75
			           .substr($content, 0, $closingBodyTagPosition)
76
			           .view('laravel-cookie-consent::_banner', ['alreadyAccepted' => $alreadyAccepted, 'cookieTypesAccepted' => $cookieTypesAccepted])->render()
0 ignored issues
show
Bug introduced by
The function view was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

76
			           ./** @scrutinizer ignore-call */ view('laravel-cookie-consent::_banner', ['alreadyAccepted' => $alreadyAccepted, 'cookieTypesAccepted' => $cookieTypesAccepted])->render()
Loading history...
77
			           .substr($content, $closingBodyTagPosition);
78
		//}
79
		return $response->setContent($content);
80
	}
81
82
	/**
83
	 * Get last closing body tag position
84
	 * @param string $content
85
	 *
86
	 * @return int
87
	 */
88
	protected function getLastClosingBodyTagPosition(string $content = ''): int
89
    {
90
		return strripos($content, '</body>');
91
	}
92
}
93