Closed Bug 1737532 Opened 3 years ago Closed 4 months ago

TB WebExtension API dont fill messagePart element named body which is described in API docs

Categories

(Thunderbird :: Add-Ons: Extensions API, defect)

Thunderbird 91
defect

Tracking

(Not tracked)

RESOLVED FIXED
128 Branch

People

(Reporter: indrek, Assigned: TbSync)

References

Details

Attachments

(3 files, 1 obsolete file)

User Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 OPR/80.0.4170.63

Steps to reproduce:

  1. in add-ons load() function get tab (messenger.tabs.query) and active message (messenger.messageDisplay.getDisplayedMessage)
  2. get full data of message
    messenger.messages.getFull(message.id)
  3. cycle through parts array
    for(let onepart of full.parts)
  4. show each part on console
    console.log(onepart)

Actual results:

in console I can see parts structure (contentType, headers, partName, parts, size) and if part is on deepest level sometimes there are element body, sometimes its missing.
Up to now it seems that body is missing in case of contentType = "text/calendar".
And always there are error message in log before my code (popup.js in attachment picture) in code CalTmezonService.jsm saying "Couldn't find FLE" (FLE is timezone abbrevation both GoPro and MSOutlook are using generating calendar events).

In some cases (if "name" ise present (set by sender)) I can use messenger.messages.listAttachments to get body, but extreme cases I hade to use messenger.messages.getRaw and split by bondaries to get calendar event body.

Expected results:

This structure should consist element "body", which must be there according to
https://webextension-api.thunderbird.net/en/91/messages.html#messages-messagepart
Sidenote: In documentation could be more accurate to say that body exists for innermost parts.

I expect the body would consist plain text vcalendar format (sometimes it is base64 encoded, sometimes plain text), but body element is missing.

Without seeing the raw message, I assume that would be an attachment, which is not considered to be a readable message body. Can you check if listAttachments is giving you that?

https://webextension-api.thunderbird.net/en/91/messages.html#listattachments-messageid

I just tried this on an invite received from Google Calendar.

listAttachments does list the ics file, and you can use getAttachmentFile to get the body for it.

getFull does not give the body of content-type text/calendar which is in the multipart/alternative section - afaict there's no way to access that. You do get the bodies for the text/plain and text/html parts which are also in the multipart/alternative section.

Am I understanding it correct, that text/calender attachments are not accessible through listAttachments, which they should? If this is the case, could you attach such eml file here?

