straight forward! Thanks for posting your solution.

Inge Solvoll schrieb:
Excellent! Thanks for thep help, everyone!! This has made my life so much
easier...

Got it working like this:

In my implementation of RequestSecurityManager:

  public boolean checkForInsecureRequest(String pageName) throws IOException
{
    return false;
  }

  public String getBaseURL(Page page) {
    return baseURLSource.getBaseURL(request.isSecure());
  }


In my Appmodule:

  public static void contributeAlias(Configuration<AliasContribution>
configuration, @InjectService("Request") Request request,
@InjectService("BaseURLSource") BaseURLSource baseURLSource) {
    RequestSecurityManager manager = new MyRequestSecurityManager(request,
baseURLSource);
    configuration.add(AliasContribution.create(RequestSecurityManager.class,
manager));
  }


On Wed, Nov 26, 2008 at 12:42 PM, Michael Gerzabek <[EMAIL PROTECTED]
wrote:

Inge Solvoll schrieb:

Thanks, I'll look into that then.

What I want to do:

1. The user accesses http://myserver.com/mypage. Should get the same
url/protocol in return.
2. The user accesses https://myserver.com/mypage. Should get the same
url/protocol in return.


Ok,

so then forget BaseURLSource and implement RequestSecurityManager. The code
could be something like

  public boolean checkForInsecureRequest( String pageName )
      throws IOException {

      ... copy-n-paste from T5 implementation ...
  }

  public String getBaseURL( Page page ) {

      return baseURLSource.getBaseURL( request.isSecure() );
  }

and get Request injected in your constructor.

/Michael

 As of now, the user gets a fixed protocol in return, not the protocol he
requested.



On Wed, Nov 26, 2008 at 12:29 PM, Michael Gerzabek <
[EMAIL PROTECTED]


wrote:



Inge,

not sure that I undestand fully what you are about. It sounds like you
also
want to implement RequestSecurityManager (

http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/internal/services/package-tree.html
).
This is at least what I did and it works for me.

/Michael

Inge Solvoll schrieb:

 I think I know the reason for the loop...


my getBaseURL method is only called when the requested url has a
different
protocol than specified in MetaDataConstants.SECURE_PAGE. It seems that
when
I try to write a base URL in my custom method that has a different
protocol
than SECURE_PAGE value, they start knocking each other's heades with
redirects.

Right now, it looks like this system works differently than I thought.
Is
it
not possible to override the behaviour of one page or entire application
fixed on a protocol?



On Wed, Nov 26, 2008 at 11:44 AM, Kristian Marinkovic <
[EMAIL PROTECTED]> wrote:





try creating the proxy manually... almost worked every time for me

constructor injection will be performed as expected

public static void contributeAlias(
 ObjectLocator locator,
  Configuration<AliasContribution> configuration ) {

 configuration.add( AliasContribution.create(
        BaseURLSource.class,
         locator.proxy(BaseURLSource.class,SomeImplementation.class) );

 }

g,
kris




"Inge Solvoll" <[EMAIL PROTECTED]>
26.11.2008 11:37
Bitte antworten an
"Tapestry users" <users@tapestry.apache.org>


An
"Tapestry users" <users@tapestry.apache.org>
Kopie

Thema
Re: [T5] Pick up https/http from request






Thanks!

But this still gives me the same loop error, because I have to inject
Request (where you inject SiteServices) into the builder method to
access
the secure state of the request:

Caused by: org.apache.tapestry5.ioc.internal.OperationException:
Construction of service 'Alias' has failed due to recursion: the
service
depends on itself in some way. Please check
org.apache.tapestry5.services.TapestryModule.buildAlias(Logger, String,
AliasManager, Collection) (at TapestryModule.java:214) for references
to
another service that is itself dependent on service 'Alias'.

Inge

On Wed, Nov 26, 2008 at 11:28 AM, Michael Gerzabek
<[EMAIL PROTECTED]




wrote:
    Inge,

I did it successfully for a similar purpose:

 @SuppressWarnings("unchecked")
 public static void contributeAlias(
    @InjectService( "SiteBaseURLSource" )
    BaseURLSource baseUrlSource,
    Configuration<AliasContribution> configuration ) {

    configuration.add( AliasContribution.create(
        BaseURLSource.class,
        baseUrlSource ) );

 }

Don't use the binder but create your own build method:

 @Marker( SiteServices.class )
 public static BaseURLSource buildSiteBaseURLSource(
    @SiteServices
    SiteService site ) {

    return new SiteBaseURLSource( site );
 }

You can ommit the Marker annotation.

/Michael

Solvoll schrieb:

 Hi!




I'm really struggling here as I think I'm approaching a solution.
What




I'm


trying to do is to override/decorate/alias/replace the BaseURLSource


with


my


own implementation, like this:

public class MyBaseURLSource implements BaseURLSource {

 private final Request request;

 public MyBaseURLSource(Request request) {
 this.request = request;
 }

 public String getBaseURL(boolean secure) {
 boolean secureRequest = request.isSecure();
 String baseURL = String.format("%s://%s", secureRequest ? "https" :
"http", request.getServerName());
 return baseURL;
 }

}


Essentially, I've copied the default implementation and replaced the




usage


of the secure parameter with the secure value of the request. My


problem


is


that I'm not capable of putting this code to actual work in the




framework.


I've tried:


- aliasing, but that didn't work because of circular dependency (I
have




to


inject the Request)


