1 23 24 package org.infoglue.deliver.applications.actions; 25 26 import java.net.URLEncoder ; 27 import java.security.Principal ; 28 import java.util.Date ; 29 import java.util.HashMap ; 30 import java.util.Iterator ; 31 import java.util.List ; 32 import java.util.Map ; 33 import java.util.Properties ; 34 35 import javax.servlet.ServletException ; 36 import javax.servlet.http.Cookie ; 37 import javax.servlet.http.HttpServletRequest ; 38 import javax.servlet.http.HttpServletRequestWrapper ; 39 import javax.servlet.http.HttpServletResponse ; 40 41 import org.apache.log4j.Logger; 42 import org.exolab.castor.jdo.Database; 43 import org.infoglue.cms.applications.common.actions.InfoGlueAbstractAction; 44 import org.infoglue.cms.controllers.kernel.impl.simple.AccessRightController; 45 import org.infoglue.cms.controllers.kernel.impl.simple.CastorDatabaseService; 46 import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeController; 47 import org.infoglue.cms.controllers.kernel.impl.simple.UserControllerProxy; 48 import org.infoglue.cms.entities.management.LanguageVO; 49 import org.infoglue.cms.entities.management.SiteNodeTypeDefinitionVO; 50 import org.infoglue.cms.entities.structure.SiteNode; 51 import org.infoglue.cms.entities.structure.SiteNodeVO; 52 import org.infoglue.cms.entities.structure.SiteNodeVersionVO; 53 import org.infoglue.cms.entities.structure.impl.simple.SiteNodeImpl; 54 import org.infoglue.cms.exception.SystemException; 55 import org.infoglue.cms.security.AuthenticationModule; 56 import org.infoglue.cms.security.InfoGluePrincipal; 57 import org.infoglue.cms.util.CmsPropertyHandler; 58 import org.infoglue.cms.util.DesEncryptionHelper; 59 import org.infoglue.deliver.applications.databeans.DatabaseWrapper; 60 import org.infoglue.deliver.applications.databeans.DeliveryContext; 61 import org.infoglue.deliver.applications.filters.ViewPageFilter; 62 import org.infoglue.deliver.controllers.kernel.impl.simple.BasicTemplateController; 63 import org.infoglue.deliver.controllers.kernel.impl.simple.EditOnSiteBasicTemplateController; 64 import org.infoglue.deliver.controllers.kernel.impl.simple.ExtranetController; 65 import org.infoglue.deliver.controllers.kernel.impl.simple.IntegrationDeliveryController; 66 import org.infoglue.deliver.controllers.kernel.impl.simple.LanguageDeliveryController; 67 import org.infoglue.deliver.controllers.kernel.impl.simple.NodeDeliveryController; 68 import org.infoglue.deliver.controllers.kernel.impl.simple.RepositoryDeliveryController; 69 import org.infoglue.deliver.controllers.kernel.impl.simple.TemplateController; 70 import org.infoglue.deliver.invokers.PageInvoker; 71 import org.infoglue.deliver.portal.PortalService; 72 import org.infoglue.deliver.services.StatisticsService; 73 import org.infoglue.deliver.util.BrowserBean; 74 import org.infoglue.deliver.util.CacheController; 75 import org.infoglue.deliver.util.RequestAnalyser; 76 import org.infoglue.deliver.util.ThreadMonitor; 77 78 79 84 85 public class ViewPageAction extends InfoGlueAbstractAction 86 { 87 private static final long serialVersionUID = 1L; 88 89 public final static Logger logger = Logger.getLogger(ViewPageAction.class.getName()); 90 91 private Integer siteNodeId = null; 93 private Integer contentId = null; 94 private Integer languageId = null; 95 96 private boolean showSimple = false; 97 98 private String repositoryName = null; 100 101 protected NodeDeliveryController nodeDeliveryController = null; 103 protected IntegrationDeliveryController integrationDeliveryController = null; 104 protected TemplateController templateController = null; 105 106 private static final boolean USE_LANGUAGE_FALLBACK = true; 107 private static final boolean DO_NOT_USE_LANGUAGE_FALLBACK = false; 108 109 private BrowserBean browserBean = null; 111 private Principal principal = null; 112 113 private String referer = null; 115 116 private boolean isRecacheCall = false; 117 118 public static long contentVersionTime = 0; 120 public static long serviceBindingTime = 0; 121 public static long contentAttributeTime = 0; 122 public static long boundContentTime = 0; 123 public static long inheritedServiceBindingTime = 0; 124 public static long selectMatchingEntitiesTime = 0; 125 public static long isValidTime = 0; 126 public static long qualifyersTime = 0; 127 public static long sortQualifyersTime = 0; 128 public static long commitTime = 0; 129 public static long rollbackTime = 0; 130 public static long closeTime = 0; 131 132 private ThreadMonitor tk = null; 133 134 137 138 public ViewPageAction() 139 { 140 } 141 142 146 147 public String doExecute() throws Exception 148 { 149 if(isRecacheCall) 150 { 151 Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 153 } 154 155 163 while(!CmsPropertyHandler.getOperatingMode().equals("3") && RequestAnalyser.getRequestAnalyser().getBlockRequests()) 165 { 166 Thread.sleep(10); 168 } 169 170 HttpServletRequest request = getRequest(); 171 172 long start = System.currentTimeMillis(); 173 RequestAnalyser.getRequestAnalyser().incNumberOfCurrentRequests(); 174 175 long elapsedTime = 0; 176 177 logger.info("************************************************"); 178 logger.info("* ViewPageAction was called.... *"); 179 logger.info("************************************************"); 180 181 if(!CmsPropertyHandler.getOperatingMode().equals("3")) 182 tk = new ThreadMonitor(new Long (CmsPropertyHandler.getDeliverRequestTimeout()).longValue(), request, "Page view took to long!", true); 183 184 DatabaseWrapper dbWrapper = new DatabaseWrapper(CastorDatabaseService.getDatabase()); 185 186 beginTransaction(dbWrapper.getDatabase()); 187 188 try 189 { 190 193 validateAndModifyInputParameters(dbWrapper.getDatabase()); 194 195 this.nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(this.siteNodeId, this.languageId, this.contentId); 196 this.integrationDeliveryController = IntegrationDeliveryController.getIntegrationDeliveryController(this.siteNodeId, this.languageId, this.contentId); 197 198 logger.info("before pageKey..."); 199 String pageKey = this.nodeDeliveryController.getPageCacheKey(dbWrapper.getDatabase(), this.getHttpSession(), getRequest(), this.siteNodeId, this.languageId, this.contentId, browserBean.getUseragent(), this.getRequest().getQueryString(), ""); 200 202 logger.info("pageKey:" + pageKey); 203 String pagePath = null; 204 205 boolean isUserRedirected = false; 206 Integer protectedSiteNodeVersionId = this.nodeDeliveryController.getProtectedSiteNodeVersionIdForPageCache(dbWrapper.getDatabase(), siteNodeId); 207 logger.info("protectedSiteNodeVersionId:" + protectedSiteNodeVersionId); 208 String protectWorking = CmsPropertyHandler.getProtectDeliverWorking(); 209 String protectPreview = CmsPropertyHandler.getProtectDeliverPreview(); 210 boolean protectDeliver = false; 211 212 if(protectWorking.equals("true") && !CmsPropertyHandler.getOperatingMode().equals("0")) 213 protectDeliver = true; 214 else if(protectPreview.equals("true") && !CmsPropertyHandler.getOperatingMode().equals("2")) 215 protectDeliver = true; 216 217 if(protectedSiteNodeVersionId != null || protectDeliver) 218 isUserRedirected = handleExtranetLogic(dbWrapper.getDatabase(), protectedSiteNodeVersionId, protectDeliver); 219 220 this.templateController = getTemplateController(dbWrapper, getSiteNodeId(), getLanguageId(), getContentId(), getRequest(), (InfoGluePrincipal)this.principal, false); 221 222 logger.info("handled extranet users: " + isUserRedirected); 223 224 228 String portalEnabled = CmsPropertyHandler.getEnablePortal(); 230 boolean portalActive = ((portalEnabled != null) && portalEnabled.equals("true")); 231 232 if (portalActive && !isRecacheCall) 233 { 234 logger.info("---> Checking for portlet action"); 235 PortalService service = new PortalService(); 236 boolean actionExecuted = service.service(getRequest(), getResponse()); 238 239 if (actionExecuted) 241 { 242 logger.info("---> PortletAction was executed, returning NONE as a redirect has been issued"); 243 isUserRedirected = true; 244 return NONE; 245 } 246 } 247 248 logger.info("handled portal action: " + isUserRedirected); 249 250 if(!isUserRedirected) 251 { 252 logger.info("this.templateController.getPrincipal():" + this.templateController.getPrincipal()); 253 DeliveryContext deliveryContext = DeliveryContext.getDeliveryContext(); 254 deliveryContext.setRepositoryName(this.repositoryName); 255 deliveryContext.setSiteNodeId(this.siteNodeId); 256 deliveryContext.setContentId(this.contentId); 257 deliveryContext.setLanguageId(this.languageId); 258 deliveryContext.setPageKey(pageKey); 259 deliveryContext.setSession(this.getSession()); 260 deliveryContext.setInfoGlueAbstractAction(this); 261 deliveryContext.setHttpServletRequest(this.getRequest()); 262 deliveryContext.setHttpServletResponse(this.getResponse()); 263 deliveryContext.setUseFullUrl(Boolean.parseBoolean(CmsPropertyHandler.getUseDNSNameInURI())); 264 265 SiteNodeTypeDefinitionVO siteNodeTypeDefinitionVO = getSiteNodeTypeDefinition(this.siteNodeId, dbWrapper.getDatabase()); 266 267 try 268 { 269 String invokerClassName = siteNodeTypeDefinitionVO.getInvokerClassName(); 270 PageInvoker pageInvoker = (PageInvoker)Class.forName(invokerClassName).newInstance(); 271 pageInvoker.setParameters(dbWrapper, this.getRequest(), this.getResponse(), this.templateController, deliveryContext); 272 pageInvoker.deliverPage(); 273 274 request.setAttribute("progress", "after pageInvoker was called"); 275 } 276 catch(ClassNotFoundException e) 277 { 278 throw new SystemException("An error was thrown when trying to use the page invoker class assigned to this page type:" + e.getMessage(), e); 279 } 280 } 281 282 StatisticsService.getStatisticsService().registerRequest(getRequest(), getResponse(), pagePath, elapsedTime); 283 logger.info("Registered request in statistics service"); 284 } 285 catch(Exception e) 286 { 287 logger.error("An error occurred so we should not complete the transaction:" + e, e); 288 rollbackTransaction(dbWrapper.getDatabase()); 289 290 getResponse().setContentType("text/html; charset=UTF-8"); 291 getRequest().setAttribute("responseCode", "500"); 292 getRequest().setAttribute("error", e); 293 getRequest().getRequestDispatcher("/ErrorPage.action").forward(getRequest(), getResponse()); 294 } 295 finally 296 { 297 logger.info("Before closing transaction"); 298 299 closeTransaction(dbWrapper.getDatabase()); 300 301 logger.info("After closing transaction"); 302 303 308 elapsedTime = System.currentTimeMillis() - start; 309 RequestAnalyser.getRequestAnalyser().decNumberOfCurrentRequests(); 310 311 if(elapsedTime > 10000) 312 { 313 logger.warn("The page delivery took " + elapsedTime + "ms for request " + this.getRequest().getRequestURL() + "?" + this.getRequest().getQueryString()); 314 logger.warn("The memory consumption was " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) + "(" + Runtime.getRuntime().totalMemory() + "/" + Runtime.getRuntime().maxMemory() + ") bytes"); 315 } 316 else 317 { 318 logger.info("The page delivery took " + elapsedTime + "ms"); 319 logger.info("The memory consumption was " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) + "(" + Runtime.getRuntime().totalMemory() + "/" + Runtime.getRuntime().maxMemory() + ") bytes"); 320 } 321 322 if(tk != null) 323 tk.done(); 324 } 325 326 328 return NONE; 329 } 330 331 332 333 336 337 public String doRenderDecoratedPage() throws Exception 338 { 339 if(CmsPropertyHandler.getOperatingMode().equals("3")) 340 return doExecute(); 341 342 while(!CmsPropertyHandler.getOperatingMode().equals("3") && RequestAnalyser.getRequestAnalyser().getBlockRequests()) 343 { 344 Thread.sleep(10); 346 } 347 348 HttpServletRequest request = getRequest(); 349 350 RequestAnalyser.getRequestAnalyser().incNumberOfCurrentRequests(); 351 352 long start = new Date ().getTime(); 353 long elapsedTime = 0; 354 355 logger.info("************************************************"); 356 logger.info("* ViewPageAction was called.... *"); 357 logger.info("************************************************"); 358 359 if(!CmsPropertyHandler.getOperatingMode().equals("3")) 360 tk = new ThreadMonitor(new Long (CmsPropertyHandler.getDeliverRequestTimeout()).longValue(), request, "Page view took to long!", true); 361 362 DatabaseWrapper dbWrapper = new DatabaseWrapper(CastorDatabaseService.getDatabase()); 363 365 beginTransaction(dbWrapper.getDatabase()); 366 367 try 368 { 369 validateAndModifyInputParameters(dbWrapper.getDatabase()); 370 371 this.nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(this.siteNodeId, this.languageId, this.contentId); 372 this.integrationDeliveryController = IntegrationDeliveryController.getIntegrationDeliveryController(this.siteNodeId, this.languageId, this.contentId); 373 374 String pageKey = this.nodeDeliveryController.getPageCacheKey(dbWrapper.getDatabase(), this.getHttpSession(), this.getRequest(), this.siteNodeId, this.languageId, this.contentId, browserBean.getUseragent(), this.getRequest().getQueryString(), "_" + this.showSimple + "_pagecomponentDecorated"); 377 378 logger.info("A pageKey:" + pageKey); 379 String pagePath = null; 380 381 boolean isUserRedirected = false; 382 Integer protectedSiteNodeVersionId = this.nodeDeliveryController.getProtectedSiteNodeVersionId(dbWrapper.getDatabase(), siteNodeId); 383 logger.info("protectedSiteNodeVersionId:" + protectedSiteNodeVersionId); 384 385 String protectWorking = CmsPropertyHandler.getProtectDeliverWorking(); 386 String protectPreview = CmsPropertyHandler.getProtectDeliverPreview(); 387 boolean protectDeliver = false; 388 389 if(protectWorking.equals("true") && !CmsPropertyHandler.getOperatingMode().equals("0")) 390 protectDeliver = true; 391 else if(protectPreview.equals("true") && !CmsPropertyHandler.getOperatingMode().equals("2")) 392 protectDeliver = true; 393 394 if(protectedSiteNodeVersionId != null || protectDeliver) 395 isUserRedirected = handleExtranetLogic(dbWrapper.getDatabase(), protectedSiteNodeVersionId, protectDeliver); 396 397 this.templateController = getTemplateController(dbWrapper, getSiteNodeId(), getLanguageId(), getContentId(), getRequest(), (InfoGluePrincipal)this.principal, true); 398 399 logger.info("handled extranet users"); 400 401 405 String portalEnabled = CmsPropertyHandler.getEnablePortal(); 407 boolean portalActive = ((portalEnabled != null) && portalEnabled.equals("true")); 408 409 if (portalActive && !isRecacheCall) 410 { 411 logger.info("---> Checking for portlet action"); 412 PortalService service = new PortalService(); 413 boolean actionExecuted = service.service(getRequest(), getResponse()); 415 416 if (actionExecuted) 418 { 419 logger.info("---> PortletAction was executed, returning NONE as a redirect has been issued"); 420 isUserRedirected = true; 421 return NONE; 422 } 423 } 424 425 logger.info("handled portal action"); 426 427 if(!isUserRedirected) 428 { 429 logger.info("this.templateController.getPrincipal():" + this.templateController.getPrincipal()); 430 431 DeliveryContext deliveryContext = DeliveryContext.getDeliveryContext(); 432 deliveryContext.setRepositoryName(this.repositoryName); 433 deliveryContext.setSiteNodeId(this.siteNodeId); 434 deliveryContext.setLanguageId(this.languageId); 435 deliveryContext.setContentId(this.contentId); 436 deliveryContext.setShowSimple(this.showSimple); 437 deliveryContext.setPageKey(pageKey); 438 deliveryContext.setSession(this.getSession()); 439 deliveryContext.setInfoGlueAbstractAction(this); 440 deliveryContext.setHttpServletRequest(this.getRequest()); 441 deliveryContext.setHttpServletResponse(this.getResponse()); 442 deliveryContext.setUseFullUrl(Boolean.parseBoolean(CmsPropertyHandler.getUseDNSNameInURI())); 443 444 SiteNode siteNode = nodeDeliveryController.getSiteNode(dbWrapper.getDatabase(), this.siteNodeId); 445 if(siteNode == null) 446 throw new SystemException("There was no page with this id."); 447 448 String invokerClassName = siteNode.getSiteNodeTypeDefinition().getInvokerClassName(); 449 450 if(invokerClassName == null && invokerClassName.equals("")) 451 { 452 throw new SystemException("There was no page invoker class assigned to this page type."); 453 } 454 else 455 { 456 try 457 { 458 PageInvoker pageInvoker = (PageInvoker)Class.forName(invokerClassName).newInstance(); 459 pageInvoker = pageInvoker.getDecoratedPageInvoker(); 460 pageInvoker.setParameters(dbWrapper, this.getRequest(), this.getResponse(), this.templateController, deliveryContext); 461 pageInvoker.deliverPage(); 462 } 463 catch(ClassNotFoundException e) 464 { 465 throw new SystemException("An error was thrown when trying to use the page invoker class assigned to this page type:" + e.getMessage(), e); 466 } 467 } 468 } 469 470 StatisticsService.getStatisticsService().registerRequest(getRequest(), getResponse(), pagePath, elapsedTime); 471 } 472 catch(Exception e) 473 { 474 logger.error("An error occurred so we should not complete the transaction:" + e, e); 475 rollbackTransaction(dbWrapper.getDatabase()); 476 throw new SystemException(e.getMessage()); 477 } 478 finally 479 { 480 closeTransaction(dbWrapper.getDatabase()); 481 482 elapsedTime = System.currentTimeMillis() - start; 483 484 RequestAnalyser.getRequestAnalyser().decNumberOfCurrentRequests(); 485 486 if(elapsedTime > 20000) 487 { 488 logger.warn("The page delivery took " + elapsedTime + "ms for request " + this.getRequest().getRequestURL() + "?" + this.getRequest().getQueryString()); 489 logger.warn("The memory consumption was " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) + "(" + Runtime.getRuntime().totalMemory() + "/" + Runtime.getRuntime().maxMemory() + ") bytes"); 490 } 491 else 492 { 493 logger.info("The page delivery took " + elapsedTime + "ms"); 494 logger.info("The memory consumption was " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) + "(" + Runtime.getRuntime().totalMemory() + "/" + Runtime.getRuntime().maxMemory() + ") bytes"); 495 } 496 497 if(tk != null) 498 tk.done(); 499 } 500 501 return NONE; 502 } 503 504 505 506 512 513 public TemplateController getTemplateController(DatabaseWrapper dbWrapper, Integer siteNodeId, Integer languageId, Integer contentId, HttpServletRequest request, InfoGluePrincipal infoGluePrincipal, boolean allowEditOnSightAtAll) throws SystemException, Exception 514 { 515 TemplateController templateController = new BasicTemplateController(dbWrapper, infoGluePrincipal); 516 templateController.setStandardRequestParameters(siteNodeId, languageId, contentId); 517 templateController.setHttpRequest(request); 518 templateController.setBrowserBean(browserBean); 519 templateController.setDeliveryControllers(this.nodeDeliveryController, null, this.integrationDeliveryController); 520 521 String operatingMode = CmsPropertyHandler.getOperatingMode(); 522 523 if(operatingMode != null && (operatingMode.equals("0") || operatingMode.equals("1") || operatingMode.equals("2"))) 524 { 525 String editOnSite = CmsPropertyHandler.getEditOnSite(); 526 boolean isEditOnSightDisabled = templateController.getIsEditOnSightDisabled(); 527 528 if(allowEditOnSightAtAll && !isEditOnSightDisabled && editOnSite != null && editOnSite.equalsIgnoreCase("true")) 529 { 530 templateController = new EditOnSiteBasicTemplateController(dbWrapper, infoGluePrincipal); 531 templateController.setStandardRequestParameters(siteNodeId, languageId, contentId); 532 templateController.setHttpRequest(request); 533 templateController.setBrowserBean(browserBean); 534 templateController.setDeliveryControllers(this.nodeDeliveryController, null, this.integrationDeliveryController); 535 } 536 } 537 538 return templateController; 539 } 540 541 542 548 549 private void validateAndModifyInputParameters(Database db) throws SystemException, Exception 550 { 551 this.browserBean = new BrowserBean(); 552 this.browserBean.setRequest(getRequest()); 553 554 this.principal = (Principal )this.getHttpSession().getAttribute("infogluePrincipal"); 555 556 if(this.principal == null) 557 { 558 try 559 { 560 this.principal = (Principal )CacheController.getCachedObject("userCache", "anonymous"); 561 if(this.principal == null) 562 { 563 Map arguments = new HashMap (); 564 arguments.put("j_username", CmsPropertyHandler.getAnonymousUser()); 565 arguments.put("j_password", CmsPropertyHandler.getAnonymousPassword()); 566 567 this.principal = ExtranetController.getController().getAuthenticatedPrincipal(db, arguments); 568 569 if(principal != null) 570 CacheController.cacheObject("userCache", "anonymous", this.principal); 571 } 572 574 } 575 catch(Exception e) 576 { 577 throw new SystemException("There was no anonymous user found in the system. There must be - add the user anonymous/anonymous and try again.", e); 578 } 579 } 580 581 if(getSiteNodeId() == null) 582 { 583 if(getRepositoryName() == null) 584 { 585 setRepositoryName(RepositoryDeliveryController.getRepositoryDeliveryController().getMasterRepository(db).getName()); 586 } 587 588 SiteNodeVO rootSiteNodeVO = NodeDeliveryController.getRootSiteNode(db, getRepositoryName()); 589 if(rootSiteNodeVO == null) 590 throw new SystemException("There was no repository called " + getRepositoryName() + " or no pages were available in that repository"); 591 592 setSiteNodeId(rootSiteNodeVO.getSiteNodeId()); 593 } 594 595 try 596 { 597 if(getSiteNodeId() != null) 598 SiteNodeController.getSiteNodeVOWithId(getSiteNodeId(), db); 599 } 600 catch(Exception e) 601 { 602 throw new SystemException("There was no page with the current specification. SiteNodeId:" + getSiteNodeId()); 603 } 604 605 if(getLanguageId() == null) 606 { 607 LanguageVO browserLanguageVO = null; 608 609 String useAlternativeBrowserLanguageCheck = CmsPropertyHandler.getUseAlternativeBrowserLanguageCheck(); 610 if(useAlternativeBrowserLanguageCheck == null || !useAlternativeBrowserLanguageCheck.equalsIgnoreCase("true")) 611 browserLanguageVO = LanguageDeliveryController.getLanguageDeliveryController().getLanguageIfSiteNodeSupportsIt(db, browserBean.getLanguageCode(), getSiteNodeId(), (InfoGluePrincipal)this.principal); 612 else 613 browserLanguageVO = LanguageDeliveryController.getLanguageDeliveryController().getLanguageIfRepositorySupportsIt(db, browserBean.getLanguageCode(), getSiteNodeId()); 614 615 logger.debug("Checking browser language..."); 616 617 if(browserLanguageVO != null) 618 { 619 logger.info("The system had browserLanguageVO available:" + browserLanguageVO.getName()); 620 setLanguageId(browserLanguageVO.getLanguageId()); 621 } 622 else 623 { 624 LanguageVO masterLanguageVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(db, this.getSiteNodeId()); 625 if(masterLanguageVO == null) 626 throw new SystemException("There was no master language for the siteNode " + getSiteNodeId()); 627 628 629 NodeDeliveryController ndc = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId); 630 boolean isMasterLanguageValid = LanguageDeliveryController.getLanguageDeliveryController().getIsValidLanguage(db, ndc, ndc.getSiteNode(db, siteNodeId), masterLanguageVO.getId()); 631 if(!isMasterLanguageValid) 632 { 633 logger.info("Master language was not allowed on this sitenode... let's take the next on in order"); 634 List languages = LanguageDeliveryController.getLanguageDeliveryController().getAvailableLanguages(db, this.getSiteNodeId()); 635 Iterator languagesIterator = languages.iterator(); 636 while(languagesIterator.hasNext()) 637 { 638 LanguageVO currentLanguage = (LanguageVO)languagesIterator.next(); 639 boolean isCurrentLanguageValid = LanguageDeliveryController.getLanguageDeliveryController().getIsValidLanguage(db, ndc, ndc.getSiteNode(db, siteNodeId), currentLanguage.getId()); 640 logger.info("currentLanguage validity:" + isCurrentLanguageValid); 641 if(isCurrentLanguageValid) 642 { 643 setLanguageId(currentLanguage.getLanguageId()); 644 break; 645 } 646 } 647 } 648 else 649 { 650 logger.info("The system had no browserLanguageVO available - using master language instead:" + masterLanguageVO.getName()); 651 setLanguageId(masterLanguageVO.getLanguageId()); 652 } 653 654 } 655 } 656 else 657 { 658 LanguageVO languageVO = LanguageDeliveryController.getLanguageDeliveryController().getLanguageIfSiteNodeSupportsIt(db, getLanguageId(), getSiteNodeId()); 659 660 if(languageVO != null) 661 { 662 logger.info("The system had browserLanguageVO available:" + languageVO.getName()); 663 setLanguageId(languageVO.getLanguageId()); 664 } 665 else 666 { 667 LanguageVO masterLanguageVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(db, this.getSiteNodeId()); 668 if(masterLanguageVO == null) 669 throw new SystemException("There was no master language for the siteNode " + getSiteNodeId()); 670 671 NodeDeliveryController ndc = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId); 672 boolean isMasterLanguageValid = LanguageDeliveryController.getLanguageDeliveryController().getIsValidLanguage(db, ndc, ndc.getSiteNode(db, siteNodeId), masterLanguageVO.getId()); 673 if(!isMasterLanguageValid) 674 { 675 logger.info("Master language was not allowed on this sitenode... let's take the next on in order"); 676 List languages = LanguageDeliveryController.getLanguageDeliveryController().getAvailableLanguages(db, this.getSiteNodeId()); 677 Iterator languagesIterator = languages.iterator(); 678 while(languagesIterator.hasNext()) 679 { 680 LanguageVO currentLanguage = (LanguageVO)languagesIterator.next(); 681 boolean isCurrentLanguageValid = LanguageDeliveryController.getLanguageDeliveryController().getIsValidLanguage(db, ndc, ndc.getSiteNode(db, siteNodeId), currentLanguage.getId()); 682 logger.info("currentLanguage validity:" + isCurrentLanguageValid); 683 if(isCurrentLanguageValid) 684 { 685 setLanguageId(currentLanguage.getLanguageId()); 686 break; 687 } 688 } 689 } 690 else 691 { 692 logger.info("The system had no browserLanguageVO available - using master language instead:" + masterLanguageVO.getName()); 693 setLanguageId(masterLanguageVO.getLanguageId()); 694 } 695 } 696 } 697 } 698 699 704 705 public boolean handleExtranetLogic(Database db, Integer protectedSiteNodeVersionId, boolean protectDeliver) throws SystemException, Exception 706 { 707 boolean isRedirected = false; 708 709 try 710 { 711 String referer = this.getRequest().getHeader("Referer"); 712 logger.info("referer:" + referer); 713 714 if(referer == null || referer.indexOf("ViewStructureToolToolBar.action") != -1) 715 referer = "/"; 716 717 Principal principal = (Principal )this.getHttpSession().getAttribute("infogluePrincipal"); 718 logger.info("principal:" + principal); 719 720 if(principal == null) 722 { 723 if(this.getRequest().getUserPrincipal() != null && !(this.getRequest().getUserPrincipal() instanceof InfoGluePrincipal)) 724 { 725 Map status = new HashMap (); 726 status.put("redirected", new Boolean (false)); 727 principal = AuthenticationModule.getAuthenticationModule(db, this.getOriginalFullURL()).loginUser(getRequest(), getResponse(), status); 728 Boolean redirected = (Boolean )status.get("redirected"); 729 if(redirected != null && redirected.booleanValue()) 730 { 731 this.getHttpSession().removeAttribute("infogluePrincipal"); 732 this.principal = null; 733 return true; 734 } 735 else if(principal != null) 736 { 737 this.getHttpSession().setAttribute("infogluePrincipal", principal); 738 this.getHttpSession().setAttribute("infoglueRemoteUser", principal.getName()); 739 740 this.principal = principal; 741 } 742 } 743 } 744 745 if(principal == null && !protectDeliver) 746 { 747 Principal anonymousPrincipal = getAnonymousPrincipal(); 748 boolean isAuthorized = AccessRightController.getController().getIsPrincipalAuthorized(db, (InfoGluePrincipal)anonymousPrincipal, "SiteNodeVersion.Read", protectedSiteNodeVersionId.toString()); 749 if(isAuthorized) 750 { 751 principal = anonymousPrincipal; 752 if(principal != null) 753 { 754 this.getHttpSession().setAttribute("infogluePrincipal", principal); 755 this.getHttpSession().setAttribute("infoglueRemoteUser", principal.getName()); 756 } 757 } 758 } 759 760 if(principal == null) 761 { 762 Map status = new HashMap (); 763 status.put("redirected", new Boolean (false)); 764 principal = AuthenticationModule.getAuthenticationModule(db, this.getOriginalFullURL()).loginUser(getRequest(), getResponse(), status); 765 Boolean redirected = (Boolean )status.get("redirected"); 766 if(redirected != null && redirected.booleanValue()) 767 { 768 this.getHttpSession().removeAttribute("infogluePrincipal"); 769 this.principal = null; 770 return true; 771 } 772 else if(principal != null) 773 { 774 this.getHttpSession().setAttribute("infogluePrincipal", principal); 775 this.getHttpSession().setAttribute("infoglueRemoteUser", principal.getName()); 776 777 this.principal = principal; 778 } 779 780 if(principal == null) 781 principal = loginWithCookies(); 782 783 if(principal == null) 784 principal = loginWithRequestArguments(); 785 786 if(principal == null) 787 { 788 try 789 { 790 principal = getAnonymousPrincipal(); 791 792 if(principal != null) 793 { 794 this.getHttpSession().setAttribute("infogluePrincipal", principal); 795 this.getHttpSession().setAttribute("infoglueRemoteUser", principal.getName()); 796 797 boolean isAuthorized = false; 798 if(!protectDeliver) 799 isAuthorized = AccessRightController.getController().getIsPrincipalAuthorized(db, (InfoGluePrincipal)principal, "SiteNodeVersion.Read", protectedSiteNodeVersionId.toString()); 800 801 if(!isAuthorized) 802 { 803 this.getHttpSession().removeAttribute("infogluePrincipal"); 804 logger.info("SiteNode is protected and anonymous user was not allowed - sending him to login page."); 805 String redirectUrl = getRedirectUrl(getRequest(), getResponse()); 806 getResponse().sendRedirect(redirectUrl); 808 isRedirected = true; 809 } 810 } 811 } 812 catch(Exception e) 813 { 814 throw new SystemException("There was no anonymous user found in the system. There must be - add the user anonymous/anonymous and try again.", e); 815 } 816 } 817 else 818 { 819 boolean isAuthorized = false; 820 if(protectDeliver && protectedSiteNodeVersionId == null && !principal.getName().equals(CmsPropertyHandler.getAnonymousUser())) 821 isAuthorized = true; 822 else if(!protectDeliver) 823 isAuthorized = AccessRightController.getController().getIsPrincipalAuthorized(db, (InfoGluePrincipal)principal, "SiteNodeVersion.Read", protectedSiteNodeVersionId.toString()); 824 825 if(!isAuthorized) 826 { 827 if(this.referer == null) 828 this.referer = this.getRequest().getHeader("Referer"); 829 830 if(this.referer == null || referer.indexOf("ViewStructureToolToolBar.action") != -1) 831 this.referer = "/"; 832 833 if(principal.getName().equals(CmsPropertyHandler.getAnonymousUser())) 834 { 835 logger.info("SiteNode is protected and user was anonymous - sending him to login page."); 836 String url = getRedirectUrl(getRequest(), getResponse()); 838 839 getResponse().sendRedirect(url); 840 isRedirected = true; 841 } 842 else 843 { 844 logger.info("SiteNode is protected and user has no access - sending him to no access page."); 845 String url = "ExtranetLogin!noAccess.action?referer=" + URLEncoder.encode(this.referer, "UTF-8") + "&date=" + System.currentTimeMillis(); 846 getResponse().sendRedirect(url); 847 isRedirected = true; 848 } 849 } 850 else 851 { 852 this.getHttpSession().setAttribute("infogluePrincipal", principal); 853 this.getHttpSession().setAttribute("infoglueRemoteUser", principal.getName()); 854 855 this.principal = principal; 856 } 857 } 858 859 } 860 else 861 { 862 logger.info("principal:" + principal); 863 logger.info("protectedSiteNodeVersionId:" + protectedSiteNodeVersionId); 864 865 Principal alternativePrincipal = loginWithCookies(); 866 if(alternativePrincipal == null) 867 alternativePrincipal = loginWithRequestArguments(); 868 869 if(protectedSiteNodeVersionId != null && alternativePrincipal != null && AccessRightController.getController().getIsPrincipalAuthorized((InfoGluePrincipal)alternativePrincipal, "SiteNodeVersion.Read", protectedSiteNodeVersionId.toString())) 870 { 871 logger.info("The user " + alternativePrincipal.getName() + " was approved."); 872 } 873 else if(protectedSiteNodeVersionId != null && !AccessRightController.getController().getIsPrincipalAuthorized((InfoGluePrincipal)principal, "SiteNodeVersion.Read", protectedSiteNodeVersionId.toString()) && !AccessRightController.getController().getIsPrincipalAuthorized((InfoGluePrincipal)this.getAnonymousPrincipal(), "SiteNodeVersion.Read", protectedSiteNodeVersionId.toString())) 874 { 875 if(this.referer == null) 876 this.referer = this.getRequest().getHeader("Referer"); 877 878 if(this.referer == null || referer.indexOf("ViewStructureToolToolBar.action") != -1) 879 this.referer = "/"; 880 881 if(principal.getName().equals(CmsPropertyHandler.getAnonymousUser())) 882 { 883 logger.info("SiteNode is protected and user was anonymous - sending him to login page."); 884 String url = getRedirectUrl(getRequest(), getResponse()); 886 887 getResponse().sendRedirect(url); 888 isRedirected = true; 889 } 890 else 891 { 892 logger.info("SiteNode is protected and user has no access - sending him to no access page."); 893 String url = "ExtranetLogin!noAccess.action?referer=" + URLEncoder.encode(this.referer, "UTF-8") + "&date=" + System.currentTimeMillis(); 894 895 getResponse().sendRedirect(url); 896 isRedirected = true; 897 } 898 } 899 else if(protectedSiteNodeVersionId == null && protectDeliver) 900 { 901 logger.info("Setting user to anonymous... as this is a protected deliver but not a extranet..."); 902 Principal anonymousPrincipal = getAnonymousPrincipal(); 903 904 907 this.principal = anonymousPrincipal; 908 } 909 } 910 } 911 catch(SystemException se) 912 { 913 logger.warn("An error occurred:" + se.getMessage(), se); 914 throw se; 915 } 916 catch(Exception e) 917 { 918 logger.error("An error occurred:" + e.getMessage(), e); 919 } 920 921 return isRedirected; 922 } 923 924 925 932 private Principal loginWithCookies() throws Exception 933 { 934 Principal principal = null; 935 936 boolean enableExtranetCookies = false; 937 int extranetCookieTimeout = 43200; String enableExtranetCookiesString = CmsPropertyHandler.getEnableExtranetCookies(); 939 String extranetCookieTimeoutString = CmsPropertyHandler.getExtranetCookieTimeout(); 940 if(enableExtranetCookiesString != null && enableExtranetCookiesString.equalsIgnoreCase("true")) 941 { 942 enableExtranetCookies = true; 943 } 944 if(extranetCookieTimeoutString != null) 945 { 946 try 947 { 948 extranetCookieTimeout = Integer.parseInt(extranetCookieTimeoutString.trim()); 949 } 950 catch(Exception e) {} 951 } 952 953 if(enableExtranetCookies) 954 { 955 String userName = null; 956 String password = null; 957 Cookie [] cookies = this.getRequest().getCookies(); 958 if(cookies != null) 959 { 960 for(int i=0; i<cookies.length; i++) 961 { 962 Cookie cookie = cookies[i]; 963 if(cookie.getName().equals("igextranetuserid")) 964 userName = cookie.getValue(); 965 else if(cookie.getName().equals("igextranetpassword")) 966 password = cookie.getValue(); 967 } 968 } 969 970 if(userName != null && password != null) 971 { 972 DesEncryptionHelper encHelper = new DesEncryptionHelper(); 973 userName = encHelper.decrypt(userName); 974 password = encHelper.decrypt(password); 975 976 Map arguments = new HashMap (); 977 arguments.put("j_username", userName); 978 arguments.put("j_password", password); 979 980 principal = ExtranetController.getController().getAuthenticatedPrincipal(arguments); 981 if(principal != null) 982 { 983 this.getHttpSession().setAttribute("infogluePrincipal", principal); 984 this.getHttpSession().setAttribute("infoglueRemoteUser", principal.getName()); 985 } 986 987 } 988 } 989 990 return principal; 991 } 992 993 1000 private Principal loginWithRequestArguments() throws Exception 1001 { 1002 Principal principal = null; 1003 1004 String userName = this.getRequest().getParameter("j_username"); 1005 String password = this.getRequest().getParameter("j_password"); 1006 String ticket = null; 1011 if(ticket != null) 1012 { 1013 Map arguments = new HashMap (); 1015 arguments.put("ticket", ticket); 1016 1017 principal = ExtranetController.getController().getAuthenticatedPrincipal(arguments); 1018 if(principal != null) 1019 { 1020 this.getHttpSession().setAttribute("infogluePrincipal", principal); 1021 this.getHttpSession().setAttribute("infoglueRemoteUser", principal.getName()); 1022 } 1023 } 1024 else if(userName != null && password != null) 1025 { 1026 Map arguments = new HashMap (); 1027 arguments.put("j_username", userName); 1028 arguments.put("j_password", password); 1029 1030 principal = ExtranetController.getController().getAuthenticatedPrincipal(arguments); 1031 if(principal != null) 1032 { 1033 this.getHttpSession().setAttribute("infogluePrincipal", principal); 1034 this.getHttpSession().setAttribute("infoglueRemoteUser", principal.getName()); 1035 } 1036 } 1037 1038 return principal; 1039 } 1040 1041 1042 1046 private SiteNodeTypeDefinitionVO getSiteNodeTypeDefinition(Integer siteNodeId, Database db) throws SystemException 1047 { 1048 String key = "" + siteNodeId; 1049 logger.info("key:" + key); 1050 SiteNodeTypeDefinitionVO siteNodeTypeDefinitionVO = (SiteNodeTypeDefinitionVO)CacheController.getCachedObject("pageCacheSiteNodeTypeDefinition", key); 1051 if(siteNodeTypeDefinitionVO != null) 1052 { 1053 logger.info("There was an cached siteNodeTypeDefinitionVO:" + siteNodeTypeDefinitionVO); 1054 } 1055 else 1056 { 1057 1058 SiteNode siteNode = nodeDeliveryController.getSiteNode(db, this.siteNodeId); 1059 if(siteNode == null) 1060 throw new SystemException("There was no page with this id."); 1061 1062 if(siteNode.getSiteNodeTypeDefinition() == null || siteNode.getSiteNodeTypeDefinition().getInvokerClassName() == null || siteNode.getSiteNodeTypeDefinition().getInvokerClassName().equals("")) 1063 { 1064 throw new SystemException("There was no page invoker class assigned to the site node " + siteNode.getName()); 1065 } 1066 1067 siteNodeTypeDefinitionVO = siteNode.getSiteNodeTypeDefinition().getValueObject(); 1068 1069 CacheController.cacheObject("pageCacheSiteNodeTypeDefinition", key, siteNodeTypeDefinitionVO); 1070 } 1071 1072 return siteNodeTypeDefinitionVO; 1073 } 1074 1075 private String getRedirectUrl(HttpServletRequest request, HttpServletResponse response) throws ServletException , Exception 1076 { 1077 String url = AuthenticationModule.getAuthenticationModule(null, this.getOriginalFullURL()).getLoginDialogUrl(request, response); 1078 1079 return url; 1080 } 1081 1082 1085 1086 public java.lang.Integer getSiteNodeId() 1087 { 1088 return this.siteNodeId; 1089 } 1090 1091 public void setSiteNodeId(Integer siteNodeId) 1092 { 1093 this.siteNodeId = siteNodeId; 1094 } 1095 1096 public Integer getContentId() 1097 { 1098 return this.contentId; 1099 } 1100 1101 public void setContentId(Integer contentId) 1102 { 1103 this.contentId = contentId; 1104 } 1105 1106 public Integer getLanguageId() 1107 { 1108 return this.languageId; 1109 } 1110 1111 public void setLanguageId(Integer languageId) 1112 { 1113 this.languageId = languageId; 1114 } 1115 1116 public String getRepositoryName() 1117 { 1118 return this.repositoryName; 1119 } 1120 1121 public void setRepositoryName(String repositoryName) 1122 { 1123 this.repositoryName = repositoryName; 1124 } 1125 1126 public String getReferer() 1127 { 1128 return referer; 1129 } 1130 1131 public void setReferer(String referer) 1132 { 1133 this.referer = referer; 1134 } 1135 1136 public void setShowSimple(boolean showSimple) 1137 { 1138 this.showSimple = showSimple; 1139 } 1140 1141 public void setRecacheCall(boolean isRecacheCall) 1142 { 1143 this.isRecacheCall = isRecacheCall; 1144 } 1145 1146 public void setCmsUserName(String userName) 1147 { 1148 this.getHttpSession().setAttribute("cmsUserName", userName); 1149 } 1150 1151} 1152 | Popular Tags |