Dashboard, gadgets i18n: Almost all titles display __MSG_gadget.*.title__

truedrcb February 15, 2016

JIRA v7.1.0#71003 (updated. see below)

When adding new gadget to system dashboard, almost all gadget titles look like following: __MSG_gadget.*.title__

See also screenshot:

2016-02-15_16-30-38.png

 

Additionally text for menu items and options dialog is missing when editing activity stream gadget:

2016-02-15_16-40-09.png

 

2016-02-15_16-41-33.png

 

Currently I have updated my JIRA installation to latest version:

Atlassian JIRA Project Management Software (v7.1.1#71004-sha1:d6b2c0d) 

Additionally I have bought and activated the license.

 

Unfortunately, I still have the same problems as described above sad

I believe, that the problem is caused by my configuration (local changes): I have configured secure connection over HTTPS, using the provided JIRA configuration script. This are the only changes I have done to standard installation.

By the way, I use PostgreSQL for JIRA persistence. This may also be reason if i18n problems.

 

UPDATE:

I have removed "Activity Stream" gadget from system dashboard and added it again. Now it has got worse. The title of gadget is now permanently "__MSG_gadget.activity.stream.title__"

5 answers

1 accepted

2 votes
Answer accepted
truedrcb April 9, 2016

The problem was caused by incomplete SSL configuration.

I have configured my JIRA to work over HTTPS. However the certificate is privately generated and must be properly registered in JRE.

Unregistered certificate was causing multiple exceptions in server log. For example:

2016-04-09 20:58:45,465 http-bio-8443-exec-7 ERROR artem 1258x379x1 1iv3jjt 37.49.102.77 /secure/MyJiraHome.jspa [c.a.g.r.internal.http.HttpClientFetcher] Unable to retrieve response
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
	at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
	at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
	at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
	at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1497)
	at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:212)
	at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
	at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
	at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:543)
	at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:409)
	at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177)
	at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304)
	at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611)
	at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446)
	at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:882)
	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)
	at com.atlassian.gadgets.renderer.internal.http.HttpClientFetcher.fetch(HttpClientFetcher.java:97)
	at org.apache.shindig.gadgets.DefaultMessageBundleFactory.fetchBundle(DefaultMessageBundleFactory.java:138)
	at org.apache.shindig.gadgets.DefaultMessageBundleFactory.getNestedBundle(DefaultMessageBundleFactory.java:111)
	at org.apache.shindig.gadgets.DefaultMessageBundleFactory.getBundle(DefaultMessageBundleFactory.java:79)
	at org.apache.shindig.gadgets.DefaultMessageBundleFactory.getParentBundle(DefaultMessageBundleFactory.java:124)
	at org.apache.shindig.gadgets.DefaultMessageBundleFactory.getNestedBundle(DefaultMessageBundleFactory.java:101)
	at org.apache.shindig.gadgets.DefaultMessageBundleFactory.getBundle(DefaultMessageBundleFactory.java:79)
	at org.apache.shindig.gadgets.DefaultMessageBundleFactory.getParentBundle(DefaultMessageBundleFactory.java:127)
	at org.apache.shindig.gadgets.DefaultMessageBundleFactory.getNestedBundle(DefaultMessageBundleFactory.java:101)
	at org.apache.shindig.gadgets.DefaultMessageBundleFactory.getBundle(DefaultMessageBundleFactory.java:79)
	at org.apache.shindig.gadgets.variables.VariableSubstituter.substitute(VariableSubstituter.java:47)
	at com.atlassian.gadgets.renderer.internal.GadgetSpecFactoryImpl.getGadgetSpec(GadgetSpecFactoryImpl.java:127)
	at com.atlassian.gadgets.renderer.internal.GadgetSpecFactoryImpl.getGadgetSpec(GadgetSpecFactoryImpl.java:79)
	... 3 filtered
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
	at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:56)
	at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:60)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:70)
	at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:53)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.eclipse.gemini.blueprint.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:57)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
	at com.sun.proxy.$Proxy1778.getGadgetSpec(Unknown Source)
	at com.atlassian.gadgets.dashboard.internal.impl.GadgetFactoryImpl.createSpecificationBasedGadget(GadgetFactoryImpl.java:118)
	at com.atlassian.gadgets.dashboard.internal.impl.GadgetFactoryImpl.access$000(GadgetFactoryImpl.java:40)
	at com.atlassian.gadgets.dashboard.internal.impl.GadgetFactoryImpl$1.visit(GadgetFactoryImpl.java:72)
	at com.atlassian.gadgets.dashboard.internal.impl.GadgetFactoryImpl$1.visit(GadgetFactoryImpl.java:69)
	at com.atlassian.gadgets.GadgetState.accept(GadgetState.java:132)
	at com.atlassian.gadgets.dashboard.internal.impl.GadgetFactoryImpl.createDashboardItem(GadgetFactoryImpl.java:69)
	at com.atlassian.gadgets.dashboard.internal.impl.StateConverterImpl.convertStateToGadget(StateConverterImpl.java:28)
	at com.atlassian.gadgets.dashboard.internal.impl.DashboardImpl$DashboardItemStateConverter.apply(DashboardImpl.java:196)
	at com.atlassian.gadgets.dashboard.internal.impl.DashboardImpl$DashboardItemStateConverter.apply(DashboardImpl.java:194)
	at com.google.common.collect.Iterators$8.transform(Iterators.java:799)
	at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)
	at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)
	at com.google.common.collect.Iterators$7.computeNext(Iterators.java:651)
	at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
	at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
	at com.google.common.collect.Iterators$7.computeNext(Iterators.java:650)
	at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
	at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
	at com.google.common.collect.TransformedIterator.hasNext(TransformedIterator.java:43)
	at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547)
	at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:272)
	at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:226)
	at com.atlassian.gadgets.dashboard.internal.rest.representations.RepresentationFactoryImpl.createDashboardRepresentation(RepresentationFactoryImpl.java:48)
	at com.atlassian.gadgets.dashboard.internal.velocity.DashboardEmbedder.dashboardToJsonObject(DashboardEmbedder.java:47)
	at com.atlassian.gadgets.dashboard.internal.velocity.DashboardView.getLayoutsJson(DashboardView.java:164)
	at com.atlassian.gadgets.dashboard.internal.velocity.DashboardView.writeTo(DashboardView.java:77)
	at com.atlassian.jira.web.action.Dashboard$1.render(Dashboard.java:231)
	at com.atlassian.jira.web.tags.RenderTag.doStartTag(RenderTag.java:37)
	at jsp.secure.views.dashboard_jsp._jspx_meth_ww_005frender_005f0(dashboard_jsp.java:118)
	at jsp.secure.views.dashboard_jsp._jspService(dashboard_jsp.java:73)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
	... 29 filtered
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
	... 18 filtered
	at com.atlassian.web.servlet.plugin.LocationCleanerFilter.doFilter(LocationCleanerFilter.java:37)
	... 82 filtered
	at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:70)
	... 32 filtered
	at com.atlassian.web.servlet.plugin.ThreadLocalServletForwarder.forward(ThreadLocalServletForwarder.java:45)
	at com.atlassian.jira.web.action.MyJiraHome.forward(MyJiraHome.java:108)
	at com.atlassian.jira.web.action.MyJiraHome.doExecute(MyJiraHome.java:37)
	... 1 filtered
	at com.atlassian.jira.action.JiraActionSupport.execute(JiraActionSupport.java:63)
	... 7 filtered
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
	... 50 filtered
	at com.atlassian.greenhopper.jira.filters.ClassicBoardRouter.doFilter(ClassicBoardRouter.java:59)
	... 70 filtered
	at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:70)
	... 89 filtered
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
	at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
	at sun.security.validator.Validator.validate(Validator.java:260)
	at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
	at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
	at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1479)
	... 475 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:145)
	at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131)
	at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
	at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
	... 481 more