- binder.bind(BaseURLSource.class, MyBaseURLSource.class), combinded




with


a


builder for MyBaseURLSource. Causes redirect loop.
- Decorating. Not managed to find out how I do this yet, have tried a




few


things.


I'm guessing this is rather simple, it's just a bit complicated when
you're
not experienced in IoC... Anyone who wants to point me in the right
direction?

Regards
Inge



On Wed, Nov 19, 2008 at 10:22 AM, Inge Solvoll <
[EMAIL PROTECTED]




wrote:





I voted for this issue now.

https://issues.apache.org/jira/browse/TAP5-167

This is really a big issue for our usage of T5, T5 is now forcing us




to


redirect users away from http access, because we no longer can support


both
modes as long as T5 is fixed on either http or https.

Anyone who's got a working version of a BaseURLSource contribution,




that


actually can output a URL using the protocol from the initial request?


Regards
Inge


On Mon, Nov 17, 2008 at 8:57 AM, Inge Solvoll <
[EMAIL PROTECTED]




wrote:





I know, this isn't really a problem for regular pages, they load




using


the


requested protocol, when not marked as secure. But when I create
eventlinks
that updates zones, these don't work when they are generated with




http


and


the rest of the page is generated in https...
What I would like to do is to try some more on the BaseURLSource
approach.
Anyone who's got any idea why this has no effect here? I copied and
pasted
the code from the T5 docs and put in my Appmodule, and the
contribute
method
is called on server startup. I replaced the "localhost" url with an
obviously bad url, for testing, but nothing happens, all pages just




load


as


always, including eventlinks and actionlinks.
Inge


On Sun, Nov 16, 2008 at 9:44 PM, Carl Crowder <
[EMAIL PROTECTED]




wrote:





I don't know if you're aware, but if you create a href something




like


href="//something.com/page"


then the current protocol is maintained. So if you were viewing the
page
at https://something.com the HREF would resolve to
https://something.com/page and similarly with http. Unfortunately
it
requires using absolute URLs all the time.

I'm not sure if that helps, but perhaps it could be used in fixing




that


issue.


Carl
Inge Solvoll wrote:






Yes, I might. This is a major blow for us, our customers choose




freely


whether they want to use http or https, so the T5 way of doing


things


just




doesn't work for us...

On Fri, Nov 14, 2008 at 9:28 PM, Jonathan Barker <
[EMAIL PROTECTED]> wrote:







You might want to vote for this:

https://issues.apache.org/jira/browse/TAP5-167








-----Original Message-----
From: Inge Solvoll [mailto:[EMAIL PROTECTED]
Sent: Friday, November 14, 2008 15:10
To: Tapestry users
Subject: Re: [T5] Pick up https/http from request

Thanks!

I tried copying your code into my AppModule with some small






modifications.






But the code only runs on server startup, not when I access a






tapestry 5




page. I tried to add deliberate errors in the code, like naming
the




server






loooocalhost, but I never saw the results when accessing pages.

Also, when I try to add "final HttpServletRequest request" as a






parameter




to




the contributeAlias method, my T5.0.13 crashes complaining about




service




recursion.




What I need is for T5 to figure out that a user accesses a page


with


either


http or https, and respond on the same protocol...
Regards
Inge

On Fri, Nov 14, 2008 at 4:43 PM, Keith Bottner




<[EMAIL PROTECTED]>


wrote:




I believe you might be able to use an alternation of a solution
I




used




for


getting https to work properly between my development and
production
servers.

public static void




contributeAlias(Configuration<AliasContribution>


configuration,


 @Inject @Value("${"+SymbolConstants.PRODUCTION_MODE+"}" ) final




String




production


 {


            if (0 != production.compareToIgnoreCase("true"))
            {
          BaseURLSource source = new BaseURLSource()
          {
              public String getBaseURL(boolean secure)
              {
                  String protocol = secure ? "https" : "http";

                  int port = secure ? 8443 : 8080;

                  return String.format("%s://localhost:%d",






protocol,




port);




              }
          };



 configuration.add(AliasContribution.create(BaseURLSource.class,






source));






            }
 }

Somehow make this dependent on the user selection and return
it
accordingly.

Not a quick solution but possible a direction to try!

Keith


On Nov 14, 2008, at 7:18 AM, Inge Solvoll wrote:

 Hi!






My web application is large and consists of Struts, T4 and T5






pages.




In


Struts and T4, I use the current http request to figure out




whether


to


use


https or not. Users can choose if they want to log in using


https


or


not.


The chosen protocol is used on all pages after login.


In T5, this is either a global static setting, or a static




setting


per


page.


Is there a service or something I can override to implement my


own


"protocol


builder"? Something like this:
public class HttpProtocolBuilder {
 public HttpProtocolBuilder (final HttpServletRequest
request)




{


 this.request = request


 }
 public String getProtocol() {
 if (request.isSecure()) {
 return "https";
 }
 else {
 return "http";
 }
}

Regards

Inge







---------------------------------------------------------------------




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]






---------------------------------------------------------------------




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]







---------------------------------------------------------------------
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]





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

Reply via email to