Hi Deepal and Amila,
thank you guys for your answers. I concede that my use case might sound
strange and out of the standard path.
Anyway I implemented the following handler witch seems to work fine so far.
I post it here for the records and to ask confirmation from you that the
property MessageContext.REMOTE_ADDR is the right property to check.
Thanks again for your help,
Alexis
public class NoSecurityForLocalhostHandler extends AbstractHandler {
private static final Log log =
LogFactory.getLog(NoSecurityForLocalhostHandler.class);
List ips = new ArrayList();
public NoSecurityForLocalhostHandler() throws SocketException {
Enumeration<NetworkInterface> e1 =
NetworkInterface.getNetworkInterfaces();
while (e1.hasMoreElements()) {
NetworkInterface ni = e1.nextElement();
Enumeration<InetAddress> e2 = ni.getInetAddresses();
while (e2.hasMoreElements()) {
InetAddress ia = e2.nextElement();
ips.add(ia.getHostAddress());
}
}
}
public InvocationResponse invoke(MessageContext msgContext) throws
AxisFault {
log.debug("Check if Security phase should be skipped");
String remoteAddr = (String)
msgContext.getProperty(MessageContext.REMOTE_ADDR);
if (remoteAddr == null) {
log.debug("No REMOTE_ADDR in message context");
} else {
log.debug("REMOTE_ADDR is " + remoteAddr);
if (ips.contains(remoteAddr)) {
log.debug("Remote address matches a local address. The
Security phase will be removed (if any)");
for (int i = 0; i < msgContext.getExecutionChain().size();
i++) {
Phase phase = (Phase)
msgContext.getExecutionChain().get(i);
if ("Security".equalsIgnoreCase(phase.getName())) {
msgContext.getExecutionChain().remove(phase);
log.debug("Security phase actually removed");
break;
}
}
} else {
log.debug("Remote address is not local");
}
}
return InvocationResponse.CONTINUE;
}
}
On Tue, Aug 25, 2009 at 9:45 PM, Amila Suriarachchi <
[email protected]> wrote:
>
>
> On Tue, Aug 25, 2009 at 11:24 PM, Alexis Midon <[email protected]> wrote:
>
>> Hey there,
>>
>> I'm trying to dynamically skip a phase. Let me explain.
>> Let's say I have defined the following phases as InFlow: Transport,
>> Security, Dispatch, OperationInPhase. I want to skip the Security phase in
>> some cases, in other words I want the phase order to become [Transport,
>> Dispatch, OperationInPhase].
>>
>> I've tried to insert my decision test (skip Security or not?) into the
>> method Phase#checkPreconditions of a new Phase subclass, but it wouldn't
>> work. Actually if an AxisFault is thrown in Phase#checkPreconditions, all
>> the following phases are skipped. Cf. AxisEngine#invoke.
>>
>> My next idea was to override Phase#invoke, insert my test and eventually
>> delegate to the super method implementation. Unfortunately, Phase#invoke is
>> marked as final. :(
>>
>> Then I tried to decorate a Phase in an handler implementation, but this is
>> a dead end as well because a Phase instance is required by
>> AxisConfigBuilder#getPhase.
>>
>> At this point, I ran out of ideas. That's why my asking for your help
>> guys. I hope you will have a solution for my use case.
>
>
> What is the problem of the security phase? I think you try to solve the
> problem in wrong way.
> Although security phase invoked for all the messages, it does not do any
> thing if your service has not engaged security.
>
> One trick would be to add a new handler to Transport Phase and increase the
> currentHanderIndex value of the message context.
>
> thanks,
> Amila.
>
>>
>>
>> Thanks in advance.
>>
>> Alexis
>>
>>
>
>
> --
> Amila Suriarachchi
> WSO2 Inc.
> blog: http://amilachinthaka.blogspot.com/
>