Monday, 6 September 2010

Weird problem with Shared Folders in VMware Workstation - SORTED!

Hmmm, for the first time ever, I wasn't able to mount a VMware Shared Folder, using VMware Workstation 7.1.1 build-282343, running on Ubuntu 10.04.

My guest OS is a 64-bit instance of Red Hat Enterprise Linux 5.5, freshly updated using YUM.

Initially, I didn't have the VMware Tools package installed, so extracted it ( VMwareTools-8.4.3-282343.tar.gz ) from the ISO that's included with Workstation, and installed and configured it in the normal manner.

Following a reboot, I was able to choose a directory from my host OS to map as a Shared Folder, but the folder itself never appeared under /mnt/hgfs - in fact, nothing appeared under /mnt.

Digging around on the web, I found a few references to SELinux causing problems with Shared Folders, but I'm not using SELinux, having opted to disable it at installation time. I checked this by examining the file /etc/selinux/config which reads: -

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted

# SETLOCALDEFS= Check local definition changes
SETLOCALDEFS=0

I tried restarting VMware Tools, using the command: -

/etc/init.d/vmware-tools restart

but to no avail.

Finally, I ran the following command: -

/usr/sbin/vmware-tools-upgrader

which shouldn't have been necessary given that this was a fresh installation of VMware Tools but .... it worked.

After doing this final step, my Shared Folders burst into life under the /mnt/hgfs directory.

Weird but true ....

Sunday, 5 September 2010

VMware Workstation - Times are a-changing

Following on from an LTPA-related issue that I saw yesterday, I realised why I might be having problems with the clocks in my VMs getting out of sync.

I regularly suspend my laptop with the VMs still running - the combination of VMware Workstation 7 and Ubuntu 10.04 (host) makes this very workable, and suspend/resume is a very very quick process. In fact, this combination is as efficient as running VMware Fusion on the Mac, which also handles suspend/resume of host and guest seamlessly.

Having checked this morning, and seen that the timestamps on log files in one of my VMs was 21:20 even though it's 06:39, I realised that the guest OS still thought it was yesterday :-)

Thanks to yesterday's efforts, I know that VMware Tools is up-to-date, so I thought I'd explore further.

Digging in a bit, I found this command: -

vmware-toolbox-cmd timesync enable

which, according the VMware Tools Configuration Utility User's Guide ( VMware Fusion 3.0, VMware ACE 2.6, VMware Workstation 7.0, VMware Player 3.0) [PDF]: -

After you complete this procedure, the VMware Tools service enables or disables periodic time synchronization, as you specified.

Good enough for me. My clocks are now in sync - will see how this works after my next suspend/resume e.g. what the interval is.

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>

Success - Using Web Application Integrator to integrate Lotus Quickr for WebSphere Portal 8.5 into a portal page

Following on from yesterday's post, I've worked out how to use the Web Application Integrator (WA) portlet / functionality to integrate Lotus Quickr 8.5 into a portal page.

In the past, this has been relatively simply, using the previous 8.1.1 version of Quickr, as I've blogged about here and here.

Now perhaps the precise use case for this needs to be defined, as there are multiple ways to integrate Portal and Quickr, including WebSphere Portlet Factory Designer ( consuming Quickr via RESTful services ), the Places Catalog Portlet, the My Places Portlet etc.

However, in this case, let's accept that we need to bring the Places page ( the one that contains Public Places and My Places ) into a portal page.

I'm pretty comfortable with the basics of WAI, but was struggling to know precisely which JSP I needed to "hack" in order to inject the JavaScript that the WAI portlet generates.

After much hacking about, I've worked it out - I'm probably a bit dense, but I had assumed that all of Quickr's user experience was coming from a single Java Enterprise Edition application ( wps.ear ).

How the world has changed - now we live in a world where Quickr ( or, to be more precise, the underlying WebSphere Portal ) renders content from a variety of different enterprise/web applications, not all of which are running within the WPS.EAR application.

Therefore, after much digging, I found out that the "offending" application is Place Center App User Interface ( or placeCntrAppUI, to give it it's correct name ).

This application is located here: -

/opt/IBM/Quickr/wp_profile/installedApps/quickr85/placeCntrApp.ear/placeCntrAppUI.war

with the UI coming from: -

/opt/IBM/Quickr/wp_profile/installedApps/quickr85/placeCntrApp.ear/placeCntrAppUI.war/WEB-INF/jsp

Having discovered this, it was then a relatively simple manner to amend the file catalog.jsp and comment out the statement that "includes" the banner JSP ( banner.jspf ) as follows: -

<!--
                        <%@ include file="banner.jspf" %>
--!>

and added in the WAI JavaScript code: -

<!-- BEGIN PORTAL NAVIGATION INTEGRATION -->
<script type="text/javascript" src="http://wps615.uk.ibm.com:10040/wps/myportal/!ut/p/c5/XcjBCoIwGADgZ_HQ-f8Xae44IWUMxZiVeZElostwY1tFb1_n-G4fdPCzqpeeVNBmVQ-o3uONWcvXME5OBeM2-D_QQpf02OwFFwXBojxlyFlGkqKOETGGC7S46-Udjf-ktNSSimZYvFzwidfUC2krMlByzo8HVrvtHLMI7GyiL2_foN0!/"></script>
<!-- END PORTAL NAVIGATION INTEGRATION -->

immediately below, so that the JSP now looks as follows: -

<snip>
               <script type="text/javascript" src="<c:out value='${path}/javascript/js.jsp?debugMode=${initParams.debugMode}&locale=${pageContext.request.locale}&layer=placeCenter'/>"></script>
                <div class="lotusFrame" id="mainContentDiv">

<!--
                        <%@ include file="banner.jspf" %>
--!>

<!-- BEGIN PORTAL NAVIGATION INTEGRATION -->
<script type="text/javascript" src="http://wps615.uk.ibm.com:10040/wps/myportal/!ut/p/c5/XcjBCoIwGADgZ_HQ-f8Xae44IWUMxZiVeZElostwY1tFb1_n-G4fdPCzqpeeVNBmVQ-o3uONWcvXME5OBeM2-D_QQpf02OwFFwXBojxlyFlGkqKOETGGC7S46-Udjf-ktNSSimZYvFzwidfUC2krMlByzo8HVrvtHLMI7GyiL2_foN0!/"></script>
<!-- END PORTAL NAVIGATION INTEGRATION -->

                        <div class="lotusTitleBar">
                                <div class="lotusRightCorner">
                                        <div class="lotusInner">
                                                <div dojoType="ibm.lotus.theme.NavigationBar"
</snip>

Having done this, I'm now able to access the Places page through WebSphere Portal, with the portal navigation etc. preserved throughout.

I then added to my sense of success by doing the same thing with the Place Catalog Administration page, which is located here: -

/opt/IBM/Quickr/wp_profile/installedApps/quickr85/placeCntrApp.ear/placeCntrAdminUI.war/WEB-INF/jsp

Again, I edited a JSP ( admin.jsp ) and commented out the include statement for navigation.jsp : -

<!--
                        <%@ include file="navigation.jspf" %>
--!>

and added in the WAI JS: -

<!-- BEGIN PORTAL NAVIGATION INTEGRATION -->
<script type="text/javascript" src="http://wps615.uk.ibm.com:10040/wps/myportal/!ut/p/c5/XcjBCoIwGADgZ_HQ-f8Xae44IWUMxZiVeZElostwY1tFb1_n-G4fdPCzqpeeVNBmVQ-o3uONWcvXME5OBeM2-D_QQpf02OwFFwXBojxlyFlGkqKOETGGC7S46-Udjf-ktNSSimZYvFzwidfUC2krMlByzo8HVrvtHLMI7GyiL2_foN0!/"></script>
<!-- END PORTAL NAVIGATION INTEGRATION -->

so the resulting JSP looks like this: -

<snip>
                                helpTopic="/com.ibm.lotus.qpp.places.help/admin/pc_managing_sources.html">
                        </div>

<!--
                        <%@ include file="navigation.jspf" %>
--!>

<!-- BEGIN PORTAL NAVIGATION INTEGRATION -->
<script type="text/javascript" src="http://wps615.uk.ibm.com:10040/wps/myportal/!ut/p/c5/XcjBCoIwGADgZ_HQ-f8Xae44IWUMxZiVeZElostwY1tFb1_n-G4fdPCzqpeeVNBmVQ-o3uONWcvXME5OBeM2-D_QQpf02OwFFwXBojxlyFlGkqKOETGGC7S46-Udjf-ktNSSimZYvFzwidfUC2krMlByzo8HVrvtHLMI7GyiL2_foN0!/"></script>
<!-- END PORTAL NAVIGATION INTEGRATION -->

                        <div class="lotusMain">
                                <div class="lotusContent">
</snip>

and then did the same with the the page that's used to create new places - templates.jsp - which is located here: -

/opt/IBM/Quickr/wp_profile/installedApps/quickr85/placeCntrApp.ear/placeCntrAppUI.war/WEB-INF/jsp

so that it looks like this: -

<snip>
               <script type="text/javascript" src="<c:out value='${path}/javascript/js.jsp?debugMode=${initParams.debugMode}&locale=${pageContext.request.locale}&layer=templateCenter'/>"></script>
                <div class="lotusFrame">

<!--
                        <%@ include file="banner.jspf" %>
--!>

<!-- BEGIN PORTAL NAVIGATION INTEGRATION -->
<script type="text/javascript" src="http://wps615.uk.ibm.com:10040/wps/myportal/!ut/p/c5/XcjBCoIwGADgZ_HQ-f8Xae44IWUMxZiVeZElostwY1tFb1_n-G4fdPCzqpeeVNBmVQ-o3uONWcvXME5OBeM2-D_QQpf02OwFFwXBojxlyFlGkqKOETGGC7S46-Udjf-ktNSSimZYvFzwidfUC2krMlByzo8HVrvtHLMI7GyiL2_foN0!/"></script>
<!-- END PORTAL NAVIGATION INTEGRATION -->

                        <div class="lotusTitleBar">
                                <div class="lotusRightCorner">
                                        <div class="lotusInner">
</snip>

Right, time for a cup of tea to celebrate ...

Friday, 3 September 2010

IBM Lotus Quickr for WebSphere Portal 8.5 - Various Notes on Administration

So, I've been looking at, and playing, with the latest version, 8.5, of IBM Lotus Quickr for WebSphere Portal, trying to ascertain how I can bring Quickr into another WebSphere Portal environment, using the Web Application Integrator portlet.

Now, I've done this before with earlier versions of Quickr, as blogged here and here, but 8.5 is currently foxing me ( and others ).

Digging into Quickr, it reminds me of one of those Russian Matryoshka dolls, with each layer containing another layer, perhaps going down to infinity.

So, I've learnt a few things today - in the first instance, there are a number of layers of administration, from the normal Quickr Places-based administration, right down to the pure WebSphere Portal 6.1.5 administration UI, that's buried beneath the surface.

Having hooked my Quickr server up to LDAP ( IBM Tivoli Directory Server 6.2 ), it's taken me a while to work out which ID to use where - in the end, having configured the underlying portal to use an LDAP user ( similar to wpsadmin of old ), via the ConfigEngine tasks: -

./ConfigEngine.sh wp-change-was-admin-user
./ConfigEngine.sh wp-change-portal-admin-user

I realised that I still needed to do a manual "hack" in order to get my LDAP user to access the crown jewels of the admin UI. This required me to log into the WAS Integrated Solutions Console, using the LDAP user, and locate the Enterprise Application, QuickrNextAdmin.

I stopped the application, and then used the Security role to user/group mapping and, having searched for and found my LDAP admin user, add it to the Administrator role. Once I started the application again, I was able to log into the Places Administration UI, and then click the Advanced Administration link to get to the meat of the situation - at this point, I'm back in good old WebSphere Portal land, which is my comfort zone.

So here's the URLs, for the record: -

Normal URLs

https://quickr85.uk.ibm.com:10035/places/

https://quickr85.uk.ibm.com:10035/places/publicplaces

https://quickr85.uk.ibm.com:10035/places/myplaces

Admin URLs

Places Administration

http://quickr85.uk.ibm.com:10040/QuickrAdmin/

Place Catalog Administration

http://quickr85.uk.ibm.com:10040/places/admin/app

Advanced Administration

https://quickr85.uk.ibm.com:10035/lotus/mypoc/!ut/p/digest!b0dWmDx3zxfGEAehkKu0fw/?uri=nm:oid:ibm.qp.Advanced%2520Administration

WebSphere Integrated Solutions Console

https://quickr85.uk.ibm.com:10041/ibm/console/logon.jsp

Now, back to Web Application Integrator ....

Thursday, 2 September 2010

Getting the Lotus Connections Portlet to work with WebSEAL

Whilst Googling around, I discovered this rather useful posting from one of the gurus of Lotus Connections, Luis Benitez, and thought I'd share it far and wide ....

Last week, I spent a day at a customer up in New Jersey. They are currently deploying a pilot of Lotus Connections 2.5. One of the most important things for them is to be able to mash up Lotus Connections with their existing intranet applications via their portal (powered by WebSphere Portal, of course).

To simplify sign on for all their employees, they use WebSEAL and SPNEGO to provide single sign on for all web applications. This way, an employee logs on to their workstation in the morning, and they are never prompted to log on again to other web applications.


http://www.lbenitez.com/2010/05/getting-lotus-connections-portlet-to.html

Thanks for sharing, Luis, much obliged.


Wednesday, 1 September 2010

WebSphere Portal and Lotus Web Content Management v7

Following my earlier post, I've not yet downloaded WebSphere Portal v7, given that I'm on a low-bandwidth ADSL connection, but am pleased to report that the documentation is now available: -

WebSphere Portal and Lotus Web Content Management - Product documentation

http://www.ibm.com/developerworks/websphere/zones/portal/proddoc.html

with the system requirements here: -

WebSphere Portal V7.0 detailed system requirements

http://www-01.ibm.com/support/docview.wss?uid=swg27007791

Am looking forward to a MASSIVE download session whilst I'm at an IBM location next week, with WP7, WebSphere Portlet Factory 7 and the beta of Lotus Connections RNext ...........

Note to self - Firefox and local connections

 Whilst trying to hit my NAS from Firefox on my Mac, I kept seeing errors such as:- Unable to connect Firefox can’t establish a connection t...