> wow.  I asked about this just a few days ago.  But I don't quite
> understand the last mile.  Once Tapestry is patched, what do I have to
> do in my webapp to turn this on for my credit card entry page..
 > We have to override all Engine Services?

Yes. First override all engine services in hivemind. Here's an example:

        <contribution
configuration-id="tapestry.services.ApplicationServices">
       <service name="action" object="service:Action" />
       <service name="direct" object="service:Direct" />
       <service name="page" object="service:Page" />
    </contribution>
        
        <service-point id="SecurePageDetector"
interface="com.jkassis.percolate.tapestry.service.SecurePageDetector">
        <invoke-factory >
                <construct
class="com.jkassis.percolate.tapestry.service.SecurePageDetector">
                        <set-object property="pageSpecificationResolver"
value="service:tapestry.page.PageSpecificationResolver"/>
                </construct>
        </invoke-factory>
        </service-point>
  
  
        <service-point id="Direct"
interface="org.apache.tapestry.engine.IEngineService">
        <invoke-factory>
                <construct
class="com.jkassis.percolate.tapestry.service.DirectService">
                        <set-object property="responseRenderer"
value="infrastructure:responseRenderer"/>
                        <set-object property="request"
value="infrastructure:request"/>
                        <set-object property="linkFactory"
value="service:tapestry.url.LinkFactory"/>       
                        <set-object property="securePageDetector"
value="service:SecurePageDetector"/>
                </construct>
        </invoke-factory>
        </service-point>


You will notice that I'm injecting my DirectService with a helper service,
the SecurePageDetector. That's what loads the page specification and looks
for the isSecure property.

Source for all this is attached.

 
> 
> ps - I am currently looking into using urlrewrite to do the http/https
> redirect management, but keeping the isSecure metadata tied with the
> page, and have the urls be correctly generated is a polished option.

Thanks. I agree. Lets hope the tapestry team agrees and integrates the
patch!



> 
> Jeremy wrote:
> > I'm submitting a patch to enable HTTP / HTTPS protocol switching that
> > comes on the heels of a couple of days of research. Hope you dig it!
> > Here's the background on why and what I did:
> >
> >
> >
> >    1. First, I tried to get the container do it. Unfortunately, Tomcat
> >       is good about getting you into HTTPS using a
> >       <security-constraint>, but not out. There's no way to specify that
> >       a resource / page **must** be accessed with HTTP.
> >    2. So, I setup redirects in Tapestry. I added a property to my
> >       BasePage (BasePage.secure) that indicates whether or not the page
> >       should be accessed with HTTPS. Then in the BasePage.pageValidate
> >       method, I throw a redirect to switch the protocol from http >
> >       https OR https > http as necessary. This works, but if a listener
> >       method in PAGE-A (set for http access) uses the RequestCycle to
> >       activate PAGE-B (set for http access), then the pageValidate
> >       method of PAGE-B throws a redirect to switch back to HTTP, the
> >       browser makes a request for PAGE-A again using http, and the app's
> >       caught in an infinite redirect loop.
> >    3. So, I setup the BasePage.pageValidate to just allow access when
> >       https is used. But now the app has the same problem it had when I
> >       had redirects working in tomcat: it can't get back to http.
> >    4. So, I created a new ILinkRenderer that grabs the page name from
> >       its underlying ILink, uses a PageSpecificationResolver to grab the
> >       page specification, check for the declaration of BasePage.secure,
> >       and call getAbsoluteUrl of the underlying ILink as necessary to
> >       output an HTTP or HTTPS link. It works pretty well. But it doesn't
> >       work for Forms, only for AbstractLinkComponent and its
> >       descendents. And it's hard to grab the page name from the ILink at
> >       this point in rendering -  after the LinkFactoryImpl applies
> >       ServiceEncoders that mess everything up.
> >    5. At this point I decided to stop hacking around the issue and patch
> >       the source. I gave EngineServiceLink two new parameters: _scheme
> >       and _port. When a client calls EngineServiceLink.getUrl(),
> >       EngineServiceLink checks its _scheme and _port properties. If
> >       _scheme is not specified or the same as the scheme used to make
> >       the current request, getUrl() does exactly what it did before: it
> >       returns a relative url. If _scheme is specified and not equal to
> >       the scheme used to make the current request, getUrl() returns an
> >       absolute URL with the specified scheme and port through its
> >       getAbsoluteUrl method. Then I set up my engine services to check
> >       for the BasePage.secure property (what the custom ILinkRenderer
> >       did before) and override the default scheme and port for the link.
> >    6. Of course, I updated all the references to
> >       LinkFactoryImpl.constructUrl in the default engine services and
> tests.
> >
> >
> >
> > Here's the patch:
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to