Re: HTTPS not working with InjectPage or Class
JumpStart <[email protected]>
| Newsgroups | gmane.comp.java.tapestry.user |
|---|---|
| Message-ID | <[email protected]> |
I think I’ve found the cause. It would be great if someone could confirm my logic.
The problem seems to be that the ALB is passing through a secure request with “http” scheme. Tapestry sees that it’s a secure request and assumes the scheme must be “https” so it returns a relative URL (because it returns LinkSecurity.SECURE), instead of generating an absolute URL with “https” scheme (achieved by returning LinkSecurity.FORCE_SECURE).
The place this happens is RequestSecurityManagerImpl’s method checkPageSecurity(String pageName), shown below, from T5.4.1:
public LinkSecurity checkPageSecurity(String pageName)
{
if (!securityEnabled)
{
return request.isSecure() ? LinkSecurity.SECURE : LinkSecurity.INSECURE;
}
boolean securePage = isSecure(pageName);
if (request.isSecure() == securePage)
{
return securePage ? LinkSecurity.SECURE : LinkSecurity.INSECURE;
}
// Return a value that will, ultimately, force an absolute URL.
return securePage ? LinkSecurity.FORCE_SECURE : LinkSecurity.FORCE_INSECURE;
}
It could be changed to either:
(a) always cause an absolute URL (by returning only LinkSecurity.FORCE_SECURE or LinkSecurity.FORCE_INSECURE); or
(b) only return a relative URL (by returning LinkSecurity.SECURE or LinkSecurity.INSECURE) if request.isSecure() and the scheme agree, eg.
if (request.isSecure() == securePage)
{
if (request.isSecure() && request.getAttribute("servletAPI.scheme").equals("https")
|| !request.isSecure() && request.getAttribute("servletAPI.scheme").equals("http"))
{
return securePage ? LinkSecurity.SECURE : LinkSecurity.INSECURE;
}
else
{
return securePage ? LinkSecurity.FORCE_SECURE : LinkSecurity.FORCE_INSECURE;
}
}
Agreed?
Geoff
> On 15 Apr 2017, at 2:08 PM, JumpStart <[email protected]> wrote:
>
> This is getting urgent! Can someone tell me what handles the return types from an event handler? I urgently have to fix it to ensure it returns HTTPS.
>
> BTW, I have a custom BaseURLSource in AppModule:
>
> public static void contributeServiceOverride(@SuppressWarnings("rawtypes") MappedConfiguration<Class, Object> configuration) {
> configuration.add(BaseURLSource.class, new ConfiguredBaseURLSource());
> }
>
> and I’ve determined that every time it is called it returns an https URL. It is NOT called when the 2 event handlers of my example are involved, which seems a bit odd.
>
> Geoff
>
>> On 14 Apr 2017, at 11:17 AM, JumpStart <[email protected] <mailto:[email protected]>> wrote:
>>
>> Hi,
>>
>> I’ve found 2 situations where an HTTP URL is returned despite having set the whole application to “secure”.
>>
>> * The 2 event handlers below are not correct - they return HTTP URLs (in, of course, a 302 redirect), not HTTPS URLs.
>>
>> public class Page1 {
>>
>> @InjectPage
>> private Page2 page2;
>>
>> Object onToPage2InjectPage() {
>> return page2;
>> }
>>
>> Object onToPage2Class() {
>> return Page2.class;
>> }
>>
>> }
>>
>> * Whereas PageLink and EventLink are correct - in Page1 they generated HTTPS URLs.
>>
>> <body>
>> <h1>Page 1</h1>
>>
>> <t:pagelink page="page2">To Page 2 (PageLink)</t:pagelink>
>> <p/>
>> <t:eventlink event="toPage2InjectPage">To Page 2 (InjectPage)</t:eventlink>
>> <p/>
>> <t:eventlink event="toPage2Class">To Page 2 (Class)</t:eventlink>
>> </body>
>>
>> This DID work in my previous setup, which was Apache virtual host on port 443, handling the SSL, and proxying via AJP to Tapestry in Wildfly on port 8009.
>>
>> What’s changed is that I’ve put an AWS ALB (Application Load Balancer) in front of Apache. ALB handles the SSL, forwards to Apache on port 80, which proxies via AJP to Tapestry in Wildfly on port 8009.
>>
>> I think the HTTP headers on the requests are all intact. But even if they aren’t, shouldn’t the following configuration guarantee that the event handlers shown above return HTTPS URLs?
>>
>> public void contributeMetaDataLocator(MappedConfiguration<String, String> configuration) {
>> configuration.add(MetaDataConstants.SECURE_PAGE, "true");
>> }
>>
>> I saw an earlier post that suggested doing the following, but it had the same result:
>>
>> public static void contributeApplicationDefaults(MappedConfiguration<String, String> configuration) {
>> configuration.add(MetaDataConstants.SECURE_PAGE, "true");
>> }
>>
>> Regards,
>>
>> Geoff
>>
>