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