001    /**
002     * Copyright (c) 2000-2013 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 extends BaseStoreWrapper {
030    
031            public SafeFileNameStoreWrapper(Store store) {
032                    super(store);
033            }
034    
035            @Override
036            public void addDirectory(long companyId, long repositoryId, String dirName)
037                    throws PortalException, SystemException {
038    
039                    Store store = getStore();
040    
041                    String safeDirName = FileUtil.encodeSafeFileName(dirName);
042    
043                    if (!safeDirName.equals(dirName)) {
044                            try {
045                                    store.move(dirName, safeDirName);
046                            }
047                            catch (Exception e) {
048                            }
049                    }
050    
051                    store.addDirectory(companyId, repositoryId, safeDirName);
052            }
053    
054            @Override
055            public void addFile(
056                            long companyId, long repositoryId, String fileName, byte[] bytes)
057                    throws PortalException, SystemException {
058    
059                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
060    
061                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
062    
063                    Store store = getStore();
064    
065                    store.addFile(companyId, repositoryId, safeFileName, bytes);
066            }
067    
068            @Override
069            public void addFile(
070                            long companyId, long repositoryId, String fileName, File file)
071                    throws PortalException, SystemException {
072    
073                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
074    
075                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
076    
077                    Store store = getStore();
078    
079                    store.addFile(companyId, repositoryId, safeFileName, file);
080            }
081    
082            @Override
083            public void addFile(
084                            long companyId, long repositoryId, String fileName, InputStream is)
085                    throws PortalException, SystemException {
086    
087                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
088    
089                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
090    
091                    Store store = getStore();
092    
093                    store.addFile(companyId, repositoryId, safeFileName, is);
094            }
095    
096            @Override
097            public void checkRoot(long companyId) throws SystemException {
098                    Store store = getStore();
099    
100                    store.checkRoot(companyId);
101            }
102    
103            @Override
104            public void copyFileVersion(
105                            long companyId, long repositoryId, String fileName,
106                            String fromVersionLabel, String toVersionLabel)
107                    throws PortalException, SystemException {
108    
109                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
110    
111                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
112    
113                    Store store = getStore();
114    
115                    store.copyFileVersion(
116                            companyId, repositoryId, safeFileName, fromVersionLabel,
117                            toVersionLabel);
118            }
119    
120            @Override
121            public void deleteDirectory(
122                            long companyId, long repositoryId, String dirName)
123                    throws PortalException, SystemException {
124    
125                    Store store = getStore();
126    
127                    String safeDirName = FileUtil.encodeSafeFileName(dirName);
128    
129                    if (!safeDirName.equals(dirName)) {
130                            try {
131                                    store.deleteDirectory(companyId, repositoryId, dirName);
132    
133                                    return;
134                            }
135                            catch (Exception e) {
136                            }
137                    }
138    
139                    store.deleteDirectory(companyId, repositoryId, safeDirName);
140            }
141    
142            @Override
143            public void deleteFile(long companyId, long repositoryId, String fileName)
144                    throws PortalException, SystemException {
145    
146                    Store store = getStore();
147    
148                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
149    
150                    if (!safeFileName.equals(fileName) &&
151                            store.hasFile(companyId, repositoryId, fileName)) {
152    
153                            store.deleteFile(companyId, repositoryId, fileName);
154    
155                            return;
156                    }
157    
158                    store.deleteFile(companyId, repositoryId, safeFileName);
159            }
160    
161            @Override
162            public void deleteFile(
163                            long companyId, long repositoryId, String fileName,
164                            String versionLabel)
165                    throws PortalException, SystemException {
166    
167                    Store store = getStore();
168    
169                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
170    
171                    if (!safeFileName.equals(fileName) &&
172                            store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
173    
174                            store.deleteFile(companyId, repositoryId, fileName, versionLabel);
175    
176                            return;
177                    }
178    
179                    store.deleteFile(companyId, repositoryId, safeFileName, versionLabel);
180            }
181    
182            @Override
183            public File getFile(long companyId, long repositoryId, String fileName)
184                    throws PortalException, SystemException {
185    
186                    Store store = getStore();
187    
188                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
189    
190                    if (!safeFileName.equals(fileName) &&
191                            store.hasFile(companyId, repositoryId, fileName)) {
192    
193                            return store.getFile(companyId, repositoryId, fileName);
194                    }
195    
196                    return store.getFile(companyId, repositoryId, safeFileName);
197            }
198    
199            @Override
200            public File getFile(
201                            long companyId, long repositoryId, String fileName,
202                            String versionLabel)
203                    throws PortalException, SystemException {
204    
205                    Store store = getStore();
206    
207                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
208    
209                    if (!safeFileName.equals(fileName) &&
210                            store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
211    
212                            return store.getFile(
213                                    companyId, repositoryId, fileName, versionLabel);
214                    }
215    
216                    return store.getFile(
217                            companyId, repositoryId, safeFileName, versionLabel);
218            }
219    
220            @Override
221            public byte[] getFileAsBytes(
222                            long companyId, long repositoryId, String fileName)
223                    throws PortalException, SystemException {
224    
225                    Store store = getStore();
226    
227                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
228    
229                    if (!safeFileName.equals(fileName) &&
230                            store.hasFile(companyId, repositoryId, fileName)) {
231    
232                            return store.getFileAsBytes(companyId, repositoryId, fileName);
233                    }
234    
235                    return store.getFileAsBytes(companyId, repositoryId, safeFileName);
236            }
237    
238            @Override
239            public byte[] getFileAsBytes(
240                            long companyId, long repositoryId, String fileName,
241                            String versionLabel)
242                    throws PortalException, SystemException {
243    
244                    Store store = getStore();
245    
246                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
247    
248                    if (!safeFileName.equals(fileName) &&
249                            store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
250    
251                            return store.getFileAsBytes(
252                                    companyId, repositoryId, fileName, versionLabel);
253                    }
254    
255                    return store.getFileAsBytes(
256                            companyId, repositoryId, safeFileName, versionLabel);
257            }
258    
259            @Override
260            public InputStream getFileAsStream(
261                            long companyId, long repositoryId, String fileName)
262                    throws PortalException, SystemException {
263    
264                    Store store = getStore();
265    
266                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
267    
268                    if (!safeFileName.equals(fileName) &&
269                            store.hasFile(companyId, repositoryId, fileName)) {
270    
271                            return store.getFileAsStream(companyId, repositoryId, fileName);
272                    }
273    
274                    return store.getFileAsStream(companyId, repositoryId, safeFileName);
275            }
276    
277            @Override
278            public InputStream getFileAsStream(
279                            long companyId, long repositoryId, String fileName,
280                            String versionLabel)
281                    throws PortalException, SystemException {
282    
283                    Store store = getStore();
284    
285                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
286    
287                    if (!safeFileName.equals(fileName) &&
288                            store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
289    
290                            return store.getFileAsStream(
291                                    companyId, repositoryId, fileName, versionLabel);
292                    }
293    
294                    return store.getFileAsStream(
295                            companyId, repositoryId, safeFileName, versionLabel);
296            }
297    
298            @Override
299            public String[] getFileNames(long companyId, long repositoryId)
300                    throws SystemException {
301    
302                    Store store = getStore();
303    
304                    String[] fileNames = store.getFileNames(companyId, repositoryId);
305    
306                    String[] decodedFileNames = new String[fileNames.length];
307    
308                    for (int i = 0; i < fileNames.length; i++) {
309                            decodedFileNames[i] = FileUtil.decodeSafeFileName(fileNames[i]);
310                    }
311    
312                    return decodedFileNames;
313            }
314    
315            @Override
316            public String[] getFileNames(
317                            long companyId, long repositoryId, String dirName)
318                    throws PortalException, SystemException {
319    
320                    Store store = getStore();
321    
322                    String safeDirName = FileUtil.encodeSafeFileName(dirName);
323    
324                    if (!safeDirName.equals(dirName)) {
325                            try {
326                                    store.move(dirName, safeDirName);
327                            }
328                            catch (Exception e) {
329                            }
330                    }
331    
332                    String[] fileNames = store.getFileNames(
333                            companyId, repositoryId, safeDirName);
334    
335                    String[] decodedFileNames = new String[fileNames.length];
336    
337                    for (int i = 0; i < fileNames.length; i++) {
338                            decodedFileNames[i] = FileUtil.decodeSafeFileName(fileNames[i]);
339                    }
340    
341                    return decodedFileNames;
342            }
343    
344            @Override
345            public long getFileSize(long companyId, long repositoryId, String fileName)
346                    throws PortalException, SystemException {
347    
348                    Store store = getStore();
349    
350                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
351    
352                    if (!safeFileName.equals(fileName) &&
353                            store.hasFile(companyId, repositoryId, fileName)) {
354    
355                            return store.getFileSize(companyId, repositoryId, fileName);
356                    }
357    
358                    return store.getFileSize(companyId, repositoryId, safeFileName);
359            }
360    
361            @Override
362            public boolean hasDirectory(
363                            long companyId, long repositoryId, String dirName)
364                    throws PortalException, SystemException {
365    
366                    Store store = getStore();
367    
368                    String safeDirName = FileUtil.encodeSafeFileName(dirName);
369    
370                    return store.hasDirectory(companyId, repositoryId, safeDirName);
371            }
372    
373            @Override
374            public boolean hasFile(long companyId, long repositoryId, String fileName)
375                    throws PortalException, SystemException {
376    
377                    Store store = getStore();
378    
379                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
380    
381                    if (!safeFileName.equals(fileName) &&
382                            store.hasFile(companyId, repositoryId, fileName)) {
383    
384                            return true;
385                    }
386    
387                    return store.hasFile(companyId, repositoryId, safeFileName);
388            }
389    
390            @Override
391            public boolean hasFile(
392                            long companyId, long repositoryId, String fileName,
393                            String versionLabel)
394                    throws PortalException, SystemException {
395    
396                    Store store = getStore();
397    
398                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
399    
400                    if (!safeFileName.equals(fileName) &&
401                            store.hasFile(companyId, repositoryId, fileName, versionLabel)) {
402    
403                            return true;
404                    }
405    
406                    return store.hasFile(
407                            companyId, repositoryId, safeFileName, versionLabel);
408            }
409    
410            @Override
411            public void move(String srcDir, String destDir) throws SystemException {
412                    Store store = getStore();
413    
414                    store.move(srcDir, destDir);
415            }
416    
417            @Override
418            public void updateFile(
419                            long companyId, long repositoryId, long newRepositoryId,
420                            String fileName)
421                    throws PortalException, SystemException {
422    
423                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
424    
425                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
426    
427                    Store store = getStore();
428    
429                    store.updateFile(
430                            companyId, repositoryId, newRepositoryId, safeFileName);
431            }
432    
433            @Override
434            public void updateFile(
435                            long companyId, long repositoryId, String fileName,
436                            String newFileName)
437                    throws PortalException, SystemException {
438    
439                    Store store = getStore();
440    
441                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
442                    String safeNewFileName = FileUtil.encodeSafeFileName(newFileName);
443    
444                    if (!safeFileName.equals(fileName)) {
445                            if (store.hasFile(
446                                            companyId, repositoryId, fileName,
447                                            DLFileEntryConstants.VERSION_DEFAULT)) {
448    
449                                    safeFileName = fileName;
450                            }
451                    }
452    
453                    store.updateFile(
454                            companyId, repositoryId, safeFileName, safeNewFileName);
455            }
456    
457            @Override
458            public void updateFile(
459                            long companyId, long repositoryId, String fileName,
460                            String versionLabel, byte[] bytes)
461                    throws PortalException, SystemException {
462    
463                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
464    
465                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
466    
467                    Store store = getStore();
468    
469                    store.updateFile(
470                            companyId, repositoryId, safeFileName, versionLabel, bytes);
471            }
472    
473            @Override
474            public void updateFile(
475                            long companyId, long repositoryId, String fileName,
476                            String versionLabel, File file)
477                    throws PortalException, SystemException {
478    
479                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
480    
481                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
482    
483                    Store store = getStore();
484    
485                    store.updateFile(
486                            companyId, repositoryId, safeFileName, versionLabel, file);
487            }
488    
489            @Override
490            public void updateFile(
491                            long companyId, long repositoryId, String fileName,
492                            String versionLabel, InputStream is)
493                    throws PortalException, SystemException {
494    
495                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
496    
497                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
498    
499                    Store store = getStore();
500    
501                    store.updateFile(
502                            companyId, repositoryId, safeFileName, versionLabel, is);
503            }
504    
505            @Override
506            public void updateFileVersion(
507                            long companyId, long repositoryId, String fileName,
508                            String fromVersionLabel, String toVersionLabel)
509                    throws PortalException, SystemException {
510    
511                    String safeFileName = FileUtil.encodeSafeFileName(fileName);
512    
513                    renameUnsafeFile(companyId, repositoryId, fileName, safeFileName);
514    
515                    Store store = getStore();
516    
517                    store.updateFileVersion(
518                            companyId, repositoryId, safeFileName, fromVersionLabel,
519                            toVersionLabel);
520            }
521    
522            protected void renameUnsafeFile(
523                            long companyId, long repositoryId, String fileName,
524                            String safeFileName)
525                    throws PortalException, SystemException {
526    
527                    if (!safeFileName.equals(fileName)) {
528                            Store store = getStore();
529    
530                            if (store.hasFile(
531                                            companyId, repositoryId, fileName,
532                                            DLFileEntryConstants.VERSION_DEFAULT)) {
533    
534                                    store.updateFile(
535                                            companyId, repositoryId, fileName, safeFileName);
536                            }
537                    }
538            }
539    
540    }