1<?php
2namespace TYPO3\CMS\Rsaauth;
3
4/*
5 * This file is part of the TYPO3 CMS project.
6 *
7 * It is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License, either version 2
9 * of the License, or any later version.
10 *
11 * For the full copyright and license information, please read the
12 * LICENSE.txt file that was distributed with this source code.
13 *
14 * The TYPO3 project - inspiring people to share!
15 */
16
17/**
18 * This class decodes rsa protected data
19 */
20class RsaEncryptionDecoder implements \TYPO3\CMS\Core\SingletonInterface
21{
22    /**
23     * @var Backend\AbstractBackend
24     */
25    protected $backend;
26
27    /**
28     * @var Storage\AbstractStorage
29     */
30    protected $storage;
31
32    /**
33     * @var string
34     */
35    protected $key;
36
37    /**
38     * @param string|array $data
39     * @return string|array
40     */
41    public function decrypt($data)
42    {
43        if ($this->getKey() === '' || !$this->isAvailable()) {
44            return $data;
45        }
46
47        $decryptedData = is_array($data) ? $data : [$data];
48        $decryptedData = $this->decryptDataArray($decryptedData);
49        $this->getStorage()->put(null);
50
51        return is_array($data) ? $decryptedData : $decryptedData[0];
52    }
53
54    /**
55     * @return bool
56     */
57    public function isAvailable()
58    {
59        return $this->getBackend() instanceof Backend\AbstractBackend;
60    }
61
62    /**
63     * @param array $data
64     * @return array
65     */
66    protected function decryptDataArray(array $data)
67    {
68        foreach ($data as $key => $value) {
69            if (empty($value)) {
70                continue;
71            }
72            if (is_array($value)) {
73                $data[$key] = $this->decryptDataArray($value);
74                continue;
75            }
76
77            if (strpos($value, 'rsa:') !== 0) {
78                continue;
79            }
80
81            $decryptedValue = $this->getBackend()->decrypt($this->getKey(), substr($value, 4));
82            if ($decryptedValue !== null) {
83                $data[$key] = $decryptedValue;
84            }
85        }
86
87        return $data;
88    }
89
90    /**
91     * @return string
92     */
93    protected function getKey()
94    {
95        if ($this->key === null) {
96            $this->key = $this->getStorage()->get();
97
98            if ($this->key === null) {
99                $this->key = '';
100            }
101        }
102
103        return $this->key;
104    }
105
106    /**
107     * @return Backend\AbstractBackend|null
108     */
109    protected function getBackend()
110    {
111        if ($this->backend === null) {
112            $this->backend = Backend\BackendFactory::getBackend();
113        }
114
115        return $this->backend;
116    }
117
118    /**
119     * @return Storage\AbstractStorage
120     */
121    protected function getStorage()
122    {
123        if ($this->storage === null) {
124            $this->storage = Storage\StorageFactory::getStorage();
125        }
126
127        return $this->storage;
128    }
129}
130