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(
036                    long companyId, long repositoryId, String dirName) {
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    
111                    String safeDirName = FileUtil.encodeSafeFileName(dirName);
112    
113                    if (!safeDirName.equals(dirName)) {
114                            try {
115                                    _store.deleteDirectory(companyId, repositoryId, dirName);
116    
117                                    return;
118                            }
119                            catch (Exception e) {
120                            }
121                    }
122    
123                    _store.deleteDirectory(companyId, repositoryId, safeDirName);
124            }
125    
126            @Override
127            public void deleteFile(long companyId, long repositoryId, String fileName) {
128                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
129    
130                    if (!safeFileName.equals(fileName) &&
131                            _store.hasFile(companyId, repositoryId, fileName)) {
132    
133                            _store.deleteFile(companyId, repositoryId, fileName);
134    
135                            return;
136                    }
137    
138                    _store.deleteFile(companyId, repositoryId, safeFileName);
139            }
140    
141            @Override
142            public void deleteFile(
143                    long companyId, long repositoryId, String fileName,
144                    String versionLabel) {
145    
146                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
147    
148                    if (!safeFileName.equals(fileName) &&
149                            _store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
150    
151                            _store.deleteFile(companyId, repositoryId, fileName, versionLabel);
152    
153                            return;
154                    }
155    
156                    _store.deleteFile(companyId, repositoryId, safeFileName, versionLabel);
157            }
158    
159            @Override
160            public File getFile(long companyId, long repositoryId, String fileName)
161                    throws PortalException {
162    
163                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
164    
165                    if (!safeFileName.equals(fileName) &&
166                            _store.hasFile(companyId, repositoryId, fileName)) {
167    
168                            return _store.getFile(companyId, repositoryId, fileName);
169                    }
170    
171                    return _store.getFile(companyId, repositoryId, safeFileName);
172            }
173    
174            @Override
175            public File getFile(
176                            long companyId, long repositoryId, String fileName,
177                            String versionLabel)
178                    throws PortalException {
179    
180                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
181    
182                    if (!safeFileName.equals(fileName) &&
183                            _store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
184    
185                            return _store.getFile(
186                                    companyId, repositoryId, fileName, versionLabel);
187                    }
188    
189                    return _store.getFile(
190                            companyId, repositoryId, safeFileName, versionLabel);
191            }
192    
193            @Override
194            public byte[] getFileAsBytes(
195                            long companyId, long repositoryId, String fileName)
196                    throws PortalException {
197    
198                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
199    
200                    if (!safeFileName.equals(fileName) &&
201                            _store.hasFile(companyId, repositoryId, fileName)) {
202    
203                            return _store.getFileAsBytes(companyId, repositoryId, fileName);
204                    }
205    
206                    return _store.getFileAsBytes(companyId, repositoryId, safeFileName);
207            }
208    
209            @Override
210            public byte[] getFileAsBytes(
211                            long companyId, long repositoryId, String fileName,
212                            String versionLabel)
213                    throws PortalException {
214    
215                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
216    
217                    if (!safeFileName.equals(fileName) &&
218                            _store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
219    
220                            return _store.getFileAsBytes(
221                                    companyId, repositoryId, fileName, versionLabel);
222                    }
223    
224                    return _store.getFileAsBytes(
225                            companyId, repositoryId, safeFileName, versionLabel);
226            }
227    
228            @Override
229            public InputStream getFileAsStream(
230                            long companyId, long repositoryId, String fileName)
231                    throws PortalException {
232    
233                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
234    
235                    if (!safeFileName.equals(fileName) &&
236                            _store.hasFile(companyId, repositoryId, fileName)) {
237    
238                            return _store.getFileAsStream(companyId, repositoryId, fileName);
239                    }
240    
241                    return _store.getFileAsStream(companyId, repositoryId, safeFileName);
242            }
243    
244            @Override
245            public InputStream getFileAsStream(
246                            long companyId, long repositoryId, String fileName,
247                            String versionLabel)
248                    throws PortalException {
249    
250                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
251    
252                    if (!safeFileName.equals(fileName) &&
253                            _store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
254    
255                            return _store.getFileAsStream(
256                                    companyId, repositoryId, fileName, versionLabel);
257                    }
258    
259                    return _store.getFileAsStream(
260                            companyId, repositoryId, safeFileName, versionLabel);
261            }
262    
263            @Override
264            public String[] getFileNames(long companyId, long repositoryId) {
265                    String[] fileNames = _store.getFileNames(companyId, repositoryId);
266    
267                    String[] decodedFileNames = new String[fileNames.length];
268    
269                    for (int i = 0; i < fileNames.length; i++) {
270                            decodedFileNames[i] = FileUtil.decodeSafeFileName(fileNames[i]);
271                    }
272    
273                    return decodedFileNames;
274            }
275    
276            @Override
277            public String[] getFileNames(
278                    long companyId, long repositoryId, String dirName) {
279    
280                    String safeDirName = FileUtil.encodeSafeFileName(dirName);
281    
282                    if (!safeDirName.equals(dirName)) {
283                            try {
284                                    _store.move(dirName, safeDirName);
285                            }
286                            catch (Exception e) {
287                            }
288                    }
289    
290                    String[] fileNames = _store.getFileNames(
291                            companyId, repositoryId, safeDirName);
292    
293                    String[] decodedFileNames = new String[fileNames.length];
294    
295                    for (int i = 0; i < fileNames.length; i++) {
296                            decodedFileNames[i] = FileUtil.decodeSafeFileName(fileNames[i]);
297                    }
298    
299                    return decodedFileNames;
300            }
301    
302            @Override
303            public long getFileSize(long companyId, long repositoryId, String fileName)
304                    throws PortalException {
305    
306                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
307    
308                    if (!safeFileName.equals(fileName) &&
309                            _store.hasFile(companyId, repositoryId, fileName)) {
310    
311                            return _store.getFileSize(companyId, repositoryId, fileName);
312                    }
313    
314                    return _store.getFileSize(companyId, repositoryId, safeFileName);
315            }
316    
317            @Override
318            public boolean hasDirectory(
319                    long companyId, long repositoryId, String dirName) {
320    
321                    String safeDirName = FileUtil.encodeSafeFileName(dirName);
322    
323                    return _store.hasDirectory(companyId, repositoryId, safeDirName);
324            }
325    
326            @Override
327            public boolean hasFile(long companyId, long repositoryId, String fileName) {
328                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
329    
330                    if (!safeFileName.equals(fileName) &&
331                            _store.hasFile(companyId, repositoryId, fileName)) {
332    
333                            return true;
334                    }
335    
336                    return _store.hasFile(companyId, repositoryId, safeFileName);
337            }
338    
339            @Override
340            public boolean hasFile(
341                    long companyId, long repositoryId, String fileName,
342                    String versionLabel) {
343    
344                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
345    
346                    if (!safeFileName.equals(fileName) &&
347                            _store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
348    
349                            return true;
350                    }
351    
352                    return _store.hasFile(
353                            companyId, repositoryId, safeFileName, versionLabel);
354            }
355    
356            @Override
357            public void move(String srcDir, String destDir) {
358                    _store.move(srcDir, destDir);
359            }
360    
361            @Override
362            public void updateFile(
363                            long companyId, long repositoryId, long newRepositoryId,
364                            String fileName)
365                    throws PortalException {
366    
367                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
368    
369                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
370    
371                    _store.updateFile(
372                            companyId, repositoryId, newRepositoryId, safeFileName);
373            }
374    
375            @Override
376            public void updateFile(
377                            long companyId, long repositoryId, String fileName,
378                            String newFileName)
379                    throws PortalException {
380    
381                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
382                    String safeNewFileName = FileUtil.encodeSafeFileName(newFileName);
383    
384                    if (!safeFileName.equals(fileName)) {
385                            if (_store.hasFile(
386                                            companyId, repositoryId, fileName,
387                                            DLFileEntryConstants.VERSION_DEFAULT)) {
388    
389                                    safeFileName = fileName;
390                            }
391                    }
392    
393                    _store.updateFile(
394                            companyId, repositoryId, safeFileName, safeNewFileName);
395            }
396    
397            @Override
398            public void updateFile(
399                            long companyId, long repositoryId, String fileName,
400                            String versionLabel, byte[] bytes)
401                    throws PortalException {
402    
403                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
404    
405                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
406    
407                    _store.updateFile(
408                            companyId, repositoryId, safeFileName, versionLabel, bytes);
409            }
410    
411            @Override
412            public void updateFile(
413                            long companyId, long repositoryId, String fileName,
414                            String versionLabel, File file)
415                    throws PortalException {
416    
417                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
418    
419                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
420    
421                    _store.updateFile(
422                            companyId, repositoryId, safeFileName, versionLabel, file);
423            }
424    
425            @Override
426            public void updateFile(
427                            long companyId, long repositoryId, String fileName,
428                            String versionLabel, InputStream is)
429                    throws PortalException {
430    
431                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
432    
433                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
434    
435                    _store.updateFile(
436                            companyId, repositoryId, safeFileName, versionLabel, is);
437            }
438    
439            @Override
440            public void updateFileVersion(
441                            long companyId, long repositoryId, String fileName,
442                            String fromVersionLabel, String toVersionLabel)
443                    throws PortalException {
444    
445                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
446    
447                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
448    
449                    _store.updateFileVersion(
450                            companyId, repositoryId, safeFileName, fromVersionLabel,
451                            toVersionLabel);
452            }
453    
454            protected void renameUnsafeFile(
455                            long companyId, long repositoryId, String fileName,
456                            String safeFileName)
457                    throws PortalException {
458    
459                    if (!safeFileName.equals(fileName)) {
460                            if (_store.hasFile(
461                                            companyId, repositoryId, fileName,
462                                            DLFileEntryConstants.VERSION_DEFAULT)) {
463    
464                                    _store.updateFile(
465                                            companyId, repositoryId, fileName, safeFileName);
466                            }
467                    }
468            }
469    
470            private final Store _store;
471    
472    }