001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.documentlibrary.store;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.util.FileUtil;
019    import com.liferay.portlet.documentlibrary.model.DLFileEntryConstants;
020    
021    import java.io.File;
022    import java.io.InputStream;
023    
024    /**
025     * @author Brian Wing Shun Chan
026     * @author Edward Han
027     */
028    public class SafeFileNameStoreWrapper implements Store {
029    
030            public SafeFileNameStoreWrapper(Store store) {
031                    _store = store;
032            }
033    
034            @Override
035            public void addDirectory(long companyId, long repositoryId, String dirName)
036                    throws PortalException {
037    
038                    String safeDirName = FileUtil.encodeSafeFileName(dirName);
039    
040                    if (!safeDirName.equals(dirName)) {
041                            try {
042                                    _store.move(dirName, safeDirName);
043                            }
044                            catch (Exception e) {
045                            }
046                    }
047    
048                    _store.addDirectory(companyId, repositoryId, safeDirName);
049            }
050    
051            @Override
052            public void addFile(
053                            long companyId, long repositoryId, String fileName, byte[] bytes)
054                    throws PortalException {
055    
056                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
057    
058                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
059    
060                    _store.addFile(companyId, repositoryId, safeFileName, bytes);
061            }
062    
063            @Override
064            public void addFile(
065                            long companyId, long repositoryId, String fileName, File file)
066                    throws PortalException {
067    
068                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
069    
070                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
071    
072                    _store.addFile(companyId, repositoryId, safeFileName, file);
073            }
074    
075            @Override
076            public void addFile(
077                            long companyId, long repositoryId, String fileName, InputStream is)
078                    throws PortalException {
079    
080                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
081    
082                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
083    
084                    _store.addFile(companyId, repositoryId, safeFileName, is);
085            }
086    
087            @Override
088            public void checkRoot(long companyId) {
089                    _store.checkRoot(companyId);
090            }
091    
092            @Override
093            public void copyFileVersion(
094                            long companyId, long repositoryId, String fileName,
095                            String fromVersionLabel, String toVersionLabel)
096                    throws PortalException {
097    
098                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
099    
100                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
101    
102                    _store.copyFileVersion(
103                            companyId, repositoryId, safeFileName, fromVersionLabel,
104                            toVersionLabel);
105            }
106    
107            @Override
108            public void deleteDirectory(
109                            long companyId, long repositoryId, String dirName)
110                    throws PortalException {
111    
112                    String safeDirName = FileUtil.encodeSafeFileName(dirName);
113    
114                    if (!safeDirName.equals(dirName)) {
115                            try {
116                                    _store.deleteDirectory(companyId, repositoryId, dirName);
117    
118                                    return;
119                            }
120                            catch (Exception e) {
121                            }
122                    }
123    
124                    _store.deleteDirectory(companyId, repositoryId, safeDirName);
125            }
126    
127            @Override
128            public void deleteFile(long companyId, long repositoryId, String fileName)
129                    throws PortalException {
130    
131                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
132    
133                    if (!safeFileName.equals(fileName) &&
134                            _store.hasFile(companyId, repositoryId, fileName)) {
135    
136                            _store.deleteFile(companyId, repositoryId, fileName);
137    
138                            return;
139                    }
140    
141                    _store.deleteFile(companyId, repositoryId, safeFileName);
142            }
143    
144            @Override
145            public void deleteFile(
146                            long companyId, long repositoryId, String fileName,
147                            String versionLabel)
148                    throws PortalException {
149    
150                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
151    
152                    if (!safeFileName.equals(fileName) &&
153                            _store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
154    
155                            _store.deleteFile(companyId, repositoryId, fileName, versionLabel);
156    
157                            return;
158                    }
159    
160                    _store.deleteFile(companyId, repositoryId, safeFileName, versionLabel);
161            }
162    
163            @Override
164            public File getFile(long companyId, long repositoryId, String fileName)
165                    throws PortalException {
166    
167                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
168    
169                    if (!safeFileName.equals(fileName) &&
170                            _store.hasFile(companyId, repositoryId, fileName)) {
171    
172                            return _store.getFile(companyId, repositoryId, fileName);
173                    }
174    
175                    return _store.getFile(companyId, repositoryId, safeFileName);
176            }
177    
178            @Override
179            public File getFile(
180                            long companyId, long repositoryId, String fileName,
181                            String versionLabel)
182                    throws PortalException {
183    
184                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
185    
186                    if (!safeFileName.equals(fileName) &&
187                            _store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
188    
189                            return _store.getFile(
190                                    companyId, repositoryId, fileName, versionLabel);
191                    }
192    
193                    return _store.getFile(
194                            companyId, repositoryId, safeFileName, versionLabel);
195            }
196    
197            @Override
198            public byte[] getFileAsBytes(
199                            long companyId, long repositoryId, String fileName)
200                    throws PortalException {
201    
202                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
203    
204                    if (!safeFileName.equals(fileName) &&
205                            _store.hasFile(companyId, repositoryId, fileName)) {
206    
207                            return _store.getFileAsBytes(companyId, repositoryId, fileName);
208                    }
209    
210                    return _store.getFileAsBytes(companyId, repositoryId, safeFileName);
211            }
212    
213            @Override
214            public byte[] getFileAsBytes(
215                            long companyId, long repositoryId, String fileName,
216                            String versionLabel)
217                    throws PortalException {
218    
219                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
220    
221                    if (!safeFileName.equals(fileName) &&
222                            _store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
223    
224                            return _store.getFileAsBytes(
225                                    companyId, repositoryId, fileName, versionLabel);
226                    }
227    
228                    return _store.getFileAsBytes(
229                            companyId, repositoryId, safeFileName, versionLabel);
230            }
231    
232            @Override
233            public InputStream getFileAsStream(
234                            long companyId, long repositoryId, String fileName)
235                    throws PortalException {
236    
237                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
238    
239                    if (!safeFileName.equals(fileName) &&
240                            _store.hasFile(companyId, repositoryId, fileName)) {
241    
242                            return _store.getFileAsStream(companyId, repositoryId, fileName);
243                    }
244    
245                    return _store.getFileAsStream(companyId, repositoryId, safeFileName);
246            }
247    
248            @Override
249            public InputStream getFileAsStream(
250                            long companyId, long repositoryId, String fileName,
251                            String versionLabel)
252                    throws PortalException {
253    
254                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
255    
256                    if (!safeFileName.equals(fileName) &&
257                            _store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
258    
259                            return _store.getFileAsStream(
260                                    companyId, repositoryId, fileName, versionLabel);
261                    }
262    
263                    return _store.getFileAsStream(
264                            companyId, repositoryId, safeFileName, versionLabel);
265            }
266    
267            @Override
268            public String[] getFileNames(long companyId, long repositoryId) {
269                    String[] fileNames = _store.getFileNames(companyId, repositoryId);
270    
271                    String[] decodedFileNames = new String[fileNames.length];
272    
273                    for (int i = 0; i < fileNames.length; i++) {
274                            decodedFileNames[i] = FileUtil.decodeSafeFileName(fileNames[i]);
275                    }
276    
277                    return decodedFileNames;
278            }
279    
280            @Override
281            public String[] getFileNames(
282                            long companyId, long repositoryId, String dirName)
283                    throws PortalException {
284    
285                    String safeDirName = FileUtil.encodeSafeFileName(dirName);
286    
287                    if (!safeDirName.equals(dirName)) {
288                            try {
289                                    _store.move(dirName, safeDirName);
290                            }
291                            catch (Exception e) {
292                            }
293                    }
294    
295                    String[] fileNames = _store.getFileNames(
296                            companyId, repositoryId, safeDirName);
297    
298                    String[] decodedFileNames = new String[fileNames.length];
299    
300                    for (int i = 0; i < fileNames.length; i++) {
301                            decodedFileNames[i] = FileUtil.decodeSafeFileName(fileNames[i]);
302                    }
303    
304                    return decodedFileNames;
305            }
306    
307            @Override
308            public long getFileSize(long companyId, long repositoryId, String fileName)
309                    throws PortalException {
310    
311                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
312    
313                    if (!safeFileName.equals(fileName) &&
314                            _store.hasFile(companyId, repositoryId, fileName)) {
315    
316                            return _store.getFileSize(companyId, repositoryId, fileName);
317                    }
318    
319                    return _store.getFileSize(companyId, repositoryId, safeFileName);
320            }
321    
322            @Override
323            public boolean hasDirectory(
324                            long companyId, long repositoryId, String dirName)
325                    throws PortalException {
326    
327                    String safeDirName = FileUtil.encodeSafeFileName(dirName);
328    
329                    return _store.hasDirectory(companyId, repositoryId, safeDirName);
330            }
331    
332            @Override
333            public boolean hasFile(long companyId, long repositoryId, String fileName)
334                    throws PortalException {
335    
336                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
337    
338                    if (!safeFileName.equals(fileName) &&
339                            _store.hasFile(companyId, repositoryId, fileName)) {
340    
341                            return true;
342                    }
343    
344                    return _store.hasFile(companyId, repositoryId, safeFileName);
345            }
346    
347            @Override
348            public boolean hasFile(
349                            long companyId, long repositoryId, String fileName,
350                            String versionLabel)
351                    throws PortalException {
352    
353                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
354    
355                    if (!safeFileName.equals(fileName) &&
356                            _store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
357    
358                            return true;
359                    }
360    
361                    return _store.hasFile(
362                            companyId, repositoryId, safeFileName, versionLabel);
363            }
364    
365            @Override
366            public void move(String srcDir, String destDir) {
367                    _store.move(srcDir, destDir);
368            }
369    
370            @Override
371            public void updateFile(
372                            long companyId, long repositoryId, long newRepositoryId,
373                            String fileName)
374                    throws PortalException {
375    
376                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
377    
378                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
379    
380                    _store.updateFile(
381                            companyId, repositoryId, newRepositoryId, safeFileName);
382            }
383    
384            @Override
385            public void updateFile(
386                            long companyId, long repositoryId, String fileName,
387                            String newFileName)
388                    throws PortalException {
389    
390                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
391                    String safeNewFileName = FileUtil.encodeSafeFileName(newFileName);
392    
393                    if (!safeFileName.equals(fileName)) {
394                            if (_store.hasFile(
395                                            companyId, repositoryId, fileName,
396                                            DLFileEntryConstants.VERSION_DEFAULT)) {
397    
398                                    safeFileName = fileName;
399                            }
400                    }
401    
402                    _store.updateFile(
403                            companyId, repositoryId, safeFileName, safeNewFileName);
404            }
405    
406            @Override
407            public void updateFile(
408                            long companyId, long repositoryId, String fileName,
409                            String versionLabel, byte[] bytes)
410                    throws PortalException {
411    
412                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
413    
414                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
415    
416                    _store.updateFile(
417                            companyId, repositoryId, safeFileName, versionLabel, bytes);
418            }
419    
420            @Override
421            public void updateFile(
422                            long companyId, long repositoryId, String fileName,
423                            String versionLabel, File file)
424                    throws PortalException {
425    
426                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
427    
428                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
429    
430                    _store.updateFile(
431                            companyId, repositoryId, safeFileName, versionLabel, file);
432            }
433    
434            @Override
435            public void updateFile(
436                            long companyId, long repositoryId, String fileName,
437                            String versionLabel, InputStream is)
438                    throws PortalException {
439    
440                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
441    
442                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
443    
444                    _store.updateFile(
445                            companyId, repositoryId, safeFileName, versionLabel, is);
446            }
447    
448            @Override
449            public void updateFileVersion(
450                            long companyId, long repositoryId, String fileName,
451                            String fromVersionLabel, String toVersionLabel)
452                    throws PortalException {
453    
454                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
455    
456                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
457    
458                    _store.updateFileVersion(
459                            companyId, repositoryId, safeFileName, fromVersionLabel,
460                            toVersionLabel);
461            }
462    
463            protected void renameUnsafeFile(
464                            long companyId, long repositoryId, String fileName,
465                            String safeFileName)
466                    throws PortalException {
467    
468                    if (!safeFileName.equals(fileName)) {
469                            if (_store.hasFile(
470                                            companyId, repositoryId, fileName,
471                                            DLFileEntryConstants.VERSION_DEFAULT)) {
472    
473                                    _store.updateFile(
474                                            companyId, repositoryId, fileName, safeFileName);
475                            }
476                    }
477            }
478    
479            private Store _store;
480    
481    }