001
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
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 }