The solution:

  • Add SSL certificate (jira.jks) to JRE trusted store (cacerts) using keytool
  • Add appropriate JRE options to enable trusted store and key store for JRE (same as in server.xml connector configuration)

See details here:

0 votes
Dawn Fama June 14, 2019

We had the same issue and what resolved the problem was to add a java option to the JIRA service java parameters to point to your cacerts file (JIRA truststore)

If you are using windows the registry key for the service is located here:

HKLM\software\Wow6432Node\Apache Software Foundation\Procrun 2.0\JiraSoftwarexxxxxx\Parameters\java\Options

We added java parameter option

-Djavax.net.ssl.trustStore=E:\JIRA_Data\certs\cacerts <<< location of your truststore is probably also set in your server.xml file

 

Hope this helps

0 votes
ITService June 14, 2019

Greetings from Portugal

We had this problem and followed every guide or community advise out there, for setting Base URL, loading certificate to cacerts, load tomcat with the right java cacert and keystore initizalization parameters, and changing server.xml for alternate configurations. Nothing worked when using HTTPS. In the end the only solution was to disable HTTPS entirely on the on premise server, and provide the public HTTPS access inside the firewall as a proxy server, by offloading the domain certificate for that request to and from the HTTP connection on the JIRA server. 

0 votes
beecom AG February 20, 2017

Hi all,

We have solved it!

 

Some of our customers have also been affected by this problem, because they are running their JIRA instances behind a proxy server with authentication. Unfortunately, none of the workarounds provided by Atlassian can be applied to solve this problem for our customers.

We have now developed a solution for this. With this, JIRA will directly connect to localhost (or any other configurable URL) without SSL, to retrieve the titles for the gadgets.


If you are interested in this solution package, please contact us at
https://jira.beecom.ch/servicedesk/customer/portal/3/create/23

 

We are Atlassian Partners for more than 10 years who have a deep technical understanding of JIRA and other Atlassian products. One of our most successful products is Suite Utilities for JIRA, that you are probably using already.

Dawn Fama July 27, 2018

We have this issue in both our dev environments after upgrading from 6.4.14 to JIRA software.  We would love to have your solution but when you select the link above, it prompts for a logon but no option to create an account. 

https://jira.beecom.ch/servicedesk/customer/portal/3/create/23

Stefan Forstmoser _beecom_ July 30, 2018

Hi @Dawn Fama,

after all, people had not really been interested in our solution due to 2 reasons:

  • It is a patch of a library used by Jira.
  • It is not free. it was quite expensive for the customer for who we solved it. This customer expects us to charge at least a small fee, that would go back to him.

 

Due to the lack of interest for these reason we no longer provide this solution to the public.

So, if none of the workarounds described by Atlassian is a solution for you, you have to implement a completely different setup for your proxy server.

We hope, that Atlassian will fix this issue properly one day. However we are not very optimistic about that.

0 votes
BjoernKruse February 23, 2016

Hello Artem,

wie have maybe the same issue, see here https://answers.atlassian.com/questions/24649645

Let's share solution/infos/etc.?

Best Regards,
Björn 

Suggest an answer

Log in or Sign up to answer