Uploaded image for project: 'Jira Data Center'
  1. Jira Data Center
  2. JRASERVER-43997

IssueMail can't include system avatar images, they are not present

    XMLWordPrintable

Details

    Description

      NOTE: This bug report is for JIRA Server. Using JIRA Cloud? See the corresponding bug report.

      Summary

      System avatar icons used for custom issue types causes the following symptoms when a notification is sent:

      • Users will see broken image in email.
      • Administrator will see error in logs.
        System Avatar not found at the following resource path: /avatars/medium_genericissue.png
        

        See below for full stack-trace.

      Steps to Reproduce

      1. Enable email notification
      2. Create custom issue type 'tst', use any of system avatars.
      3. Create issue with custom issue type 'tst'
      4. Wait for notification to be sent
      5. Check logs and notification email

      Expected Results

      No errors in logs when email is sent. User receives email without broken image.

      Actual Results

      The below exception is thrown in the atlassian-jira.log file for every notification sent:

      2015-06-24 19:03:53,107 Sending mailitem com.atlassian.jira.mail.IssueMailQueueItem@1962e1e5[issue=com.atlassian.jira.issue.IssueImpl@569a4e86[id=10300,summary=test zip,key=PRG-3,created=2015-06-24 13:59:
      13.015,updated=2015-06-24 18:24:37.939,assignee=test:1,reporter=admin:1],remoteUser=admin:1,notificationType=Current_Assignee,eventTypeId=6,templateId=6] ERROR admin 1143x924x1 1so34qn 127.0.0.1 /secure/a
      dmin/MailQueueAdmin.jspa [atlassian.jira.avatar.AvatarManagerImpl] System Avatar not found at the following resource path: /avatars/medium_genericissue.png
      2015-06-24 19:03:53,108 Sending mailitem com.atlassian.jira.mail.IssueMailQueueItem@1962e1e5[issue=com.atlassian.jira.issue.IssueImpl@569a4e86[id=10300,summary=test zip,key=PRG-3,created=2015-06-24 13:59:
      13.015,updated=2015-06-24 18:24:37.939,assignee=test:1,reporter=admin:1],remoteUser=admin:1,notificationType=Current_Assignee,eventTypeId=6,templateId=6] WARN admin 1143x924x1 1so34qn 127.0.0.1 /secure/ad
      min/MailQueueAdmin.jspa [jira.mail.util.MailAttachmentsManagerImpl] Cannot add avatar as Mail attachment for 'issue type: tst'
      java.io.IOException: File not found
              at com.atlassian.jira.avatar.AvatarManagerImpl.processAvatarData(AvatarManagerImpl.java:379)
              at com.atlassian.jira.avatar.AvatarManagerImpl.readAvatarData(AvatarManagerImpl.java:492)
              at com.atlassian.jira.mail.util.MailAttachmentsManagerImpl$AvatarAttachment.buildBodyPart(MailAttachmentsManagerImpl.java:370)
              at com.atlassian.jira.mail.util.MailAttachmentsManagerImpl$1.apply(MailAttachmentsManagerImpl.java:205)
              at com.atlassian.jira.mail.util.MailAttachmentsManagerImpl$1.apply(MailAttachmentsManagerImpl.java:201)
              at com.google.common.collect.Iterators$8.next(Iterators.java:812)
              at com.google.common.collect.Iterators$7.computeNext(Iterators.java:648)
              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$5.hasNext(Iterators.java:543)
              at com.atlassian.jira.mail.builder.EmailRenderer.buildMailWithAttachments(EmailRenderer.java:151)
              at com.atlassian.jira.mail.builder.EmailRenderer.renderEmailBody(EmailRenderer.java:123)
              at com.atlassian.jira.mail.builder.EmailRenderer.render(EmailRenderer.java:166)
              at com.atlassian.jira.mail.builder.EmailBuilder.renderNow(EmailBuilder.java:162)
              at com.atlassian.jira.mail.builder.EmailBuilder.renderNowAsQueueItem(EmailBuilder.java:152)
              at com.atlassian.jira.mail.MailingListCompiler$1.processRecipient(MailingListCompiler.java:307)
              at com.atlassian.jira.mail.NotificationRecipientProcessor.process(NotificationRecipientProcessor.java:39)
              at com.atlassian.jira.mail.MailingListCompiler.addMailsToQueue(MailingListCompiler.java:332)
              at com.atlassian.jira.mail.MailingListCompiler.access$200(MailingListCompiler.java:47)
              at com.atlassian.jira.mail.MailingListCompiler$NotificationCompiler.addEmailsToQueue(MailingListCompiler.java:455)
              at com.atlassian.jira.mail.MailingListCompiler$NotificationCompiler.sendLists(MailingListCompiler.java:425)
              at com.atlassian.jira.mail.MailingListCompiler$NotificationCompiler.sendForEvent(MailingListCompiler.java:378)
              at com.atlassian.jira.mail.MailingListCompiler.sendLists(MailingListCompiler.java:140)
              at com.atlassian.jira.mail.IssueMailQueueItem.send(IssueMailQueueItem.java:150)
              at com.atlassian.mail.queue.MailQueueImpl.sendBuffer(MailQueueImpl.java:66)
              at com.atlassian.jira.mail.JiraMailQueue$1.apply(JiraMailQueue.java:57)
              at com.atlassian.jira.mail.JiraMailQueue$1.apply(JiraMailQueue.java:53)
              at com.atlassian.jira.util.velocity.DefaultVelocityRequestContextFactory.runWithStaticBaseUrl(DefaultVelocityRequestContextFactory.java:127)
              at com.atlassian.jira.util.DefaultBaseUrl.runWithStaticBaseUrl(DefaultBaseUrl.java:58)
              at com.atlassian.jira.mail.JiraMailQueue.sendBuffer(JiraMailQueue.java:52)
              at com.atlassian.jira.web.action.admin.MailQueueAdmin.doExecute(MailQueueAdmin.java:51)  <+1> (ActionSupport.java:165)
              at com.atlassian.jira.action.JiraActionSupport.execute(JiraActionSupport.java:88)  <+7> (DefaultInterceptorChain.java:39) (NestedInterceptorChain.java:31) (ChainedInterceptor.java:16) (DefaultInte
      rceptorChain.java:35) (GenericDispatcher.java:225) (GenericDispatcher.java:154) (JiraWebworkActionDispatcher.java:152)
              at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)  <+2> (ApplicationFilterChain.java:303) (ApplicationFilterChain.java:208)
              at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)  <+14> (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (ChainedFilterStepRunner.java:87) (ApplicationF
      ilterChain.java:241) (ApplicationFilterChain.java:208) (XContentTypeOptionsNoSniffFilter.java:22) (AbstractHttpFilter.java:31) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (HeaderSa
      nitisingFilter.java:44) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (IteratingFilterChain.java:46) (DelegatingPluginFilter.java:70)
              at com.atlassian.jira.onboarding.postsetup.ui.PostSetupAnnouncementsFilter.doFilter(PostSetupAnnouncementsFilter.java:61)  <+3> (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (Del
      egatingPluginFilter.java:70)
              at com.atlassian.jira.tzdetect.IncludeResourcesFilter.doFilter(IncludeResourcesFilter.java:40)  <+3> (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (DelegatingPluginFilter.java:70)
              at com.atlassian.jira.baseurl.IncludeResourcesFilter.doFilter(IncludeResourcesFilter.java:38)  <+8> (AbstractHttpFilter.java:31) (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (DelegatingPluginFilter.java:70) (ContextFilter.java:25) (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (DelegatingPluginFilter.java:70)
              at com.atlassian.mywork.client.filter.ServingRequestsFilter.doFilter(ServingRequestsFilter.java:37)  <+3> (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (DelegatingPluginFilter.java:70)
              at com.atlassian.prettyurls.filter.PrettyUrlsSiteMeshFixupFilter.doFilter(PrettyUrlsSiteMeshFixupFilter.java:36)  <+3> (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (DelegatingPluginFilter.java:70)
              at com.atlassian.prettyurls.filter.PrettyUrlsDispatcherFilter.doFilter(PrettyUrlsDispatcherFilter.java:60)  <+3> (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (DelegatingPluginFilter.java:70)
              at com.atlassian.prettyurls.filter.PrettyUrlsSiteMeshFilter.doFilter(PrettyUrlsSiteMeshFilter.java:92)  <+3> (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (DelegatingPluginFilter.java:70)
              at com.atlassian.prettyurls.filter.PrettyUrlsMatcherFilter.doFilter(PrettyUrlsMatcherFilter.java:56)  <+3> (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (DelegatingPluginFilter.java:70)
              at com.atlassian.labs.botkiller.BotKillerFilter.doFilter(BotKillerFilter.java:36)  <+26> (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (ServletFilterModuleContainerFilter.java:77) (ServletFilterModuleContainerFilter.java:63) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (AccessLogFilter.java:107) (AccessLogFilter.java:91) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (XsrfTokenAdditionRequestFilter.java:54) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (SiteMeshFilter.java:181) (SiteMeshFilter.java:85) (SitemeshPageFilter.java:124) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (PageBuilderFilter.java:90) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (CommittedResponseHtmlErrorRecoveryFilter.java:63) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (IteratingFilterChain.java:46) (DelegatingPluginFilter.java:70)
              at com.atlassian.prettyurls.filter.PrettyUrlsCombinedMatchDispatcherFilter.doFilter(PrettyUrlsCombinedMatchDispatcherFilter.java:61)  <+22> (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (ServletFilterModuleContainerFilter.java:77) (ServletFilterModuleContainerFilter.java:63) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (SecurityFilter.java:239) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (TrustedApplicationsFilter.java:100) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (BaseLoginFilter.java:172) (JiraLoginFilter.java:70) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (IteratingFilterChain.java:46) (DelegatingPluginFilter.java:70) (OAuthFilter.java:79) (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (DelegatingPluginFilter.java:70)
              at com.atlassian.prettyurls.filter.PrettyUrlsCombinedMatchDispatcherFilter.doFilter(PrettyUrlsCombinedMatchDispatcherFilter.java:61)  <+13> (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (ServletFilterModuleContainerFilter.java:77) (ServletFilterModuleContainerFilter.java:63) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (ProfilingFilter.java:99) (JIRAProfilingFilter.java:19) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (AbstractJohnsonFilter.java:71) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208)
              at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
              at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
              at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)  <+5> (UrlRewriteFilter.java:394) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (IteratingFilterChain.java:46) (DelegatingPluginFilter.java:70)
              at com.atlassian.analytics.client.filter.JiraAnalyticsFilter.doFilter(JiraAnalyticsFilter.java:40)
              at com.atlassian.analytics.client.filter.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32)  <+3> (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (DelegatingPluginFilter.java:70)
              at com.atlassian.prettyurls.filter.PrettyUrlsCombinedMatchDispatcherFilter.doFilter(PrettyUrlsCombinedMatchDispatcherFilter.java:61)  <+45> (DelegatingPluginFilter.java:78) (IteratingFilterChain.java:42) (ServletFilterModuleContainerFilter.java:77) (ServletFilterModuleContainerFilter.java:63) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (ChainedFilterStepRunner.java:87) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (AbstractCachingFilter.java:33) (AbstractHttpFilter.java:31) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (AbstractEncodingFilter.java:41) (AbstractHttpFilter.java:31) (PathMatchingEncodingFilter.java:49) (AbstractHttpFilter.java:31) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (JiraStartupChecklistFilter.java:79) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (MultipartBoundaryCheckFilter.java:41) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (ChainedFilterStepRunner.java:87) (JiraFirstFilter.java:61) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (GzipFilter.java:115) (GzipFilter.java:92) (JiraGzipFilter.java:56) (ApplicationFilterChain.java:241) (ApplicationFilterChain.java:208) (StandardWrapperValve.java:220) (StandardContextValve.java:122) (AuthenticatorBase.java:501) (StandardHostValve.java:171) (ErrorReportValve.java:103) (StandardEngineValve.java:116) (AccessLogValve.java:950) (CoyoteAdapter.java:408) (AbstractHttp11Processor.java:1070) (AbstractProtocol.java:611) (JIoEndpoint.java:316)
              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)
      

      Notes

      these system avatars have only one size: xsmall

      ls -1 atlassian-jira-6.4.6-standalone/atlassian-jira/WEB-INF/classes/avatars/ | awk -F '_' '{if (length($3) > 0 ){print $2"_"$3} else {print $2} }' | sort | uniq -c | grep 1
      
         3 Avatar-1.png
         3 Avatar-10.png
         3 Avatar-11.png
         3 Avatar-12.png
         3 Avatar-13.png
         3 Avatar-14.png
         3 Avatar-15.png
         3 Avatar-16.png
         3 Avatar-17.png
         3 Avatar-18.png
         3 Avatar-19.png
         3 Avatar-21.png
         1 all_unassigned.png
         1 black.png
         1 blank.png
         1 brown.png
         1 bug.png
         1 confluence.png
         1 defect.png
         1 delete.png
         1 documentation.png
         1 epic.png
         1 exclamation.png
         1 genericissue.png
         1 health.png
         1 improvement.png
         1 newfeature.png
         1 orange.png
         1 red.png
         1 remove_feature.png
         1 requirement.png
         1 sales.png
         1 story.png
         1 subtask.png
         1 subtask_alternate.png
         1 task.png
         1 task_agile.png
         1 undefined.png
         1 white.png
         1 yellow.png
      

      Workaround #1

      Upload your own avatar and assign it to custom issue type. You can also re-upload same avatar from standard issue type if you want to have the same icon.

      Workaround #2

      According to this comment, issue can be resolved by copying the xsmall files to medium ones. Thanks agslab!

      If you are on Linux, you can simply run the below script we've put together on the <JIRA_INSTALL>/atlassian-jira/WEB-INF/classes/avatars directory (make sure you have read/write permission on the folder).
      rename.sh

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              ayakovlev@atlassian.com Andriy Yakovlev [Atlassian]
              Votes:
              8 Vote for this issue
              Watchers:
              38 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: