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