(In reply to John Bieling (:TbSync) from comment #3)

Am I understanding it correct, that text/calender attachments are not accessible through listAttachments, which they should? If this is the case, could you attach such eml file here?

I don't think text/calendar is an attachment. It is an alternative body part so it should be available through getFull. I don't have a simple eml that I can attach at the moment.

MIME part with content-type text/calendar can be both:
if part name (proposed filename for download) existing (look picture above, case 1) -- it is listed as attachment (listAttachment will get it),
if name not existing (case 2) -- when it is not accible via listAttachment.
But in any case, it is regular MIME part, so body element must be fullfilled. May-be some internal logic in TB hides them from user interface, but API should give it to developer hands.

Almost all attachments are MIME parts, but we deliberately do not include them in getFull, instead getAttachment is to be used (which is a lot easier than cycling through the parts). I think only text/plain and text/html are considered as "body". Maybe that should be opened up to text/*, I will check.

These parts are actually included in getFull.

consider such case

Content-Type: multipart/alternative; boundary="000_fb3f49c674ca45889bcb6f449e08aaddterviseametee"

--000_fb3f49c674ca45889bcb6f449e08aaddterviseametee
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

...

--000_fb3f49c674ca45889bcb6f449e08aaddterviseametee
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

...

--000_fb3f49c674ca45889bcb6f449e08aaddterviseametee
Content-Type: text/calendar; charset="utf-8"; method=REQUEST
Content-Transfer-Encoding: base64

...

--000_fb3f49c674ca45889bcb6f449e08aaddterviseametee--


messenger.messages.getFull() gives nicely all three parts, but 3rd dont have body element fullfiled/populated.
text/calendar type is text-only information, so technically were shouldnt be problem to populate it

text/* sounds reasonable.

What TB does with text/html which is base64 encoded? Does it offers base64 text or "original" text?
If TB decodes then it is needed to prevent non-texts to go into message structure. Correct way. Kitten photos may do harm.

But is it possible to do such workaround: if part don't have "name", add some temporary name which gives possibility to get it as attachment and "download" it?
Just now messenger.messages.getAttachmentFile( message.id, neededPartName);
gives error if this part with needed "partName" doesn't have "name" (so called fileName).
(neededPartName is extracted using getFull and recursion through parts array).

Can anyone provide an example email and attach it to this bug report, so I can reproduce and work on this?

Can anyone provide an example email and attach it to this bug report, so I can reproduce and work on this? Thanks!

Flags: needinfo?(standard8)
Flags: needinfo?(indrek)

Found one invitation which was pictured ealier. Cleaned from delicate data.
Hope it helps.

Flags: needinfo?(indrek)

This is getting complicated. The provided eml file has two calendar "attachments". One is properly defined (part 1.2) and one which has no content-disposition and no name (part 1.1.1.3). The first one is correctly not included as body and is accessible via listAttachments(). Nothing wrong here.

The second one is missing its body in getFull(). If I enable that to be included, it returns the lower content you see in the message displayed in Thunderbird:

<!DOCTYPE html>
<html
	xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta charset="utf-8" />
		<link rel="stylesheet" href="chrome://messagebody/skin/imip.css" />
		<link rel="stylesheet" href="chrome://messagebody/skin/calendar-attendees.css" />
	</head>
	<body>
		<details id="imipHTMLDetails" class="invitation-details">
			<summary id="imipHtml-header"> has invited you to </summary>
			<div class="invitation-border">
				<table class="invitation-table">
					<tbody>
						<tr id="imipHtml-summary-row" hidden="">
							<th id="imipHtml-summary-descr" class="description" scope="row"></th>
							<td id="imipHtml-summary-content" class="content"></td>
						</tr>
						<tr id="imipHtml-location-row" hidden="">
							<th id="imipHtml-location-descr" class="description" scope="row"></th>
							<td id="imipHtml-location-content" class="content"></td>
						</tr>
						<tr id="imipHtml-when-row">
							<th id="imipHtml-when-descr" class="description" scope="row">When:</th>
							<td id="imipHtml-when-content" class="content">Tuesday, October 26, 2021 9:00 AM – 10:00 AM</td>
						</tr>
						<tr id="imipHtml-canceledOccurrences-row" hidden="">
							<th id="imipHtml-canceledOccurrences-descr" class="description" scope="row"></th>
							<td id="imipHtml-canceledOccurrences-content" class="content"></td>
						</tr>
						<tr id="imipHtml-modifiedOccurrences-row" hidden="">
							<th id="imipHtml-modifiedOccurrences-descr" class="description" scope="row"></th>
							<td id="imipHtml-modifiedOccurrences-content" class="content"></td>
						</tr>
						<tr id="imipHtml-organizer-row" hidden="">
							<th id="imipHtml-organizer-descr" class="description" scope="row"></th>
							<td id="imipHtml-organizer-cell" class="content"></td>
						</tr>
						<tr id="imipHtml-description-row" hidden="">
							<th id="imipHtml-description-descr" class="description" scope="row"></th>
							<td id="imipHtml-description-content" class="content"></td>
						</tr>
						<tr id="imipHtml-attachments-row" hidden="">
							<th id="imipHtml-attachments-descr" class="description" scope="row"></th>
							<td id="imipHtml-attachments-content" class="content"></td>
						</tr>
						<tr id="imipHtml-comment-row" hidden="hidden">
							<th id="imipHtml-comment-descr" class="description" scope="row"></th>
							<td id="imipHtml-comment-content" class="content"></td>
						</tr>
						<tr id="imipHtml-attendees-row" hidden="">
							<th id="imipHtml-attendees-descr" class="description" scope="row"></th>
							<td id="imipHtml-attendees-cell" class="content"></td>
						</tr>
						<tr id="imipHtml-url-row" hidden="">
							<th id="imipHtml-url-descr" class="description" scope="row"></th>
							<td id="imipHtml-url-content" class="content"></td>
						</tr>
					</tbody>
				</table>
			</div>
		</details>
	</body>
</html>

If I am not mistaken, that is not the html of part 1.1.1.2, but something generated from the VEVENT. This happens deep inside core code.

I am afraid I have not enough expertise regarding the mime parser, to change the current behaviour.

Maybe we could add an exclusion for text/calendar and always return it as attachment, which is currently skipped here (I think):
https://searchfox.org/comm-central/source/mailnews/mime/src/mimemoz2.cpp#661

Would that be an acceptable fix?

jcranmer might be a good person to ask. I think it might be risky to change that - it depends on how it is seen from an attachment perspective.

Flags: needinfo?(standard8)

I contacted jcranmer via matrix, adding a NI here.

Flags: needinfo?(Pidgeot18)
Depends on: 1876008

When this was originally created, I copied some guessing code from Thunderbird.
I no longer want to use it and instead honor the contentDisposition header. With
the old code in place, a mime part of type 'text/calendar' which is NOT marked as
an attachment, is still returned as an attachment.

Depends on D199337

Assignee: nobody → john
Status: UNCONFIRMED → ASSIGNED
Ever confirmed: true
Flags: needinfo?(Pidgeot18)
Attachment #9376081 - Attachment is obsolete: true

This is fixed by Bug 1878620. I will leave this open, until it is confirmed fixed in Daily.

Depends on: 1878620
No longer depends on: 1876008
Depends on: 1854684
No longer depends on: 1878620
Depends on: 187862
No longer depends on: 1854684
Depends on: 1878620
No longer depends on: 187862
Depends on: 1854684
No longer depends on: 1878620

This is confirmed fixed by Bug 1878620. The output of getFull() on the provided example message:

{
  "contentType": "message/rfc822",
  "partName": "",
  "size": 6855,
  "decryptionStatus": "none",
  "headers": {
    "x-account-key": [
      "account1"
    ],
    "x-uidl": [
      "4d243e8500031ab9"
    ],
    "x-mozilla-status": [
      "0003"
    ],
    "x-mozilla-status2": [
      "00000000"
    ],
    "x-mozilla-keys": [
      "kutse"
    ],
    "x-notes-item": [
      "1; name=$publicaccess",
      "1; name=$SMTPKeepNotesItems",
      "1; name=WebDateTimeInit",
      "Meeting; name=$IconSwitcher",
      "Tue, 26 Oct 2021 10:00:00 +0300; type=400; name=$NoPurge",
      "en; name=$NameLanguageTags"
    ],
    "subject": [
      "Invitation: Noortekeskuste NFC süsteemi arenduse kohtumine Zoom (26 Oct 09:00 ZE2)"
    ],
    "x-mailer": [
      "IBM Notes Release 9.0.1 October 14, 2013"
    ],
    "date": [
      "Fri, 22 Oct 2021 14:15:20 +0300"
    ],
    "x-esetid": [
      "37303A29AFEFFD6E677167"
    ],
    "content-type": [
      "message/rfc822"
    ]
  },
  "parts": [
    {
      "contentType": "multipart/mixed",
      "headers": {
        "content-type": [
          "multipart/mixed; boundary=\\"=_mixed 36138BFC6A7B03EFC2258776003DB5C5_=\\""
        ]
      },
      "size": 6855,
      "partName": "1",
      "parts": [
        {
          "contentType": "multipart/related",
          "headers": {
            "content-type": [
              "multipart/related; boundary=\\"=_related 36138BFC6A7B03EFC2258776003DB5C5_=\\""
            ]
          },
          "size": 5634,
          "partName": "1.1",
          "parts": [
            {
              "contentType": "multipart/alternative",
              "headers": {
                "content-type": [
                  "multipart/alternative; boundary=\\"=_alternative 36138BFC6A7B03EFC2258776003DB5C5_=\\""
                ]
              },
              "size": 5563,
              "partName": "1.1.1",
              "parts": [
                {
                  "contentType": "text/plain",
                  "headers": {
                    "content-type": [
                      "text/plain; charset=windows-1257"
                    ],
                    "content-transfer-encoding": [
                      "quoted-printable"
                    ]
                  },
                  "size": 761,
                  "partName": "1.1.1.1",
                  "body": "\\r\\n                                                                                                                                             \\r\\n                                                                      \\r\\n               26.10.2021 -                                                                                                                  \\r\\n       \\r\\n                       has invited you to a meeting.  You have not yet      \\r\\n                       responded.                                           \\r\\n                                                                            \\r\\n   Join Zoom Meeting                                                        \\r\\n                                                                            \\r\\n\\r\\n"
                },
                {
                  "contentType": "text/html",
                  "headers": {
                    "content-type": [
                      "text/html; charset=windows-1257"
                    ],
                    "content-disposition": [
                      "inline"
                    ],
                    "content-transfer-encoding": [
                      "quoted-printable"
                    ]
                  },
                  "size": 3581,
                  "partName": "1.1.1.2",
                  "body": "<html><body>\\r\\n<p>\\r\\n<table width=\\"100%\\" border=\\"0\\" cellspacing=\\"0\\" cellpadding=\\"0\\">\\r\\n<tr valign=\\"top\\"><td width=\\"1%\\"><img width=\\"101\\" height=\\"1\\" src=\\"/icons/ecblank.gif\\" border=\\"0\\" alt=\\"\\"><br>\\r\\n\\r\\n<table width=\\"100%\\" border=\\"0\\" cellspacing=\\"0\\" cellpadding=\\"0\\">\\r\\n<tr valign=\\"top\\"><td width=\\"100%\\"><img src=\\"cid:1__=4DBB0DE5DFAE33558f9e8a93df938690918c4DB@\\" width=\\"65\\" height=\\"65\\"></td></tr>\\r\\n</table>\\r\\n</td><td width=\\"100%\\"><img width=\\"1\\" height=\\"1\\" src=\\"/icons/ecblank.gif\\" border=\\"0\\" alt=\\"\\"><br>\\r\\n<table id=\\"NoticeTable\\" width=\\"100%\\" border=\\"0\\" cellspacing=\\"0\\" cellpadding=\\"0\\">\\r\\n<tr valign=\\"top\\"><td width=\\"1%\\" valign=\\"middle\\"><img width=\\"639\\" height=\\"1\\" src=\\"/icons/ecblank.gif\\" border=\\"0\\" alt=\\"\\"><br>\\r\\n<font size=\\"2\\"><b>26.10.2021</b></font><font size=\\"2\\">&nbsp;- </font></td><td width=\\"1%\\" valign=\\"middle\\"><img width=\\"72\\" height=\\"1\\" src=\\"/icons/ecblank.gif\\" border=\\"0\\" alt=\\"\\"><br>\\r\\n</td><td width=\\"100%\\" valign=\\"middle\\"><img width=\\"1\\" height=\\"1\\" src=\\"/icons/ecblank.gif\\" border=\\"0\\" alt=\\"\\"><br>\\r\\n</td></tr>\\r\\n</table>\\r\\n<br>\\r\\n<font size=\\"1\\">No Location Information</font></td></tr>\\r\\n</table>\\r\\n\\r\\n<table width=\\"100%\\" border=\\"0\\" cellspacing=\\"0\\" cellpadding=\\"0\\">\\r\\n<tr valign=\\"top\\"><td width=\\"100%\\">\\r\\n<table width=\\"100%\\" border=\\"0\\" cellspacing=\\"0\\" cellpadding=\\"0\\">\\r\\n<tr valign=\\"top\\"><td width=\\"100%\\" bgcolor=\\"#EBECED\\" valign=\\"middle\\">\\r\\n<table width=\\"100%\\" border=\\"0\\" cellspacing=\\"0\\" cellpadding=\\"0\\">\\r\\n<tr valign=\\"top\\"><td width=\\"1%\\"><img width=\\"159\\" height=\\"1\\" src=\\"/icons/ecblank.gif\\" border=\\"0\\" alt=\\"\\"><br>\\r\\n</td><td width=\\"100%\\"><img width=\\"1\\" height=\\"1\\" src=\\"/icons/ecblank.gif\\" border=\\"0\\" alt=\\"\\"><br>\\r\\n\\r\\n<ul style=\\"padding-left: 3pt\\"><font size=\\"1\\">has invited you to a meeting. &nbsp;You have not yet responded.</font></ul>\\r\\n</td></tr>\\r\\n</table>\\r\\n\\r\\n<table id=\\"ShowComments\\" width=\\"100%\\" border=\\"0\\" cellspacing=\\"0\\" cellpadding=\\"0\\">\\r\\n<tr valign=\\"top\\"><td width=\\"100%\\">\\r\\n<table width=\\"100%\\" border=\\"0\\" cellspacing=\\"0\\" cellpadding=\\"0\\">\\r\\n<tr valign=\\"top\\"><td width=\\"0%\\"><img width=\\"1\\" height=\\"1\\" src=\\"/icons/ecblank.gif\\" border=\\"0\\" alt=\\"\\"></td><td width=\\"100%\\"><img width=\\"1\\" height=\\"1\\" src=\\"/icons/ecblank.gif\\" border=\\"0\\" alt=\\"\\"><br>\\r\\n</td></tr>\\r\\n</table>\\r\\n</td></tr>\\r\\n</table>\\r\\n</td></tr>\\r\\n</table>\\r\\n</td></tr>\\r\\n\\r\\n<tr valign=\\"top\\"><td width=\\"100%\\">\\r\\n<table width=\\"100%\\" border=\\"0\\" cellspacing=\\"0\\" cellpadding=\\"0\\">\\r\\n<tr valign=\\"top\\"><td width=\\"100%\\" bgcolor=\\"#FFFFFF\\">\\r\\n<table id=\\"AddrDisplay\\" width=\\"100%\\" border=\\"0\\" cellspacing=\\"0\\" cellpadding=\\"0\\">\\r\\n<tr valign=\\"top\\"><td id=\\"AddrDisplay1\\" width=\\"1%\\" valign=\\"middle\\"><img width=\\"101\\" height=\\"1\\" src=\\"/icons/ecblank.gif\\" border=\\"0\\" alt=\\"\\"><br>\\r\\n<font size=\\"1\\" color=\\"#616161\\">Required:</font></td><td width=\\"100%\\" valign=\\"middle\\"><img width=\\"1\\" height=\\"1\\" src=\\"/icons/ecblank.gif\\" border=\\"0\\" alt=\\"\\"><br>\\r\\n</td></tr>\\r\\n</table>\\r\\n</td></tr>\\r\\n</table>\\r\\n</td></tr>\\r\\n</table>\\r\\n\\r\\n<table id=\\"ShowDescription\\" width=\\"100%\\" border=\\"0\\" cellspacing=\\"0\\" cellpadding=\\"0\\">\\r\\n<tr valign=\\"top\\"><td width=\\"100%\\">\\r\\n<table id=\\"Description\\" width=\\"100%\\" border=\\"0\\" cellspacing=\\"0\\" cellpadding=\\"0\\"><tbody title=\\"Description\\">\\r\\n<tr class=\\"domino_tablabel\\"><th scope=\\"rowgroup\\" colspan=\\"1\\">Description</th></tr>\\r\\n\\r\\n<tr valign=\\"top\\"><td width=\\"100%\\" bgcolor=\\"#E7E9F0\\" valign=\\"middle\\">\\r\\n<table width=\\"100%\\" border=\\"0\\" cellspacing=\\"0\\" cellpadding=\\"0\\">\\r\\n<tr valign=\\"top\\"><td width=\\"100%\\" bgcolor=\\"#FFFFFF\\">\\r\\n<table width=\\"100%\\" border=\\"0\\" cellspacing=\\"0\\" cellpadding=\\"0\\">\\r\\n<tr valign=\\"top\\"><td width=\\"100%\\"><font size=\\"1\\">Join Zoom Meeting</font><br>\\r\\n</td></tr>\\r\\n</table>\\r\\n</td></tr>\\r\\n</table>\\r\\n</td></tr>\\r\\n</tbody></table>\\r\\n</td></tr>\\r\\n</table>\\r\\n</body></html>\\r\\n"
                },
                {
                  "contentType": "text/calendar",
                  "headers": {
                    "content-type": [
                      "text/calendar; method=\\"REQUEST\\"; charset=\\"UTF-8\\""
                    ]
                  },
                  "size": 1221,
                  "partName": "1.1.1.3",
                  "body": "BEGIN:VCALENDAR\\r\\nX-LOTUS-CHARSET:UTF-8\\r\\nVERSION:2.0\\r\\nPRODID:-//Lotus Development Corporation//NONSGML Notes 9.0.1//EN_C\\r\\nMETHOD:REQUEST\\r\\nBEGIN:VTIMEZONE\\r\\nTZID:FLE\\r\\nBEGIN:STANDARD\\r\\nDTSTART:19501029T020000\\r\\nTZOFFSETFROM:+0300\\r\\nTZOFFSETTO:+0200\\r\\nRRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=10\\r\\nEND:STANDARD\\r\\nBEGIN:DAYLIGHT\\r\\nDTSTART:19500326T020000\\r\\nTZOFFSETFROM:+0200\\r\\nTZOFFSETTO:+0300\\r\\nRRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=3\\r\\nEND:DAYLIGHT\\r\\nEND:VTIMEZONE\\r\\nBEGIN:VEVENT\\r\\nDTSTART;TZID=\\"FLE\\":20211026T090000\\r\\nDTEND;TZID=\\"FLE\\":20211026T100000\\r\\nTRANSP:OPAQUE\\r\\nDTSTAMP:20211022T111520Z\\r\\nSEQUENCE:0\\r\\nCLASS:PUBLIC\\r\\nUID:36138BFC6A7B03EFC2258776003DB5C5-Lotus_Notes_Generated\\r\\nX-LOTUS-BROADCAST:FALSE\\r\\nX-LOTUS-UPDATE-SEQ:1\\r\\nX-LOTUS-UPDATE-WISL:$S:1;$L:1;$B:1;$R:1;$E:1;$W:1;$O:1;$M:1;RequiredAttendees:1;INetRequiredNames:1;AltRequiredNames:1;StorageRequiredNames:1;OptionalAttendees:1;INetOptionalNames:1;AltOptionalNames:1;StorageOptionalNames:1;ApptUNIDURL:1;STUnyteConferenceURL:1;STUnyteConferenceID:1;SametimeType:1;WhiteBoardContent:1;STRoomName:1\\r\\nX-LOTUS-NOTESVERSION:2\\r\\nX-LOTUS-NOTICETYPE:I\\r\\nX-LOTUS-APPTTYPE:3\\r\\nX-LOTUS-CHILD-UID:36138BFC6A7B03EFC2258776003DB5C5\\r\\nEND:VEVENT\\r\\nEND:VCALENDAR\\r\\n"
                }
              ]
            },
            {
              "contentType": "text/html",
              "headers": {
                "content-type": [
                  "text/html; charset=windows-1257"
                ],
                "content-disposition": [
                  "inline"
                ],
                "content-id": [
                  "<FFFF__=4DBB0DE5DFAE33558f9e8a93df938690918c4DB@>"
                ],
                "content-transfer-encoding": [
                  "quoted-printable"
                ]
              },
              "size": 71,
              "partName": "1.1.2",
              "body": "<html><body><font size=\\"2\\">Join Zoom Meeting</font><br>\\r\\n</body></html>"
            }
          ]
        },
        {
          "contentType": "application/octet-stream",
          "headers": {
            "content-type": [
              "application/octet-stream; charset=\\"UTF-8\\"; name=\\"c141520.ics\\""
            ],
            "content-disposition": [
              "attachment; filename=\\"c141520.ics\\""
            ]
          },
          "size": 1221,
          "partName": "1.2",
          "name": "c141520.ics"
        }
      ]
    }
  ]
}

Status: ASSIGNED → RESOLVED
Closed: 4 months ago
Resolution: --- → MOVED

Re-opening to add a test.

Status: RESOLVED → REOPENED
Resolution: MOVED → ---

This adds a test for the issue raised in Bug 1737532.

Depends on D211914

Target Milestone: --- → 128 Branch

Pushed by martin@humanoids.be:
https://hg.mozilla.org/comm-central/rev/67a0ebfd8bc2
Add test for text/calendar inline part in messages.getFull(). r=aleca

Status: REOPENED → RESOLVED
Closed: 4 months ago4 months ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: