Saturday, 4 September 2010

Lotus Connections Profiles - Not Playing Nicely with WebSphere Portal

Whilst working on my WebSphere Portal <-> Lotus Connections integration challenge, I hit upon this exception: -

[9/3/10 12:43:54:087 BST] 000000a5 ServletWrappe E   SRVE0068E: Uncaught exception thrown in one of the service methods of the servlet: /genjsp/lcaccelerator/portlets/profiles/ProfilesPortlet_myNetworkMain.jsp. Exception thrown : java.io.IOException: Server returned HTTP response code: 400 for URL: https://lc25.uk.ibm.com:9446/profiles/atom/profileService.do

in the SystemOut.log file on the portal server.

When I tried the URL: -

https://lc25.uk.ibm.com:9446/profiles/atom/profileService.do

in a browser window, I received the response: -

CLFRN1172E: The request is invalid

( full details below ).

>From a previous investigation, I know that Connections has a mechanism for retrieving an XML document ( known as a Service Document ) from Profiles using the Atom API via an HTTP request, as documented here: -

http://publib.boulder.ibm.com/infocenter/ltscnnct/v2r0/topic/com.ibm.connections.25.help/r_api_prof_get_service_doc.html

I tested the two mechanisms with which I'm most familiar: -

https://lc25.uk.ibm.com:9446/profiles/atom/profileService.do?email=padmin@uk.ibm.com

and: -

https://lc25.uk.ibm.com:9446/profiles/atom/profileService.do?userid=24dcc5c0-23b2-102f-8265-e965b3598651

This suggests that the portlet isn't sending a valid userid with the HTTP/Atom request.

Given that I'm also seeing: -

[9/4/10 14:42:22:133 BST] 00000071 LTPAServerObj W   SECJ0371W: Validation of the LTPA token failed because the token expired with the following info: Token expiration Date: Fri Sep 03 14:43:45 BST 2010, current Date: Sat Sep 04 14:42:22 BST 2010.

in the SystemOut.log file on the Profiles WAS instance, I'm wondering whether there's an LTPA-related SSO issue between Portal and Connections.

I'm going to regenerate the LTPA token on Portal, import it into Connections, and try again.

Will report back ...









Full details of exception: -

-<error>
<code>
400
</code>

<message>
CLFRN1172E: The request is invalid.
</message>

<trace>
com.ibm.lconn.profiles.api.actions.APIException
at com.ibm.lconn.profiles.api.actions.APIAction.assertNotNull(APIAction.java:161)
at com.ibm.lconn.profiles.api.actions.APIAction.assertNotNull(APIAction.java:154)
at com.ibm.lconn.profiles.api.actions.ProfilesServiceAction.getBean(ProfilesServiceAction.java:181)
at com.ibm.lconn.profiles.api.actions.ProfilesServiceAction.getLastModified(ProfilesServiceAction.java:162)
at com.ibm.lconn.profiles.web.actions.BaseAction.execute(BaseAction.java:150)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1146)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1087)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:145)
at com.ibm.peoplepages.web.rpfilter.RPFilter.doFilter(RPFilter.java:154)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.core.web.util.lang.LanguageFilter.doFilter(LanguageFilter.java:105)
at com.ibm.lconn.core.web.util.lang.LanguageFilter.doFilter(LanguageFilter.java:73)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.profiles.web.servlet.DisableSSLCachingFilter.doFilter(DisableSSLCachingFilter.java:62)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.core.web.auth.LCRestSecurityFilter.doFilter(LCRestSecurityFilter.java:157)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.profiles.web.servlet.AppContextFilter.doFilter(AppContextFilter.java:286)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.core.web.auth.LCBasicAuthFilter.doFilter(LCBasicAuthFilter.java:79)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.core.web.auth.LCUserDataConstraintFilter.doFilter(LCUserDataConstraintFilter.java:84)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.core.web.request.HttpRequestFilter.doFilter(HttpRequestFilter.java:77)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.core.web.util.lang.I18NFilter.doFilter(I18NFilter.java:203)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.core.web.util.Utf8CharsetFilter.doFilter(Utf8CharsetFilter.java:45)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:87)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:837)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:680)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:588)
at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:525)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:90)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:751)
at com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1478)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:126)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:458)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:387)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:267)
at com.ibm.ws.ssl.channel.impl.SSLConnectionLink.determineNextChannel(SSLConnectionLink.java:1037)
at com.ibm.ws.ssl.channel.impl.SSLConnectionLink.readyInboundPostHandshake(SSLConnectionLink.java:725)
at com.ibm.ws.ssl.channel.impl.SSLConnectionLink$MyHandshakeCompletedCallback.complete(SSLConnectionLink.java:412)
at com.ibm.ws.ssl.channel.impl.SSLUtils.handleHandshake(SSLUtils.java:869)
at com.ibm.ws.ssl.channel.impl.SSLHandshakeIOCallback.complete(SSLHandshakeIOCallback.java:70)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:136)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:196)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:751)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:881)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1497)
</trace>
</error>

1 comment:

Dave Hay said...

Well, I cracked it - it was LTPA-token related, but not in the way I had previously thought.

The clocks on the two VMware images hosting Portal and Connections respectively were 2 hours adrift of each other.

This was because I'd updated VMware but had not updated VMware Tools, meaning that the automatic time sync with the host O/S wasn't working.

Once I updated VMware tools on both VMs, the clocks plopped back into sync, and ( after a reboot to be safe ), Portal <-> Connections is now working happily

Note to self - use kubectl to query images in a pod or deployment

In both cases, we use JSON ... For a deployment, we can do this: - kubectl get deployment foobar --namespace snafu --output jsonpath="{...