001
014
015 package com.liferay.portal.webserver;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.exception.SystemException;
019 import com.liferay.portal.kernel.image.ImageBag;
020 import com.liferay.portal.kernel.image.ImageToolUtil;
021 import com.liferay.portal.kernel.log.Log;
022 import com.liferay.portal.kernel.log.LogFactoryUtil;
023 import com.liferay.portal.kernel.repository.RepositoryException;
024 import com.liferay.portal.kernel.repository.model.FileEntry;
025 import com.liferay.portal.kernel.repository.model.FileVersion;
026 import com.liferay.portal.kernel.repository.model.Folder;
027 import com.liferay.portal.kernel.servlet.HttpHeaders;
028 import com.liferay.portal.kernel.servlet.PortalSessionThreadLocal;
029 import com.liferay.portal.kernel.servlet.Range;
030 import com.liferay.portal.kernel.servlet.ServletResponseUtil;
031 import com.liferay.portal.kernel.template.Template;
032 import com.liferay.portal.kernel.template.TemplateConstants;
033 import com.liferay.portal.kernel.template.TemplateManagerUtil;
034 import com.liferay.portal.kernel.template.TemplateResource;
035 import com.liferay.portal.kernel.template.URLTemplateResource;
036 import com.liferay.portal.kernel.util.CharPool;
037 import com.liferay.portal.kernel.util.ContentTypes;
038 import com.liferay.portal.kernel.util.FastDateFormatFactoryUtil;
039 import com.liferay.portal.kernel.util.FileUtil;
040 import com.liferay.portal.kernel.util.GetterUtil;
041 import com.liferay.portal.kernel.util.HtmlUtil;
042 import com.liferay.portal.kernel.util.HttpUtil;
043 import com.liferay.portal.kernel.util.MimeTypesUtil;
044 import com.liferay.portal.kernel.util.ParamUtil;
045 import com.liferay.portal.kernel.util.ReleaseInfo;
046 import com.liferay.portal.kernel.util.SetUtil;
047 import com.liferay.portal.kernel.util.StringPool;
048 import com.liferay.portal.kernel.util.StringUtil;
049 import com.liferay.portal.kernel.util.UnicodeProperties;
050 import com.liferay.portal.kernel.util.Validator;
051 import com.liferay.portal.kernel.util.Validator_IW;
052 import com.liferay.portal.kernel.webdav.WebDAVUtil;
053 import com.liferay.portal.kernel.workflow.WorkflowConstants;
054 import com.liferay.portal.model.Company;
055 import com.liferay.portal.model.Group;
056 import com.liferay.portal.model.Image;
057 import com.liferay.portal.model.ImageConstants;
058 import com.liferay.portal.model.User;
059 import com.liferay.portal.model.impl.ImageImpl;
060 import com.liferay.portal.portletfilerepository.PortletFileRepositoryUtil;
061 import com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry;
062 import com.liferay.portal.repository.liferayrepository.model.LiferayFileVersion;
063 import com.liferay.portal.security.auth.PrincipalException;
064 import com.liferay.portal.security.auth.PrincipalThreadLocal;
065 import com.liferay.portal.security.permission.PermissionChecker;
066 import com.liferay.portal.security.permission.PermissionCheckerFactoryUtil;
067 import com.liferay.portal.security.permission.PermissionThreadLocal;
068 import com.liferay.portal.service.CompanyLocalServiceUtil;
069 import com.liferay.portal.service.GroupLocalServiceUtil;
070 import com.liferay.portal.service.ImageLocalServiceUtil;
071 import com.liferay.portal.service.ImageServiceUtil;
072 import com.liferay.portal.service.UserLocalServiceUtil;
073 import com.liferay.portal.service.permission.PortletPermissionUtil;
074 import com.liferay.portal.theme.ThemeDisplay;
075 import com.liferay.portal.util.PortalUtil;
076 import com.liferay.portal.util.PortletKeys;
077 import com.liferay.portal.util.PropsValues;
078 import com.liferay.portal.util.WebKeys;
079 import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
080 import com.liferay.portlet.documentlibrary.NoSuchFolderException;
081 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
082 import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
083 import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
084 import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
085 import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
086 import com.liferay.portlet.documentlibrary.service.DLFileEntryServiceUtil;
087 import com.liferay.portlet.documentlibrary.util.AudioProcessorUtil;
088 import com.liferay.portlet.documentlibrary.util.DLUtil;
089 import com.liferay.portlet.documentlibrary.util.DocumentConversionUtil;
090 import com.liferay.portlet.documentlibrary.util.ImageProcessorUtil;
091 import com.liferay.portlet.documentlibrary.util.PDFProcessor;
092 import com.liferay.portlet.documentlibrary.util.PDFProcessorUtil;
093 import com.liferay.portlet.documentlibrary.util.VideoProcessor;
094 import com.liferay.portlet.documentlibrary.util.VideoProcessorUtil;
095 import com.liferay.portlet.trash.util.TrashUtil;
096
097 import java.awt.image.RenderedImage;
098
099 import java.io.File;
100 import java.io.FileInputStream;
101 import java.io.IOException;
102 import java.io.InputStream;
103
104 import java.net.URL;
105
106 import java.text.Format;
107
108 import java.util.ArrayList;
109 import java.util.Date;
110 import java.util.List;
111 import java.util.Set;
112
113 import javax.servlet.ServletConfig;
114 import javax.servlet.ServletException;
115 import javax.servlet.http.HttpServlet;
116 import javax.servlet.http.HttpServletRequest;
117 import javax.servlet.http.HttpServletResponse;
118 import javax.servlet.http.HttpSession;
119
120
124 public class WebServerServlet extends HttpServlet {
125
126 public static final String PATH_PORTLET_FILE_ENTRY = "portlet_file_entry";
127
128
131 public static boolean hasFiles(HttpServletRequest request) {
132 try {
133
134
135
136
137 User user = _getUser(request);
138
139 String path = HttpUtil.fixPath(request.getPathInfo());
140
141 String[] pathArray = StringUtil.split(path, CharPool.SLASH);
142
143 if (pathArray.length == 0) {
144 return true;
145 }
146 else if (Validator.isNumber(pathArray[0])) {
147 _checkFileEntry(pathArray);
148 }
149 else if (PATH_PORTLET_FILE_ENTRY.equals(pathArray[0])) {
150 FileEntry fileEntry = getPortletFileEntry(request, pathArray);
151
152 if (fileEntry != null) {
153 return true;
154 }
155 }
156 else {
157 long groupId = _getGroupId(user.getCompanyId(), pathArray[0]);
158 long folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
159
160 for (int i = 1; i < pathArray.length; i++) {
161 try {
162 Folder folder = DLAppLocalServiceUtil.getFolder(
163 groupId, folderId, pathArray[i]);
164
165 folderId = folder.getFolderId();
166 }
167 catch (NoSuchFolderException nsfe) {
168 if (i != (pathArray.length - 1)) {
169 return false;
170 }
171
172 pathArray = new String[] {
173 String.valueOf(groupId), String.valueOf(folderId),
174 pathArray[i]
175 };
176
177 _checkFileEntry(pathArray);
178 }
179 }
180 }
181 }
182 catch (Exception e) {
183 return false;
184 }
185
186 return true;
187 }
188
189 @Override
190 public void init(ServletConfig servletConfig) throws ServletException {
191 super.init(servletConfig);
192
193 _lastModified = GetterUtil.getBoolean(
194 servletConfig.getInitParameter("last_modified"), true);
195
196 Class<?> clazz = getClass();
197
198 ClassLoader classLoader = clazz.getClassLoader();
199
200 String templateId =
201 "com/liferay/portal/webserver/dependencies/template.ftl";
202
203 URL url = classLoader.getResource(templateId);
204
205 _templateResource = new URLTemplateResource(templateId, url);
206 }
207
208 @Override
209 public void service(
210 HttpServletRequest request, HttpServletResponse response)
211 throws IOException, ServletException {
212
213 User user = null;
214
215 try {
216 user = _getUser(request);
217
218 PrincipalThreadLocal.setName(user.getUserId());
219 PrincipalThreadLocal.setPassword(
220 PortalUtil.getUserPassword(request));
221
222 PermissionChecker permissionChecker =
223 PermissionCheckerFactoryUtil.create(user);
224
225 PermissionThreadLocal.setPermissionChecker(permissionChecker);
226
227 if (_lastModified) {
228 long lastModified = getLastModified(request);
229
230 if (lastModified > 0) {
231 long ifModifiedSince = request.getDateHeader(
232 HttpHeaders.IF_MODIFIED_SINCE);
233
234 if ((ifModifiedSince > 0) &&
235 (ifModifiedSince == lastModified)) {
236
237 response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
238
239 return;
240 }
241 }
242
243 if (lastModified > 0) {
244 response.setDateHeader(
245 HttpHeaders.LAST_MODIFIED, lastModified);
246 }
247 }
248
249 String path = HttpUtil.fixPath(request.getPathInfo());
250 String[] pathArray = StringUtil.split(path, CharPool.SLASH);
251
252 if (pathArray.length == 0) {
253 sendGroups(
254 response, user,
255 request.getServletPath() + StringPool.SLASH + path);
256 }
257 else {
258 if (Validator.isNumber(pathArray[0])) {
259 sendFile(request, response, user, pathArray);
260 }
261 else if (PATH_PORTLET_FILE_ENTRY.equals(pathArray[0])) {
262 sendPortletFileEntry(request, response, pathArray);
263 }
264 else {
265 if (isLegacyImageGalleryImageId(request, response)) {
266 return;
267 }
268
269 Image image = getImage(request, true);
270
271 if (image != null) {
272 writeImage(image, request, response);
273 }
274 else {
275 sendDocumentLibrary(
276 request, response, user,
277 request.getServletPath() + StringPool.SLASH + path,
278 pathArray);
279 }
280 }
281 }
282 }
283 catch (NoSuchFileEntryException nsfee) {
284 PortalUtil.sendError(
285 HttpServletResponse.SC_NOT_FOUND, nsfee, request, response);
286 }
287 catch (NoSuchFolderException nsfe) {
288 PortalUtil.sendError(
289 HttpServletResponse.SC_NOT_FOUND, nsfe, request, response);
290 }
291 catch (PrincipalException pe) {
292 processPrincipalException(pe, user, request, response);
293 }
294 catch (Exception e) {
295 PortalUtil.sendError(e, request, response);
296 }
297 }
298
299 protected static FileEntry getPortletFileEntry(
300 HttpServletRequest request, String[] pathArray)
301 throws Exception {
302
303 long groupId = GetterUtil.getLong(pathArray[1]);
304 String uuid = pathArray[3];
305
306 FileEntry fileEntry = PortletFileRepositoryUtil.getPortletFileEntry(
307 uuid, groupId);
308
309 DLFileEntry dlFileEntry = (DLFileEntry)fileEntry.getModel();
310
311 int status = ParamUtil.getInteger(
312 request, "status", WorkflowConstants.STATUS_APPROVED);
313
314 if ((status != WorkflowConstants.STATUS_IN_TRASH) &&
315 dlFileEntry.isInTrash()) {
316
317 return null;
318 }
319
320 return fileEntry;
321 }
322
323 protected Image convertFileEntry(boolean smallImage, FileEntry fileEntry)
324 throws PortalException, SystemException {
325
326 try {
327 Image image = new ImageImpl();
328
329 image.setModifiedDate(fileEntry.getModifiedDate());
330
331 InputStream is = null;
332
333 if (smallImage) {
334 is = ImageProcessorUtil.getThumbnailAsStream(
335 fileEntry.getFileVersion(), 0);
336 }
337 else {
338 is = fileEntry.getContentStream();
339 }
340
341 byte[] bytes = FileUtil.getBytes(is);
342
343 image.setTextObj(bytes);
344
345 image.setType(fileEntry.getExtension());
346
347 return image;
348 }
349 catch (PortalException pe) {
350 throw pe;
351 }
352 catch (SystemException se) {
353 throw se;
354 }
355 catch (Exception e) {
356 throw new SystemException(e);
357 }
358 }
359
360 protected Image getDefaultImage(HttpServletRequest request, long imageId) {
361 String path = GetterUtil.getString(request.getPathInfo());
362
363 if (path.startsWith("/company_logo") ||
364 path.startsWith("/layout_set_logo") || path.startsWith("/logo")) {
365
366 return ImageToolUtil.getDefaultCompanyLogo();
367 }
368 else if (path.startsWith("/organization_logo")) {
369 return ImageToolUtil.getDefaultOrganizationLogo();
370 }
371 else if (path.startsWith("/user_female_portrait")) {
372 return ImageToolUtil.getDefaultUserFemalePortrait();
373 }
374 else if (path.startsWith("/user_male_portrait")) {
375 return ImageToolUtil.getDefaultUserMalePortrait();
376 }
377 else if (path.startsWith("/user_portrait")) {
378 return ImageToolUtil.getDefaultUserMalePortrait();
379 }
380 else {
381 return null;
382 }
383 }
384
385 protected FileEntry getFileEntry(String[] pathArray) throws Exception {
386 if (pathArray.length == 1) {
387 long dlFileShortcutId = GetterUtil.getLong(pathArray[0]);
388
389 DLFileShortcut dlFileShortcut = DLAppServiceUtil.getFileShortcut(
390 dlFileShortcutId);
391
392 return DLAppServiceUtil.getFileEntry(
393 dlFileShortcut.getToFileEntryId());
394 }
395 else if (pathArray.length == 2) {
396 long groupId = GetterUtil.getLong(pathArray[0]);
397
398 return DLAppServiceUtil.getFileEntryByUuidAndGroupId(
399 pathArray[1], groupId);
400 }
401 else if (pathArray.length == 3) {
402 long groupId = GetterUtil.getLong(pathArray[0]);
403 long folderId = GetterUtil.getLong(pathArray[1]);
404 String fileName = HttpUtil.decodeURL(pathArray[2]);
405
406 if (fileName.contains(StringPool.QUESTION)) {
407 fileName = fileName.substring(
408 0, fileName.indexOf(StringPool.QUESTION));
409 }
410
411 return DLAppServiceUtil.getFileEntry(groupId, folderId, fileName);
412 }
413 else {
414 long groupId = GetterUtil.getLong(pathArray[0]);
415
416 String uuid = pathArray[3];
417
418 return DLAppServiceUtil.getFileEntryByUuidAndGroupId(uuid, groupId);
419 }
420 }
421
422 protected Image getImage(HttpServletRequest request, boolean getDefault)
423 throws PortalException, SystemException {
424
425 Image image = null;
426
427 long imageId = getImageId(request);
428
429 if (imageId > 0) {
430 image = ImageServiceUtil.getImage(imageId);
431
432 String path = GetterUtil.getString(request.getPathInfo());
433
434 if (path.startsWith("/user_female_portrait") ||
435 path.startsWith("/user_male_portrait") ||
436 path.startsWith("/user_portrait")) {
437
438 image = getUserPortraitImageResized(image, imageId);
439 }
440 }
441 else {
442 String uuid = ParamUtil.getString(request, "uuid");
443 long groupId = ParamUtil.getLong(request, "groupId");
444 boolean igSmallImage = ParamUtil.getBoolean(
445 request, "igSmallImage");
446
447 if (Validator.isNotNull(uuid) && (groupId > 0)) {
448 try {
449 FileEntry fileEntry =
450 DLAppServiceUtil.getFileEntryByUuidAndGroupId(
451 uuid, groupId);
452
453 image = convertFileEntry(igSmallImage, fileEntry);
454 }
455 catch (Exception e) {
456 }
457 }
458 }
459
460 if (getDefault) {
461 if (image == null) {
462 if (_log.isWarnEnabled()) {
463 _log.warn("Get a default image for " + imageId);
464 }
465
466 image = getDefaultImage(request, imageId);
467 }
468 }
469
470 return image;
471 }
472
473 protected byte[] getImageBytes(HttpServletRequest request, Image image) {
474 try {
475 if (!PropsValues.IMAGE_AUTO_SCALE) {
476 return image.getTextObj();
477 }
478
479 ImageBag imageBag = null;
480
481 if (image.getImageId() == 0) {
482 imageBag = ImageToolUtil.read(image.getTextObj());
483
484 RenderedImage renderedImage = imageBag.getRenderedImage();
485
486 image.setHeight(renderedImage.getHeight());
487 image.setWidth(renderedImage.getWidth());
488 }
489
490 int height = ParamUtil.getInteger(
491 request, "height", image.getHeight());
492 int width = ParamUtil.getInteger(
493 request, "width", image.getWidth());
494
495 if ((height >= image.getHeight()) && (width >= image.getWidth())) {
496 return image.getTextObj();
497 }
498
499 if (image.getImageId() != 0) {
500 imageBag = ImageToolUtil.read(image.getTextObj());
501 }
502
503 RenderedImage renderedImage = ImageToolUtil.scale(
504 imageBag.getRenderedImage(), height, width);
505
506 return ImageToolUtil.getBytes(renderedImage, imageBag.getType());
507 }
508 catch (Exception e) {
509 if (_log.isWarnEnabled()) {
510 _log.warn("Error scaling image " + image.getImageId(), e);
511 }
512 }
513
514 return image.getTextObj();
515 }
516
517 protected long getImageId(HttpServletRequest request) {
518
519
520
521 long imageId = ParamUtil.getLong(request, "image_id");
522
523 if (imageId <= 0) {
524 imageId = ParamUtil.getLong(request, "img_id");
525 }
526
527 if (imageId <= 0) {
528 imageId = ParamUtil.getLong(request, "i_id");
529 }
530
531 if (imageId <= 0) {
532 long companyId = ParamUtil.getLong(request, "companyId");
533 String screenName = ParamUtil.getString(request, "screenName");
534
535 try {
536 if ((companyId > 0) && Validator.isNotNull(screenName)) {
537 User user = UserLocalServiceUtil.getUserByScreenName(
538 companyId, screenName);
539
540 imageId = user.getPortraitId();
541 }
542 }
543 catch (Exception e) {
544 }
545 }
546
547 return imageId;
548 }
549
550 @Override
551 protected long getLastModified(HttpServletRequest request) {
552 try {
553 Date modifiedDate = null;
554
555 Image image = getImage(request, true);
556
557 if (image != null) {
558 modifiedDate = image.getModifiedDate();
559 }
560 else {
561 String path = HttpUtil.fixPath(request.getPathInfo());
562
563 String[] pathArray = StringUtil.split(path, CharPool.SLASH);
564
565 if (pathArray.length == 0) {
566 return -1;
567 }
568
569 if (pathArray[0].equals("language")) {
570 return -1;
571 }
572
573 FileEntry fileEntry = null;
574
575 try {
576 fileEntry = getFileEntry(pathArray);
577 }
578 catch (Exception e) {
579 }
580
581 if (fileEntry == null) {
582 return -1;
583 }
584
585 String version = ParamUtil.getString(request, "version");
586
587 if (Validator.isNotNull(version)) {
588 FileVersion fileVersion = fileEntry.getFileVersion(version);
589
590 modifiedDate = fileVersion.getModifiedDate();
591 }
592 else {
593 modifiedDate = fileEntry.getModifiedDate();
594 }
595 }
596
597 if (modifiedDate == null) {
598 modifiedDate = PortalUtil.getUptime();
599 }
600
601
602
603 return (modifiedDate.getTime() / 1000) * 1000;
604 }
605 catch (PrincipalException pe) {
606 if (_log.isWarnEnabled()) {
607 _log.warn(pe, pe);
608 }
609 }
610 catch (Exception e) {
611 _log.error(e, e);
612 }
613
614 return -1;
615 }
616
617 protected Image getUserPortraitImageResized(Image image, long imageId)
618 throws PortalException, SystemException {
619
620 if (image == null) {
621 return null;
622 }
623
624 if (((PropsValues.USERS_IMAGE_MAX_HEIGHT > 0) &&
625 (image.getHeight() > PropsValues.USERS_IMAGE_MAX_HEIGHT)) ||
626 ((PropsValues.USERS_IMAGE_MAX_WIDTH > 0) &&
627 (image.getWidth() > PropsValues.USERS_IMAGE_MAX_WIDTH))) {
628
629 User user = UserLocalServiceUtil.getUserByPortraitId(imageId);
630
631 UserLocalServiceUtil.updatePortrait(
632 user.getUserId(), image.getTextObj());
633
634 return ImageLocalServiceUtil.getImage(imageId);
635 }
636
637 return image;
638 }
639
640 protected boolean isLegacyImageGalleryImageId(
641 HttpServletRequest request, HttpServletResponse response) {
642
643 try {
644 long imageId = getImageId(request);
645
646 if (imageId == 0) {
647 return false;
648 }
649
650 DLFileEntry dlFileEntry =
651 DLFileEntryServiceUtil.fetchFileEntryByImageId(imageId);
652
653 if (dlFileEntry == null) {
654 return false;
655 }
656
657 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
658 WebKeys.THEME_DISPLAY);
659
660 String queryString = StringPool.BLANK;
661
662 if (imageId == dlFileEntry.getSmallImageId()) {
663 queryString = "&imageThumbnail=1";
664 }
665 else if (imageId == dlFileEntry.getCustom1ImageId()) {
666 queryString = "&imageThumbnail=2";
667 }
668 else if (imageId == dlFileEntry.getCustom2ImageId()) {
669 queryString = "&imageThumbnail=3";
670 }
671
672 String url = DLUtil.getPreviewURL(
673 new LiferayFileEntry(dlFileEntry),
674 new LiferayFileVersion(dlFileEntry.getFileVersion()),
675 themeDisplay, queryString);
676
677 response.setHeader(HttpHeaders.LOCATION, url);
678 response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
679
680 return true;
681 }
682 catch (Exception e) {
683 }
684
685 return false;
686 }
687
688 protected boolean isSupportsRangeHeader(String contentType) {
689 return _acceptRangesMimeTypes.contains(contentType);
690 }
691
692 protected void processPrincipalException(
693 Throwable t, User user, HttpServletRequest request,
694 HttpServletResponse response)
695 throws IOException, ServletException {
696
697 if (!user.isDefaultUser()) {
698 PortalUtil.sendError(
699 HttpServletResponse.SC_UNAUTHORIZED, (Exception)t, request,
700 response);
701
702 return;
703 }
704
705 String redirect = PortalUtil.getPathMain() + "/portal/login";
706
707 String currentURL = PortalUtil.getCurrentURL(request);
708
709 redirect = HttpUtil.addParameter(redirect, "redirect", currentURL);
710
711 response.sendRedirect(redirect);
712 }
713
714 protected void sendDocumentLibrary(
715 HttpServletRequest request, HttpServletResponse response, User user,
716 String path, String[] pathArray)
717 throws Exception {
718
719 long groupId = _getGroupId(user.getCompanyId(), pathArray[0]);
720
721 Group group = GroupLocalServiceUtil.getGroup(groupId);
722
723 UnicodeProperties typeSettingsProperties =
724 group.getTypeSettingsProperties();
725
726 boolean directoryIndexingEnabled = GetterUtil.getBoolean(
727 typeSettingsProperties.getProperty("directoryIndexingEnabled"),
728 PropsValues.WEB_SERVER_SERVLET_DIRECTORY_INDEXING_ENABLED);
729
730 if (!directoryIndexingEnabled) {
731 throw new NoSuchFolderException();
732 }
733
734 long folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
735
736 for (int i = 1; i < pathArray.length; i++) {
737 String name = pathArray[i];
738
739 try {
740 Folder folder = DLAppServiceUtil.getFolder(
741 groupId, folderId, name);
742
743 folderId = folder.getFolderId();
744 }
745 catch (NoSuchFolderException nsfe) {
746 if (i != (pathArray.length - 1)) {
747 throw nsfe;
748 }
749
750 String title = name;
751
752 sendFile(response, user, groupId, folderId, title);
753
754 return;
755 }
756 }
757
758 try {
759 sendFile(response, user, groupId, folderId, "index.html");
760
761 return;
762 }
763 catch (Exception e) {
764 if ((e instanceof NoSuchFileEntryException) ||
765 (e instanceof PrincipalException)) {
766
767 try {
768 sendFile(response, user, groupId, folderId, "index.htm");
769
770 return;
771 }
772 catch (NoSuchFileEntryException nsfee) {
773 }
774 catch (PrincipalException pe) {
775 }
776 }
777 else {
778 throw e;
779 }
780 }
781
782 List<WebServerEntry> webServerEntries = new ArrayList<WebServerEntry>();
783
784 webServerEntries.add(new WebServerEntry(path, "../"));
785
786 List<Folder> folders = DLAppServiceUtil.getFolders(groupId, folderId);
787
788 for (Folder folder : folders) {
789 WebServerEntry webServerEntry = new WebServerEntry(
790 path, folder.getName() + StringPool.SLASH,
791 folder.getCreateDate(), folder.getModifiedDate(),
792 folder.getDescription(), 0);
793
794 webServerEntries.add(webServerEntry);
795 }
796
797 List<FileEntry> fileEntries = DLAppServiceUtil.getFileEntries(
798 groupId, folderId);
799
800 for (FileEntry fileEntry : fileEntries) {
801 WebServerEntry webServerEntry = new WebServerEntry(
802 path, fileEntry.getTitle(), fileEntry.getCreateDate(),
803 fileEntry.getModifiedDate(), fileEntry.getDescription(),
804 fileEntry.getSize());
805
806 webServerEntries.add(webServerEntry);
807 }
808
809 sendHTML(response, path, webServerEntries);
810 }
811
812 protected void sendFile(
813 HttpServletRequest request, HttpServletResponse response, User user,
814 String[] pathArray)
815 throws Exception {
816
817
818
819 FileEntry fileEntry = getFileEntry(pathArray);
820
821 if (fileEntry == null) {
822 throw new NoSuchFileEntryException();
823 }
824
825 String version = ParamUtil.getString(request, "version");
826
827 if (Validator.isNull(version)) {
828 if (Validator.isNotNull(fileEntry.getVersion())) {
829 version = fileEntry.getVersion();
830 }
831 }
832
833 String tempFileId = DLUtil.getTempFileId(
834 fileEntry.getFileEntryId(), version);
835
836 if (fileEntry.getModel() instanceof DLFileEntry) {
837 LiferayFileEntry liferayFileEntry = (LiferayFileEntry)fileEntry;
838
839 if (liferayFileEntry.isInTrash()) {
840 int status = ParamUtil.getInteger(
841 request, "status", WorkflowConstants.STATUS_APPROVED);
842
843 if (status != WorkflowConstants.STATUS_IN_TRASH) {
844 throw new NoSuchFileEntryException();
845 }
846
847 PermissionChecker permissionChecker =
848 PermissionThreadLocal.getPermissionChecker();
849
850 if (!PortletPermissionUtil.hasControlPanelAccessPermission(
851 permissionChecker, fileEntry.getGroupId(),
852 PortletKeys.TRASH)) {
853
854 throw new PrincipalException();
855 }
856 }
857 }
858
859 FileVersion fileVersion = fileEntry.getFileVersion(version);
860
861 if ((ParamUtil.getInteger(request, "height") > 0) ||
862 (ParamUtil.getInteger(request, "width") > 0)) {
863
864 InputStream inputStream = fileVersion.getContentStream(true);
865
866 Image image = ImageToolUtil.getImage(inputStream);
867
868 writeImage(image, request, response);
869
870 return;
871 }
872
873 String fileName = fileVersion.getTitle();
874
875 String extension = fileVersion.getExtension();
876
877 if (Validator.isNotNull(extension) &&
878 !fileName.endsWith(StringPool.PERIOD + extension)) {
879
880 fileName += StringPool.PERIOD + extension;
881 }
882
883
884
885 boolean converted = false;
886
887 String targetExtension = ParamUtil.getString(
888 request, "targetExtension");
889 int imageThumbnail = ParamUtil.getInteger(request, "imageThumbnail");
890 int documentThumbnail = ParamUtil.getInteger(
891 request, "documentThumbnail");
892 int previewFileIndex = ParamUtil.getInteger(
893 request, "previewFileIndex");
894 boolean audioPreview = ParamUtil.getBoolean(request, "audioPreview");
895 boolean imagePreview = ParamUtil.getBoolean(request, "imagePreview");
896 boolean videoPreview = ParamUtil.getBoolean(request, "videoPreview");
897 int videoThumbnail = ParamUtil.getInteger(request, "videoThumbnail");
898
899 InputStream inputStream = null;
900 long contentLength = 0;
901
902 if ((imageThumbnail > 0) && (imageThumbnail <= 3)) {
903 fileName = FileUtil.stripExtension(fileName).concat(
904 StringPool.PERIOD).concat(
905 ImageProcessorUtil.getThumbnailType(fileVersion));
906
907 int thumbnailIndex = imageThumbnail - 1;
908
909 inputStream = ImageProcessorUtil.getThumbnailAsStream(
910 fileVersion, thumbnailIndex);
911 contentLength = ImageProcessorUtil.getThumbnailFileSize(
912 fileVersion, thumbnailIndex);
913
914 converted = true;
915 }
916 else if ((documentThumbnail > 0) && (documentThumbnail <= 3)) {
917 fileName = FileUtil.stripExtension(fileName).concat(
918 StringPool.PERIOD).concat(PDFProcessor.THUMBNAIL_TYPE);
919
920 int thumbnailIndex = documentThumbnail - 1;
921
922 inputStream = PDFProcessorUtil.getThumbnailAsStream(
923 fileVersion, thumbnailIndex);
924 contentLength = PDFProcessorUtil.getThumbnailFileSize(
925 fileVersion, thumbnailIndex);
926
927 converted = true;
928 }
929 else if (previewFileIndex > 0) {
930 fileName = FileUtil.stripExtension(fileName).concat(
931 StringPool.PERIOD).concat(PDFProcessor.PREVIEW_TYPE);
932 inputStream = PDFProcessorUtil.getPreviewAsStream(
933 fileVersion, previewFileIndex);
934 contentLength = PDFProcessorUtil.getPreviewFileSize(
935 fileVersion, previewFileIndex);
936
937 converted = true;
938 }
939 else if (audioPreview || videoPreview) {
940 String type = ParamUtil.getString(request, "type");
941
942 fileName = FileUtil.stripExtension(fileName).concat(
943 StringPool.PERIOD).concat(type);
944
945 if (audioPreview) {
946 inputStream = AudioProcessorUtil.getPreviewAsStream(
947 fileVersion, type);
948 contentLength = AudioProcessorUtil.getPreviewFileSize(
949 fileVersion, type);
950 }
951 else {
952 inputStream = VideoProcessorUtil.getPreviewAsStream(
953 fileVersion, type);
954 contentLength = VideoProcessorUtil.getPreviewFileSize(
955 fileVersion, type);
956 }
957
958 converted = true;
959 }
960 else if (imagePreview) {
961 String type = ImageProcessorUtil.getPreviewType(fileVersion);
962
963 fileName = FileUtil.stripExtension(fileName).concat(
964 StringPool.PERIOD).concat(type);
965
966 inputStream = ImageProcessorUtil.getPreviewAsStream(fileVersion);
967
968 contentLength = ImageProcessorUtil.getPreviewFileSize(fileVersion);
969
970 converted = true;
971 }
972 else if ((videoThumbnail > 0) && (videoThumbnail <= 3)) {
973 fileName = FileUtil.stripExtension(fileName).concat(
974 StringPool.PERIOD).concat(VideoProcessor.THUMBNAIL_TYPE);
975
976 int thumbnailIndex = videoThumbnail - 1;
977
978 inputStream = VideoProcessorUtil.getThumbnailAsStream(
979 fileVersion, thumbnailIndex);
980 contentLength = VideoProcessorUtil.getThumbnailFileSize(
981 fileVersion, thumbnailIndex);
982
983 converted = true;
984 }
985 else {
986 inputStream = fileVersion.getContentStream(true);
987 contentLength = fileVersion.getSize();
988
989 if (Validator.isNotNull(targetExtension)) {
990 File convertedFile = DocumentConversionUtil.convert(
991 tempFileId, inputStream, extension, targetExtension);
992
993 if (convertedFile != null) {
994 fileName = FileUtil.stripExtension(fileName).concat(
995 StringPool.PERIOD).concat(targetExtension);
996 inputStream = new FileInputStream(convertedFile);
997 contentLength = convertedFile.length();
998
999 converted = true;
1000 }
1001 }
1002 }
1003
1004
1005
1006 String contentType = null;
1007
1008 if (converted) {
1009 contentType = MimeTypesUtil.getContentType(fileName);
1010 }
1011 else {
1012 contentType = fileVersion.getMimeType();
1013 }
1014
1015 if (_log.isDebugEnabled()) {
1016 _log.debug("Content type set to " + contentType);
1017 }
1018
1019
1020
1021 if (isSupportsRangeHeader(contentType)) {
1022 sendFileWithRangeHeader(
1023 request, response, fileName, inputStream, contentLength,
1024 contentType);
1025 }
1026 else {
1027 ServletResponseUtil.sendFile(
1028 request, response, fileName, inputStream, contentLength,
1029 contentType);
1030 }
1031 }
1032
1033 protected void sendFile(
1034 HttpServletResponse response, User user, long groupId,
1035 long folderId, String title)
1036 throws Exception {
1037
1038 FileEntry fileEntry = DLAppServiceUtil.getFileEntry(
1039 groupId, folderId, title);
1040
1041 String contentType = fileEntry.getMimeType();
1042
1043 response.setContentType(contentType);
1044
1045 InputStream inputStream = fileEntry.getContentStream();
1046
1047 ServletResponseUtil.write(response, inputStream, fileEntry.getSize());
1048 }
1049
1050 protected void sendFileWithRangeHeader(
1051 HttpServletRequest request, HttpServletResponse response,
1052 String fileName, InputStream inputStream, long contentLength,
1053 String contentType)
1054 throws IOException {
1055
1056 if (_log.isDebugEnabled()) {
1057 _log.debug("Accepting ranges for the file " + fileName);
1058 }
1059
1060 response.setHeader(
1061 HttpHeaders.ACCEPT_RANGES, HttpHeaders.ACCEPT_RANGES_BYTES_VALUE);
1062
1063 List<Range> ranges = null;
1064
1065 try {
1066 ranges = ServletResponseUtil.getRanges(
1067 request, response, contentLength);
1068 }
1069 catch (IOException ioe) {
1070 if (_log.isErrorEnabled()) {
1071 _log.error(ioe);
1072 }
1073
1074 response.setHeader(
1075 HttpHeaders.CONTENT_RANGE, "bytes */" + contentLength);
1076
1077 response.sendError(
1078 HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
1079
1080 return;
1081 }
1082
1083 if ((ranges == null) || ranges.isEmpty()) {
1084 ServletResponseUtil.sendFile(
1085 request, response, fileName, inputStream, contentLength,
1086 contentType);
1087 }
1088 else {
1089 if (_log.isDebugEnabled()) {
1090 _log.debug(
1091 "Request has range header " +
1092 request.getHeader(HttpHeaders.RANGE));
1093 }
1094
1095 ServletResponseUtil.write(
1096 request, response, fileName, ranges, inputStream, contentLength,
1097 contentType);
1098 }
1099 }
1100
1101 protected void sendGroups(
1102 HttpServletResponse response, User user, String path)
1103 throws Exception {
1104
1105 if (!PropsValues.WEB_SERVER_SERVLET_DIRECTORY_INDEXING_ENABLED) {
1106 response.setStatus(HttpServletResponse.SC_FORBIDDEN);
1107
1108 return;
1109 }
1110
1111 List<WebServerEntry> webServerEntries = new ArrayList<WebServerEntry>();
1112
1113 List<Group> groups = WebDAVUtil.getGroups(user);
1114
1115 for (Group group : groups) {
1116 String name = HttpUtil.fixPath(group.getFriendlyURL());
1117
1118 WebServerEntry webServerEntry = new WebServerEntry(
1119 path, name + StringPool.SLASH, null, null,
1120 group.getDescription(), 0);
1121
1122 webServerEntries.add(webServerEntry);
1123 }
1124
1125 sendHTML(response, path, webServerEntries);
1126 }
1127
1128 protected void sendHTML(
1129 HttpServletResponse response, String path,
1130 List<WebServerEntry> webServerEntries)
1131 throws Exception {
1132
1133 Template template = TemplateManagerUtil.getTemplate(
1134 TemplateConstants.LANG_TYPE_FTL, _templateResource, true);
1135
1136 template.put("dateFormat", _dateFormat);
1137 template.put("entries", webServerEntries);
1138 template.put("path", HttpUtil.encodePath(path));
1139
1140 if (_WEB_SERVER_SERVLET_VERSION_VERBOSITY_DEFAULT) {
1141 }
1142 else if (_WEB_SERVER_SERVLET_VERSION_VERBOSITY_PARTIAL) {
1143 template.put("releaseInfo", ReleaseInfo.getName());
1144 }
1145 else {
1146 template.put("releaseInfo", ReleaseInfo.getReleaseInfo());
1147 }
1148
1149 template.put("validator", Validator_IW.getInstance());
1150
1151 response.setContentType(ContentTypes.TEXT_HTML_UTF8);
1152
1153 template.processTemplate(response.getWriter());
1154 }
1155
1156 protected void sendPortletFileEntry(
1157 HttpServletRequest request, HttpServletResponse response,
1158 String[] pathArray)
1159 throws Exception {
1160
1161 FileEntry fileEntry = getPortletFileEntry(request, pathArray);
1162
1163 if (fileEntry == null) {
1164 return;
1165 }
1166
1167 String fileName = HttpUtil.decodeURL(
1168 HtmlUtil.escape(pathArray[2]), true);
1169
1170 if (fileEntry.isInTrash()) {
1171 fileName = TrashUtil.getOriginalTitle(fileName);
1172 }
1173
1174 ServletResponseUtil.sendFile(
1175 request, response, fileName, fileEntry.getContentStream(),
1176 fileEntry.getSize(), fileEntry.getMimeType());
1177 }
1178
1179 protected void writeImage(
1180 Image image, HttpServletRequest request, HttpServletResponse response) {
1181
1182 if (image == null) {
1183 return;
1184 }
1185
1186 String contentType = null;
1187
1188 String type = image.getType();
1189
1190 if (!type.equals(ImageConstants.TYPE_NOT_AVAILABLE)) {
1191 contentType = MimeTypesUtil.getExtensionContentType(type);
1192
1193 response.setContentType(contentType);
1194 }
1195
1196 String fileName = ParamUtil.getString(request, "fileName");
1197
1198 try {
1199 byte[] bytes = getImageBytes(request, image);
1200
1201 if (Validator.isNotNull(fileName)) {
1202 ServletResponseUtil.sendFile(
1203 request, response, fileName, bytes, contentType);
1204 }
1205 else {
1206 ServletResponseUtil.write(response, bytes);
1207 }
1208 }
1209 catch (Exception e) {
1210 if (_log.isWarnEnabled()) {
1211 _log.warn(e, e);
1212 }
1213 }
1214 }
1215
1216 private static void _checkFileEntry(String[] pathArray) throws Exception {
1217 if (pathArray.length == 1) {
1218 long dlFileShortcutId = GetterUtil.getLong(pathArray[0]);
1219
1220 DLFileShortcut dlFileShortcut =
1221 DLAppLocalServiceUtil.getFileShortcut(dlFileShortcutId);
1222
1223 DLAppLocalServiceUtil.getFileEntry(
1224 dlFileShortcut.getToFileEntryId());
1225 }
1226 else if (pathArray.length == 2) {
1227
1228
1229
1230 }
1231 else if (pathArray.length == 3) {
1232 long groupId = GetterUtil.getLong(pathArray[0]);
1233 long folderId = GetterUtil.getLong(pathArray[1]);
1234 String fileName = HttpUtil.decodeURL(pathArray[2]);
1235
1236 try {
1237 DLAppLocalServiceUtil.getFileEntry(groupId, folderId, fileName);
1238 }
1239 catch (RepositoryException re) {
1240 }
1241 }
1242 else {
1243 long groupId = GetterUtil.getLong(pathArray[0]);
1244
1245 String uuid = pathArray[3];
1246
1247 try {
1248 DLAppLocalServiceUtil.getFileEntryByUuidAndGroupId(
1249 uuid, groupId);
1250 }
1251 catch (RepositoryException re) {
1252 }
1253 }
1254 }
1255
1256 private static long _getGroupId(long companyId, String name)
1257 throws Exception {
1258
1259 Group group = GroupLocalServiceUtil.fetchFriendlyURLGroup(
1260 companyId, StringPool.SLASH + name);
1261
1262 if (group != null) {
1263 return group.getGroupId();
1264 }
1265
1266 User user = UserLocalServiceUtil.getUserByScreenName(companyId, name);
1267
1268 group = user.getGroup();
1269
1270 return group.getGroupId();
1271 }
1272
1273 private static User _getUser(HttpServletRequest request) throws Exception {
1274 HttpSession session = request.getSession();
1275
1276 if (PortalSessionThreadLocal.getHttpSession() == null) {
1277 PortalSessionThreadLocal.setHttpSession(session);
1278 }
1279
1280 User user = PortalUtil.getUser(request);
1281
1282 if (user != null) {
1283 return user;
1284 }
1285
1286 String userIdString = (String)session.getAttribute("j_username");
1287 String password = (String)session.getAttribute("j_password");
1288
1289 if ((userIdString != null) && (password != null)) {
1290 long userId = GetterUtil.getLong(userIdString);
1291
1292 user = UserLocalServiceUtil.getUser(userId);
1293 }
1294 else {
1295 long companyId = PortalUtil.getCompanyId(request);
1296
1297 Company company = CompanyLocalServiceUtil.getCompany(companyId);
1298
1299 user = company.getDefaultUser();
1300 }
1301
1302 return user;
1303 }
1304
1305 private static final boolean _WEB_SERVER_SERVLET_VERSION_VERBOSITY_DEFAULT =
1306 StringUtil.equalsIgnoreCase(
1307 PropsValues.WEB_SERVER_SERVLET_VERSION_VERBOSITY,
1308 ReleaseInfo.getName());
1309
1310 private static final boolean _WEB_SERVER_SERVLET_VERSION_VERBOSITY_PARTIAL =
1311 StringUtil.equalsIgnoreCase(
1312 PropsValues.WEB_SERVER_SERVLET_VERSION_VERBOSITY, "partial");
1313
1314 private static Log _log = LogFactoryUtil.getLog(WebServerServlet.class);
1315
1316 private static Set<String> _acceptRangesMimeTypes = SetUtil.fromArray(
1317 PropsValues.WEB_SERVER_SERVLET_ACCEPT_RANGES_MIME_TYPES);
1318 private static Format _dateFormat =
1319 FastDateFormatFactoryUtil.getSimpleDateFormat("d MMM yyyy HH:mm z");
1320
1321 private boolean _lastModified = true;
1322 private TemplateResource _templateResource;
1323
1324 }