1 | <?php |
||||||
2 | |||||||
3 | namespace Azine\JsCryptoStoreBundle\Controller; |
||||||
4 | |||||||
5 | use Azine\JsCryptoStoreBundle\Entity\EncryptedFile; |
||||||
6 | use Azine\JsCryptoStoreBundle\Entity\Repositories\EncryptedFileRepository; |
||||||
7 | use Azine\JsCryptoStoreBundle\Form\DownloadEncryptedFileType; |
||||||
8 | use Azine\JsCryptoStoreBundle\Form\UploadEncryptedFileType; |
||||||
9 | use Azine\JsCryptoStoreBundle\Service\OwnerProviderInterface; |
||||||
10 | use MuBu\DealAnalysisBundle\Entity\User; |
||||||
0 ignored issues
–
show
|
|||||||
11 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; |
||||||
12 | use Symfony\Component\Asset\Packages; |
||||||
0 ignored issues
–
show
The type
Symfony\Component\Asset\Packages was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||||||
13 | use Symfony\Component\HttpFoundation\JsonResponse; |
||||||
14 | use Symfony\Component\HttpFoundation\Request; |
||||||
15 | use Symfony\Component\HttpFoundation\Response; |
||||||
16 | |||||||
17 | /** |
||||||
18 | * This controller provides actions related the encrypted files. |
||||||
19 | */ |
||||||
20 | class EncryptedFileController extends Controller |
||||||
21 | { |
||||||
22 | private $ownerProvider; |
||||||
23 | private $encryptionCipher; |
||||||
24 | private $encryptionIterations; |
||||||
25 | private $encryptionKs; |
||||||
26 | private $encryptionTs; |
||||||
27 | private $encryptionMode; |
||||||
28 | private $maxFileSize; |
||||||
29 | private $defaultLifeTime; |
||||||
30 | |||||||
31 | public function __construct(OwnerProviderInterface $ownerProvider, $encryptionCipher, $encryptionIterations, $encryptionKs, $encryptionTs, $encryptionMode, $maxFileSize, $defaultLifeTime) |
||||||
32 | { |
||||||
33 | $this->ownerProvider = $ownerProvider; |
||||||
34 | $this->encryptionCipher = $encryptionCipher; |
||||||
35 | $this->encryptionIterations = $encryptionIterations; |
||||||
36 | $this->encryptionKs = $encryptionKs; |
||||||
37 | $this->encryptionTs = $encryptionTs; |
||||||
38 | $this->encryptionMode = $encryptionMode; |
||||||
39 | $this->maxFileSize = $maxFileSize; |
||||||
40 | $this->defaultLifeTime = $defaultLifeTime; |
||||||
41 | } |
||||||
42 | |||||||
43 | /** |
||||||
44 | * Displays a dashboard |
||||||
45 | * - show all files for the current user |
||||||
46 | * - show all files for the admin |
||||||
47 | * - show an upload-form. |
||||||
48 | * |
||||||
49 | * @param Request $request |
||||||
50 | * |
||||||
51 | * @return Response |
||||||
52 | */ |
||||||
53 | public function dashboardAction(Request $request) |
||||||
54 | { |
||||||
55 | $uploadForm = $this->createForm(UploadEncryptedFileType::class); |
||||||
56 | $uploadForm->handleRequest($request); |
||||||
57 | |||||||
58 | $downloadForm = $this->createForm(DownloadEncryptedFileType::class); |
||||||
59 | $downloadForm->handleRequest($request); |
||||||
60 | |||||||
61 | // show users files => delete button & forms for download |
||||||
62 | /** @var EncryptedFileRepository $encryptedFileRepository */ |
||||||
63 | $encryptedFileRepository = $this->getDoctrine()->getRepository(EncryptedFile::class); |
||||||
64 | $userFiles = $encryptedFileRepository->findForDashBoard($this->ownerProvider->getOwnerId()); |
||||||
65 | $groupTokens = $encryptedFileRepository->getGroupTokensForUser($this->ownerProvider->getOwnerId()); |
||||||
66 | |||||||
67 | return $this->render('AzineJsCryptoStoreBundle::dashboard.html.twig', |
||||||
68 | array( |
||||||
69 | 'groupTokens' => $groupTokens, |
||||||
70 | 'encryptionCipher' => $this->encryptionCipher, |
||||||
71 | 'encryptionIterations' => $this->encryptionIterations, |
||||||
72 | 'encryptionKs' => $this->encryptionKs, |
||||||
73 | 'encryptionTs' => $this->encryptionTs, |
||||||
74 | 'encryptionMode' => $this->encryptionMode, |
||||||
75 | 'maxFileSize' => $this->maxFileSize, |
||||||
76 | 'userFiles' => $userFiles, |
||||||
77 | 'uploadForm' => $uploadForm->createView(), |
||||||
78 | 'downloadForm' => $downloadForm->createView(), |
||||||
79 | )); |
||||||
80 | } |
||||||
81 | |||||||
82 | /** |
||||||
83 | * Displays a form to download a specific file. |
||||||
84 | * |
||||||
85 | * @param string $token |
||||||
86 | * |
||||||
87 | * @return Response |
||||||
88 | */ |
||||||
89 | public function downloadAction(Request $request, $groupToken, $token = null) |
||||||
0 ignored issues
–
show
The parameter
$request is not used and could be removed.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for parameters that have been defined for a function or method, but which are not used in the method body. ![]() |
|||||||
90 | { |
||||||
91 | $files = $this->getDoctrine()->getRepository(EncryptedFile::class)->findForDownload($groupToken, $token); |
||||||
92 | |||||||
93 | $forms = array(); |
||||||
94 | foreach ($files as $nextFile) { |
||||||
95 | // show file form for download |
||||||
96 | $form = $this->createForm(DownloadEncryptedFileType::class); |
||||||
97 | $form->get('token')->setData($nextFile['token']); |
||||||
98 | $forms[] = $form->createView(); |
||||||
99 | } |
||||||
100 | $groupToken = substr($files[0]['groupToken'], 0, strrpos($files[0]['groupToken'], '-')); |
||||||
101 | |||||||
102 | return $this->render('AzineJsCryptoStoreBundle::download.html.twig', |
||||||
103 | array( |
||||||
104 | 'files' => $files, |
||||||
105 | 'groupToken' => $groupToken, |
||||||
106 | 'downloadForms' => $forms, |
||||||
107 | 'encryptionCipher' => $this->encryptionCipher, |
||||||
108 | 'encryptionIterations' => $this->encryptionIterations, |
||||||
109 | 'encryptionKs' => $this->encryptionKs, |
||||||
110 | 'encryptionTs' => $this->encryptionTs, |
||||||
111 | 'encryptionMode' => $this->encryptionMode, |
||||||
112 | 'maxFileSize' => $this->maxFileSize, |
||||||
113 | )); |
||||||
114 | } |
||||||
115 | |||||||
116 | /** |
||||||
117 | * Handle uploading, downloading or removing a file. |
||||||
118 | * |
||||||
119 | * @param Request $request |
||||||
120 | * |
||||||
121 | * @return JsonResponse |
||||||
122 | */ |
||||||
123 | public function fileAction(Request $request) |
||||||
124 | { |
||||||
125 | $response = new JsonResponse(); |
||||||
126 | $responseData = array(); |
||||||
127 | if ('POST' === $request->getMethod()) { |
||||||
128 | // store the submited file |
||||||
129 | if (null != $request->get('fileData')) { |
||||||
130 | $responseData = $this->storeFile($request); |
||||||
131 | } else { |
||||||
132 | $token = $request->get('token'); |
||||||
133 | /** @var EncryptedFile $encryptedFile */ |
||||||
134 | $encryptedFile = $this->getDoctrine()->getRepository(EncryptedFile::class)->findOneBy(array('token' => $token)); |
||||||
135 | $responseData = $this->getFileMetaData($encryptedFile); |
||||||
136 | } |
||||||
137 | } elseif ('DELETE' === $request->getMethod()) { |
||||||
138 | $responseData = $this->deleteFile($request); |
||||||
139 | } |
||||||
140 | |||||||
141 | return $response->setData($responseData); |
||||||
142 | } |
||||||
143 | |||||||
144 | private function getFileMetaData(EncryptedFile $encryptedFile) |
||||||
145 | { |
||||||
146 | $responseData = array(); |
||||||
147 | $responseData['mimeType'] = $encryptedFile->getMimeType(); |
||||||
148 | $responseData['fileName'] = $encryptedFile->getFileName(); |
||||||
149 | |||||||
150 | /** @var Packages $manager */ |
||||||
151 | $manager = $this->get('assets.packages'); |
||||||
152 | $responseData['fileUrl'] = $manager->getUrl('bundles/azinejscryptostore/files').substr($encryptedFile->getFile(), strrpos($encryptedFile->getFile(), '/')); |
||||||
0 ignored issues
–
show
It seems like
$encryptedFile->getFile() can also be of type null ; however, parameter $haystack of strrpos() does only seem to accept string , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() It seems like
$encryptedFile->getFile() can also be of type null ; however, parameter $string of substr() does only seem to accept string , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
153 | |||||||
154 | return $responseData; |
||||||
155 | } |
||||||
156 | |||||||
157 | private function storeFile(Request $request) |
||||||
158 | { |
||||||
159 | $fileData = $request->get('fileData'); |
||||||
160 | $fileName = $request->get('fileName'); |
||||||
161 | $mimeType = $request->get('mimeType'); |
||||||
162 | $description = $request->get('description'); |
||||||
163 | $expiry = $request->get('expiry'); |
||||||
164 | $groupToken = $request->get('groupToken'); |
||||||
165 | if (null == $groupToken) { |
||||||
166 | $groupToken = ' '; |
||||||
167 | } |
||||||
168 | $groupToken .= '-'.md5($this->ownerProvider->getOwnerId()); |
||||||
169 | $encryptedFile = new EncryptedFile(); |
||||||
170 | $storageDirectory = __DIR__.'/../Resources/public/files/'; |
||||||
171 | $storageFileName = tempnam($storageDirectory, 'encrypted-'); |
||||||
172 | chmod($storageFileName, 0664); |
||||||
173 | file_put_contents($storageFileName, $fileData); |
||||||
174 | $encryptedFile->setFile($storageFileName); |
||||||
175 | $encryptedFile->setFileName($fileName); |
||||||
176 | $encryptedFile->setMimeType($mimeType); |
||||||
177 | $encryptedFile->setDescription($description); |
||||||
178 | if ('' == $expiry) { |
||||||
179 | $expiry = $this->defaultLifeTime; |
||||||
180 | } |
||||||
181 | $encryptedFile->setExpiry(new \DateTime($expiry)); |
||||||
182 | $fileToken = md5($fileData); |
||||||
0 ignored issues
–
show
It seems like
$fileData can also be of type null ; however, parameter $string of md5() does only seem to accept string , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
183 | $encryptedFile->setToken($fileToken); |
||||||
184 | $encryptedFile->setGroupToken($groupToken); |
||||||
185 | $encryptedFile->setOwnerId($this->ownerProvider->getOwnerId()); |
||||||
0 ignored issues
–
show
$this->ownerProvider->getOwnerId() of type string is incompatible with the type integer|null expected by parameter $ownerId of Azine\JsCryptoStoreBundl...yptedFile::setOwnerId() .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
186 | $em = $this->getDoctrine()->getManager(); |
||||||
187 | $em->persist($encryptedFile); |
||||||
188 | $em->flush(); |
||||||
189 | $responseData['token'] = $fileToken; |
||||||
0 ignored issues
–
show
Comprehensibility
Best Practice
introduced
by
|
|||||||
190 | $responseData['groupToken'] = $groupToken; |
||||||
191 | $responseData['group'] = substr($groupToken, 0, strrpos($groupToken, '-')); |
||||||
192 | $responseData['expiryDate'] = $encryptedFile->getExpiry(); |
||||||
193 | |||||||
194 | return $responseData; |
||||||
195 | } |
||||||
196 | |||||||
197 | private function deleteFile(Request $request) |
||||||
198 | { |
||||||
199 | $fileToken = $request->get('token'); |
||||||
200 | $em = $this->getDoctrine()->getManager(); |
||||||
201 | /** @var EncryptedFile $encryptedFile */ |
||||||
202 | $encryptedFile = $em->getRepository(EncryptedFile::class)->findOneBy(array('token' => $fileToken)); |
||||||
203 | if ($encryptedFile) { |
||||||
0 ignored issues
–
show
|
|||||||
204 | $storageFileName = $encryptedFile->getFile(); |
||||||
205 | $em->remove($encryptedFile); |
||||||
206 | $em->flush(); |
||||||
207 | unlink($storageFileName); |
||||||
0 ignored issues
–
show
It seems like
$storageFileName can also be of type null ; however, parameter $filename of unlink() does only seem to accept string , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
208 | } |
||||||
209 | $responseData['msg'] = 'file deleted'; |
||||||
0 ignored issues
–
show
Comprehensibility
Best Practice
introduced
by
|
|||||||
210 | $responseData['token'] = $fileToken; |
||||||
211 | |||||||
212 | return $responseData; |
||||||
213 | } |
||||||
214 | } |
||||||
215 |
The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g.
excluded_paths: ["lib/*"]
, you can move it to the dependency path list as follows:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths