1<?php
2/*
3 * Copyright 2015 Google Inc.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18namespace Google\Auth;
19
20use Psr\Cache\CacheItemPoolInterface;
21
22trait CacheTrait
23{
24    /**
25     * @var int
26     */
27    private $maxKeyLength = 64;
28
29    /**
30     * @var array<mixed>
31     */
32    private $cacheConfig;
33
34    /**
35     * @var ?CacheItemPoolInterface
36     */
37    private $cache;
38
39    /**
40     * Gets the cached value if it is present in the cache when that is
41     * available.
42     *
43     * @param mixed $k
44     *
45     * @return mixed
46     */
47    private function getCachedValue($k)
48    {
49        if (is_null($this->cache)) {
50            return null;
51        }
52
53        $key = $this->getFullCacheKey($k);
54        if (is_null($key)) {
55            return null;
56        }
57
58        $cacheItem = $this->cache->getItem($key);
59        if ($cacheItem->isHit()) {
60            return $cacheItem->get();
61        }
62    }
63
64    /**
65     * Saves the value in the cache when that is available.
66     *
67     * @param mixed $k
68     * @param mixed $v
69     * @return mixed
70     */
71    private function setCachedValue($k, $v)
72    {
73        if (is_null($this->cache)) {
74            return null;
75        }
76
77        $key = $this->getFullCacheKey($k);
78        if (is_null($key)) {
79            return null;
80        }
81
82        $cacheItem = $this->cache->getItem($key);
83        $cacheItem->set($v);
84        $cacheItem->expiresAfter($this->cacheConfig['lifetime']);
85        return $this->cache->save($cacheItem);
86    }
87
88    /**
89     * @param null|string $key
90     * @return null|string
91     */
92    private function getFullCacheKey($key)
93    {
94        if (is_null($key)) {
95            return null;
96        }
97
98        $key = $this->cacheConfig['prefix'] . $key;
99
100        // ensure we do not have illegal characters
101        $key = preg_replace('|[^a-zA-Z0-9_\.!]|', '', $key);
102
103        // Hash keys if they exceed $maxKeyLength (defaults to 64)
104        if ($this->maxKeyLength && strlen($key) > $this->maxKeyLength) {
105            $key = substr(hash('sha256', $key), 0, $this->maxKeyLength);
106        }
107
108        return $key;
109    }
110}
111