001
014
015 package com.liferay.portlet.documentlibrary.util;
016
017 import com.liferay.portal.kernel.util.FileUtil;
018 import com.liferay.portal.kernel.util.PropsKeys;
019 import com.liferay.portal.kernel.util.StringPool;
020 import com.liferay.portal.kernel.util.StringUtil;
021 import com.liferay.portal.kernel.util.UnicodeFormatter;
022 import com.liferay.portal.kernel.util.Validator;
023 import com.liferay.portal.util.PrefsPropsUtil;
024 import com.liferay.portal.util.PropsValues;
025 import com.liferay.portlet.documentlibrary.FileExtensionException;
026 import com.liferay.portlet.documentlibrary.FileNameException;
027 import com.liferay.portlet.documentlibrary.FileSizeException;
028 import com.liferay.portlet.documentlibrary.FolderNameException;
029 import com.liferay.portlet.documentlibrary.InvalidFileVersionException;
030 import com.liferay.portlet.documentlibrary.SourceFileNameException;
031 import com.liferay.portlet.documentlibrary.webdav.DLWebDAVUtil;
032
033 import java.io.File;
034 import java.io.IOException;
035 import java.io.InputStream;
036
037
040 public final class DLValidatorImpl implements DLValidator {
041
042 @Override
043 public String fixName(String name) {
044 if (Validator.isNull(name)) {
045 return StringPool.UNDERLINE;
046 }
047
048 for (String blacklistChar : PropsValues.DL_CHAR_BLACKLIST) {
049 name = StringUtil.replace(
050 name, blacklistChar, StringPool.UNDERLINE);
051 }
052
053 name = replaceDLCharLastBlacklist(name);
054
055 return replaceDLNameBlacklist(name);
056 }
057
058 @Override
059 public boolean isValidName(String name) {
060 if (Validator.isNull(name)) {
061 return false;
062 }
063
064 for (String blacklistChar : PropsValues.DL_CHAR_BLACKLIST) {
065 if (name.contains(blacklistChar)) {
066 return false;
067 }
068 }
069
070 for (String blacklistLastChar : PropsValues.DL_CHAR_LAST_BLACKLIST) {
071 if (blacklistLastChar.startsWith(UnicodeFormatter.UNICODE_PREFIX)) {
072 blacklistLastChar = UnicodeFormatter.parseString(
073 blacklistLastChar);
074 }
075
076 if (name.endsWith(blacklistLastChar)) {
077 return false;
078 }
079 }
080
081 String nameWithoutExtension = FileUtil.stripExtension(name);
082
083 for (String blacklistName : PropsValues.DL_NAME_BLACKLIST) {
084 if (StringUtil.equalsIgnoreCase(
085 nameWithoutExtension, blacklistName)) {
086
087 return false;
088 }
089 }
090
091 return true;
092 }
093
094 @Override
095 public void validateDirectoryName(String directoryName)
096 throws FolderNameException {
097
098 if (!isValidName(directoryName)) {
099 throw new FolderNameException(directoryName);
100 }
101 }
102
103 @Override
104 public void validateFileExtension(String fileName)
105 throws FileExtensionException {
106
107 boolean validFileExtension = false;
108
109 String[] fileExtensions = PrefsPropsUtil.getStringArray(
110 PropsKeys.DL_FILE_EXTENSIONS, StringPool.COMMA);
111
112 for (String fileExtension : fileExtensions) {
113 if (StringPool.STAR.equals(fileExtension) ||
114 StringUtil.endsWith(fileName, fileExtension)) {
115
116 validFileExtension = true;
117
118 break;
119 }
120 }
121
122 if (!validFileExtension) {
123 throw new FileExtensionException(fileName);
124 }
125 }
126
127 @Override
128 public void validateFileName(String fileName) throws FileNameException {
129 if (!isValidName(fileName)) {
130 throw new FileNameException(fileName);
131 }
132
133 if (!DLWebDAVUtil.isRepresentableTitle(fileName)) {
134 throw new FileNameException(
135 "Unrepresentable WebDAV title for file name " + fileName);
136 }
137 }
138
139 @Override
140 public void validateFileSize(String fileName, byte[] bytes)
141 throws FileSizeException {
142
143 if (bytes == null) {
144 throw new FileSizeException(fileName);
145 }
146
147 validateFileSize(fileName, bytes.length);
148 }
149
150 @Override
151 public void validateFileSize(String fileName, File file)
152 throws FileSizeException {
153
154 if (file == null) {
155 throw new FileSizeException(fileName);
156 }
157
158 validateFileSize(fileName, file.length());
159 }
160
161 @Override
162 public void validateFileSize(String fileName, InputStream is)
163 throws FileSizeException {
164
165 try {
166 if (is == null) {
167 throw new FileSizeException(fileName);
168 }
169
170 validateFileSize(fileName, is.available());
171 }
172 catch (IOException ioe) {
173 new FileSizeException(ioe);
174 }
175 }
176
177 @Override
178 public void validateFileSize(String fileName, long size)
179 throws FileSizeException {
180
181 long maxSize = PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE);
182
183 if ((maxSize > 0) && (size > maxSize)) {
184 throw new FileSizeException(fileName);
185 }
186 }
187
188 @Override
189 public void validateSourceFileExtension(
190 String fileExtension, String sourceFileName)
191 throws SourceFileNameException {
192
193 String sourceFileExtension = FileUtil.getExtension(sourceFileName);
194
195 if (Validator.isNotNull(sourceFileName) &&
196 PropsValues.DL_FILE_EXTENSIONS_STRICT_CHECK &&
197 !fileExtension.equals(sourceFileExtension)) {
198
199 throw new SourceFileNameException(sourceFileExtension);
200 }
201 }
202
203 @Override
204 public void validateVersionLabel(String versionLabel)
205 throws InvalidFileVersionException {
206
207 if (Validator.isNull(versionLabel)) {
208 return;
209 }
210
211 if (!DLUtil.isValidVersion(versionLabel)) {
212 throw new InvalidFileVersionException();
213 }
214 }
215
216 protected String replaceDLCharLastBlacklist(String title) {
217 String previousTitle = null;
218
219 while (!title.equals(previousTitle)) {
220 previousTitle = title;
221
222 for (String blacklistLastChar :
223 PropsValues.DL_CHAR_LAST_BLACKLIST) {
224
225 if (blacklistLastChar.startsWith(
226 UnicodeFormatter.UNICODE_PREFIX)) {
227
228 blacklistLastChar = UnicodeFormatter.parseString(
229 blacklistLastChar);
230 }
231
232 if (title.endsWith(blacklistLastChar)) {
233 title = StringUtil.replaceLast(
234 title, blacklistLastChar, StringPool.BLANK);
235 }
236 }
237 }
238
239 return title;
240 }
241
242 protected String replaceDLNameBlacklist(String title) {
243 String extension = FileUtil.getExtension(title);
244 String nameWithoutExtension = FileUtil.stripExtension(title);
245
246 for (String blacklistName : PropsValues.DL_NAME_BLACKLIST) {
247 if (StringUtil.equalsIgnoreCase(
248 nameWithoutExtension, blacklistName)) {
249
250 if (Validator.isNull(extension)) {
251 return nameWithoutExtension + StringPool.UNDERLINE;
252 }
253
254 return nameWithoutExtension + StringPool.UNDERLINE +
255 StringPool.PERIOD + extension;
256 }
257 }
258
259 return title;
260 }
261
262 }