public Link createPageRenderLink(PageRenderRequestParameters parameters) { StringBuilder builder = new StringBuilder(BUFFER_SIZE); // Build up the absolute URI. String activePageName = parameters.getLogicalPageName(); builder.append(contextPath); encodeAppFolderAndLocale(builder); builder.append(SLASH); String encodedPageName = encodePageName(activePageName); builder.append(encodedPageName); appendContext(encodedPageName.length() > 0, parameters.getActivationContext(), builder); Link link = new LinkImpl(builder.toString(), false, requestSecurityManager.checkPageSecurity(activePageName), response, contextPathEncoder, baseURLSource); if (parameters.isLoopback()) { link.addParameter(TapestryConstants.PAGE_LOOPBACK_PARAMETER_NAME, "t"); } return link; }
public Void perform() throws IOException { handler.handle(new PageRenderRequestParameters(pageName, context, false)); return null; } });
public Link transformPageRenderLink(Link defaultLink, PageRenderRequestParameters parameters) { if (!parameters.getLogicalPageName().equals("View")) return null; StringBuilder path = new StringBuilder(); Locale locale = persistentLocale.get(); if (locale != null) path.append('/').append(locale.toString()); path.append('/'); // Cheating: we know there's exactly one value in the context. path.append(parameters.getActivationContext().get(String.class, 0)); return defaultLink.copyWithBasePath(path.toString()); }
public void createdPageRenderLink(Link link, PageRenderRequestParameters parameters) { trigger(parameters.getLogicalPageName(), EventConstants.DECORATE_PAGE_RENDER_LINK, link, parameters); }
@Override public void handlePageRender(PageRenderRequestParameters parameters, ComponentRequestHandler handler) throws IOException { if (logger.isTraceEnabled()) { logger.trace("handlePageRender"); } if (redirectUnauthorizedUser(parameters.getLogicalPageName())) { return; } handler.handlePageRender(parameters); }
public void handle(PageRenderRequestParameters parameters) throws IOException { Page page = cache.get(parameters.getLogicalPageName()); if (request.getAttribute(InternalConstants.BYPASS_ACTIVATION) == null) { if (pageActivator.activatePage(page.getRootElement().getComponentResources(), parameters.getActivationContext(), resultProcessor)) { return; } if (!parameters.isLoopback()) { page.pageReset(); } } pageResponseRenderer.renderPageResponse(page); } }
public RootPathDispatcher(ComponentClassResolver componentClassResolver, ComponentRequestHandler handler, @Symbol(SymbolConstants.START_PAGE_NAME) String startPageName, LocalizationSetter localizationSetter) { this.componentClassResolver = componentClassResolver; this.handler = handler; this.startPageName = startPageName; this.localizationSetter = localizationSetter; parameters = new PageRenderRequestParameters(this.startPageName, EMPTY_CONTEXT, false); }
public void handlePageRender(PageRenderRequestParameters parameters, ComponentRequestHandler handler) throws IOException { globals.storeActivePageName(parameters.getLogicalPageName()); handler.handlePageRender(parameters); }
private void no_extra_context(boolean finalSlash) throws Exception { ComponentClassResolver resolver = mockComponentClassResolver(); Request request = mockRequest(false); LocalizationSetter ls = mockLocalizationSetter(); MetaDataLocator metaDataLocator = neverWhitelistProtected(); String path = "/foo/Bar" + (finalSlash ? "/" : ""); train_getPath(request, path); train_setLocaleFromLocaleName(ls, "foo", false); train_isPageName(resolver, "foo/Bar", true); train_canonicalizePageName(resolver, "foo/Bar", "foo/bar"); replay(); ComponentEventLinkEncoderImpl linkEncoder = new ComponentEventLinkEncoderImpl(resolver, contextPathEncoder, ls, null, null, null, null, true, null, "", metaDataLocator, null); PageRenderRequestParameters parameters = linkEncoder.decodePageRenderRequest(request); assertEquals(parameters.getLogicalPageName(), "foo/bar"); assertEquals(parameters.getActivationContext().getCount(), 0); assertFalse(parameters.isLoopback()); verify(); }
private PageRenderRequestParameters checkIfPage(Request request, String pageName, String pageActivationContext) { if (!componentClassResolver.isPageName(pageName)) { return null; } String canonicalized = componentClassResolver.canonicalizePageName(pageName); // If the page is only visible to the whitelist, but the request is not on the whitelist, then // pretend the page doesn't exist! if (isWhitelistOnlyAndNotValid(canonicalized)) { return null; } try { EventContext activationContext = contextPathEncoder.decodePath(pageActivationContext); boolean loopback = request.getParameter(TapestryConstants.PAGE_LOOPBACK_PARAMETER_NAME) != null; return new PageRenderRequestParameters(canonicalized, activationContext, loopback); } catch (IllegalArgumentException e) { // TAP5-2436 return null; } }
public boolean checkForInsecurePageRenderRequest(PageRenderRequestParameters parameters) throws IOException { if (!needsRedirect(parameters.getLogicalPageName())) return false; // Page is secure but request is not, so redirect. Link link = componentEventLinkEncoder.createPageRenderLink(parameters); response.sendRedirect(link); return true; }
@Test public void page_requires_whitelist_and_client_on_whitelist() throws Exception { ComponentClassResolver resolver = mockComponentClassResolver(); Request request = mockRequest(false); LocalizationSetter ls = mockLocalizationSetter(); MetaDataLocator metaDataLocator = mockMetaDataLocator(); ClientWhitelist whitelist = newMock(ClientWhitelist.class); String path = "/foo/Bar"; train_getPath(request, path); train_setLocaleFromLocaleName(ls, "foo", false); train_isPageName(resolver, "foo/Bar", true); train_canonicalizePageName(resolver, "foo/Bar", "foo/bar"); expect(metaDataLocator.findMeta(MetaDataConstants.WHITELIST_ONLY_PAGE, "foo/bar", boolean.class)).andReturn(true); expect(whitelist.isClientRequestOnWhitelist()).andReturn(true); replay(); ComponentEventLinkEncoderImpl linkEncoder = new ComponentEventLinkEncoderImpl(resolver, contextPathEncoder, ls, null, null, null, null, true, null, "", metaDataLocator, whitelist); PageRenderRequestParameters parameters = linkEncoder.decodePageRenderRequest(request); assertEquals(parameters.getLogicalPageName(), "foo/bar"); assertEquals(parameters.getActivationContext().getCount(), 0); assertFalse(parameters.isLoopback()); verify(); }
public Link createPageRenderLink(String pageName, boolean override, Object... pageActivationContext) { // Resolve the page name to its canonical format (the best version for URLs). This also // validates // the page name. String canonical = resolver.canonicalizePageName(pageName); Object[] context = (override || pageActivationContext.length != 0) ? pageActivationContext : contextCollector .collectPageActivationContext(canonical); boolean loopback = canonical.equals(requestGlobals.getActivePageName()) && pageCache.get(pageName).hasResetListeners(); PageRenderRequestParameters parameters = new PageRenderRequestParameters(canonical, new ArrayEventContext( typeCoercer, context), loopback); Link link = linkEncoder.createPageRenderLink(parameters); for (LinkCreationListener2 listener : listeners) listener.createdPageRenderLink(link, parameters); return link; }
public void handlePageRender(final PageRenderRequestParameters parameters, final ComponentRequestHandler handler) throws IOException { final Holder<IOException> holder = Holder.create(); tracker.run("Handling page render request for page " + parameters.getLogicalPageName(), new Runnable() { public void run() { try { handler.handlePageRender(parameters); } catch (IOException e) { holder.put(e); } } } ); if (holder.hasValue()) { throw holder.get(); } } }
/** * TAPESTRY-2226 */ @Test public void page_activation_context_for_root_index_page() throws Exception { ComponentClassResolver resolver = mockComponentClassResolver(); Request request = mockRequest(false); LocalizationSetter ls = mockLocalizationSetter(); MetaDataLocator metaDataLocator = neverWhitelistProtected(); train_getPath(request, "/foo/bar"); train_setLocaleFromLocaleName(ls, "foo", false); train_isPageName(resolver, "foo/bar", false); train_isPageName(resolver, "foo", false); train_isPageName(resolver, "", true); train_canonicalizePageName(resolver, "", "index"); train_getLocale(request, Locale.ITALIAN); ls.setNonPersistentLocaleFromLocaleName("it"); replay(); ComponentEventLinkEncoderImpl linkEncoder = new ComponentEventLinkEncoderImpl(resolver, contextPathEncoder, ls, null, null, null, null, true, null, "", metaDataLocator, null); PageRenderRequestParameters parameters = linkEncoder.decodePageRenderRequest(request); assertEquals(parameters.getLogicalPageName(), "index"); assertArraysEqual(parameters.getActivationContext().toStrings(), "foo", "bar"); assertFalse(parameters.isLoopback()); verify(); }
public PageRenderRequestParameters decodePageRenderRequest(Request request) { String path = request.getPath(); String[] split = path.substring(1).split("/"); if (split.length == 1 && split[0].equals("")) return null; int pacx = 0; String possibleLocaleName = split[0]; // Might be just the page activation context, or it might be locale then page // activation context boolean localeSpecified = localizationSetter.isSupportedLocaleName(possibleLocaleName); if (localeSpecified) { pacx++; } if (pacx >= split.length) return null; if (localeSpecified) localizationSetter.setLocaleFromLocaleName(possibleLocaleName); boolean isLoopback = request.getParameter(TapestryConstants.PAGE_LOOPBACK_PARAMETER_NAME) != null; return new PageRenderRequestParameters("View", new ArrayEventContext(typeCoercer, split[pacx]), isLoopback); }
private void context_passed_in_path(boolean finalSlash) throws Exception { ComponentClassResolver resolver = mockComponentClassResolver(); Request request = mockRequest(true); LocalizationSetter ls = mockLocalizationSetter(); MetaDataLocator metaDataLocator = neverWhitelistProtected(); String path = "/foo/Bar/zip/zoom" + (finalSlash ? "/" : ""); train_getPath(request, path); train_setLocaleFromLocaleName(ls, "foo", false); train_isPageName(resolver, "foo/Bar/zip/zoom", false); train_isPageName(resolver, "foo/Bar/zip", false); train_isPageName(resolver, "foo/Bar", true); train_canonicalizePageName(resolver, "foo/Bar", "foo/bar"); replay(); ComponentEventLinkEncoderImpl linkEncoder = new ComponentEventLinkEncoderImpl(resolver, contextPathEncoder, ls, null, null, null, null, true, null, "", metaDataLocator, null); PageRenderRequestParameters parameters = linkEncoder.decodePageRenderRequest(request); assertEquals(parameters.getLogicalPageName(), "foo/bar"); assertArraysEqual(parameters.getActivationContext().toStrings(), "zip", "zoom"); assertTrue(parameters.isLoopback()); verify(); }
@Test public void root_index_page_gone() { RequestSecurityManager manager = mockRequestSecurityManager(); Response response = mockResponse(); ContextPathEncoder contextPathEncoder = getService(ContextPathEncoder.class); expect(manager.checkPageSecurity("Index")).andReturn(LinkSecurity.INSECURE); train_encodeURL(response, "/", "MAGIC"); replay(); ComponentEventLinkEncoder encoder = new ComponentEventLinkEncoderImpl(null, contextPathEncoder, null, response, manager, null, null, false, "", "", null, null); PageRenderRequestParameters parameters = new PageRenderRequestParameters("Index", new EmptyEventContext()); Link link = encoder.createPageRenderLink(parameters); assertEquals(link.toURI(), "MAGIC"); verify(); }
@Test public void locale_not_encoded() { RequestSecurityManager manager = mockRequestSecurityManager(); Response response = mockResponse(); ContextPathEncoder contextPathEncoder = getService(ContextPathEncoder.class); expect(manager.checkPageSecurity("MyPage")).andReturn(LinkSecurity.INSECURE); train_encodeURL(response, "/myapp/mypage", "MAGIC"); replay(); ComponentEventLinkEncoder encoder = new ComponentEventLinkEncoderImpl(null, contextPathEncoder, null, response, manager, null, null, false, "/myapp", "", null, null); PageRenderRequestParameters parameters = new PageRenderRequestParameters("MyPage", new EmptyEventContext()); Link link = encoder.createPageRenderLink(parameters); assertEquals(link.toURI(), "MAGIC"); verify(); }
@Test public void index_stripped_off() { RequestSecurityManager manager = mockRequestSecurityManager(); Response response = mockResponse(); ContextPathEncoder contextPathEncoder = getService(ContextPathEncoder.class); expect(manager.checkPageSecurity("admin/Index")).andReturn(LinkSecurity.INSECURE); train_encodeURL(response, "/admin/abc", "MAGIC"); replay(); ComponentEventLinkEncoder encoder = new ComponentEventLinkEncoderImpl(null, contextPathEncoder, null, response, manager, null, null, false, "", "", null, null); PageRenderRequestParameters parameters = new PageRenderRequestParameters("admin/Index", new ArrayEventContext( typeCoercer, "abc")); Link link = encoder.createPageRenderLink(parameters); assertEquals(link.toURI(), "MAGIC"); verify(); }