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