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