diff --git a/docs/GamUpdates.md b/docs/GamUpdates.md index e798457a..7385502e 100644 --- a/docs/GamUpdates.md +++ b/docs/GamUpdates.md @@ -11,6 +11,11 @@ Add the `-s` option to the end of the above commands to suppress creating the `g See [Downloads](https://github.com/taers232c/GAMADV-XTD3/wiki/Downloads) for Windows or other options, including manual installation +### 6.67.37 + +Fixed bug in `gam show messages ... showattachments` to avoid a trap when `text/plain` attachments +in character sets other than `UTF-8` are displayed. + ### 6.67.36 Updated `gam batch ` and `gam tbatch ` commands to accept lines with the following form: diff --git a/docs/How-to-Upgrade-from-Standard-GAM.md b/docs/How-to-Upgrade-from-Standard-GAM.md index 25254cce..c4ffe76b 100644 --- a/docs/How-to-Upgrade-from-Standard-GAM.md +++ b/docs/How-to-Upgrade-from-Standard-GAM.md @@ -334,7 +334,7 @@ writes the credentials into the file oauth2.txt. admin@server:/Users/admin/bin/gamadv-xtd3$ rm -f /Users/admin/GAMConfig/oauth2.txt admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam version WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found -GAMADV-XTD3 6.67.36 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.67.37 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.12.1 64-bit final MacOS Sonoma 14.2.1 x86_64 @@ -1002,7 +1002,7 @@ writes the credentials into the file oauth2.txt. C:\GAMADV-XTD3>del C:\GAMConfig\oauth2.txt C:\GAMADV-XTD3>gam version WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found -GAMADV-XTD3 6.67.36 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.67.37 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.12.1 64-bit final Windows-10-10.0.17134 AMD64 diff --git a/docs/Version-and-Help.md b/docs/Version-and-Help.md index 5c9715a5..f018c5d5 100644 --- a/docs/Version-and-Help.md +++ b/docs/Version-and-Help.md @@ -1,10 +1,9 @@ -\ # Version and Help Print the current version of Gam with details ``` gam version -GAMADV-XTD3 6.67.36 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.67.37 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.12.1 64-bit final MacOS Sonoma 14.2.1 x86_64 @@ -16,7 +15,7 @@ Time: 2023-06-02T21:10:00-07:00 Print the current version of Gam with details and time offset information ``` gam version timeoffset -GAMADV-XTD3 6.67.36 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.67.37 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.12.1 64-bit final MacOS Sonoma 14.2.1 x86_64 @@ -28,7 +27,7 @@ Your system time differs from www.googleapis.com by less than 1 second Print the current version of Gam with extended details and SSL information ``` gam version extended -GAMADV-XTD3 6.67.36 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.67.37 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.12.1 64-bit final MacOS Sonoma 14.2.1 x86_64 @@ -65,7 +64,7 @@ MacOS High Sierra 10.13.6 x86_64 Path: /Users/Admin/bin/gamadv-xtd3 Version Check: Current: 5.35.08 - Latest: 6.67.36 + Latest: 6.67.37 echo $? 1 ``` @@ -73,7 +72,7 @@ echo $? Print the current version number without details ``` gam version simple -6.67.36 +6.67.37 ``` In Linux/MacOS you can do: ``` @@ -83,7 +82,7 @@ echo $VER Print the current version of Gam and address of this Wiki ``` gam help -GAM 6.67.36 - https://github.com/taers232c/GAMADV-XTD3 +GAM 6.67.37 - https://github.com/taers232c/GAMADV-XTD3 Ross Scroggs Python 3.12.1 64-bit final MacOS Sonoma 14.2.1 x86_64 diff --git a/src/GamUpdate.txt b/src/GamUpdate.txt index 2caa1e67..2e9cc14c 100644 --- a/src/GamUpdate.txt +++ b/src/GamUpdate.txt @@ -2,6 +2,11 @@ Merged GAM-Team version +6.67.37 + +Fixed bug in `gam show messages ... showattachments` to avoid a trap when `text/plain` attachments +in character sets other than `UTF-8` are displayed. + 6.67.36 Updated `gam batch ` and `gam tbatch ` commands to accept lines with the following form: diff --git a/src/gam/__init__.py b/src/gam/__init__.py index 0c2d182f..957b5483 100755 --- a/src/gam/__init__.py +++ b/src/gam/__init__.py @@ -66837,7 +66837,14 @@ def printShowMessagesThreads(users, entityType): return 'Body not available' ATTACHMENT_NAME_PATTERN = re.compile(r'^.*name="?(.*?)(?:"|;|$)') + CHARSET_NAME_PATTERN = re.compile(r'^.*charset="?(.*?)(?:"|;|$)') + def _showAttachmentMimeTypeSizeCharset(part, charset): + printKeyValueList(['mimeType', part['mimeType']]) + printKeyValueList(['size', part['body']['size']]) + if charset: + printKeyValueList(['charset', charset]) + def _showSaveAttachments(messageId, payload, attachmentNamePattern): for part in payload.get('parts', []): if 'attachmentId' in part['body']: @@ -66848,7 +66855,12 @@ def printShowMessagesThreads(users, entityType): continue attachmentName = mg.group(1) if (not attachmentNamePattern) or attachmentNamePattern.match(attachmentName): - if (part['mimeType'] == 'text/plain' and not noshow_text_plain) or save_attachments: + charset = '' + if part['mimeType'] == 'text/plain': + mg = CHARSET_NAME_PATTERN.match(header['value']) + if mg: + charset = mg.group(1) + if (part['mimeType'] == 'text/plain' and not noshow_text_plain) or save_attachments: try: result = callGAPI(gmail.users().messages().attachments(), 'get', throwReasons=GAPI.GMAIL_THROW_REASONS+[GAPI.NOT_FOUND], @@ -66858,10 +66870,12 @@ def printShowMessagesThreads(users, entityType): printKeyValueList(['Attachment', attachmentName]) Ind.Increment() if part['mimeType'] == 'text/plain': - printKeyValueList([Ind.MultiLineText(base64.urlsafe_b64decode(str(result['data'])).decode(UTF8)+'\n')]) + try: + printKeyValueList([Ind.MultiLineText(base64.urlsafe_b64decode(str(result['data'])).decode(charset)+'\n')]) + except (LookupError, UnicodeDecodeError, UnicodeError): + _showAttachmentMimeTypeSizeCharset(part, charset) else: - printKeyValueList(['mimeType', part['mimeType']]) - printKeyValueList(['size', part['body']['size']]) + _showAttachmentMimeTypeSizeCharset(part, charset) Ind.Decrement() if save_attachments: filename, _ = uniqueFilename(targetFolder, cleanFilename(attachmentName), overwrite) @@ -66878,8 +66892,7 @@ def printShowMessagesThreads(users, entityType): elif show_attachments: printKeyValueList(['Attachment', attachmentName]) Ind.Increment() - printKeyValueList(['mimeType', part['mimeType']]) - printKeyValueList(['size', part['body']['size']]) + _showAttachmentMimeTypeSizeCharset(part, charset) Ind.Decrement() break else: @@ -67002,8 +67015,13 @@ def printShowMessagesThreads(users, entityType): if not mg: continue attachmentName = mg.group(1) + charset = '' + if part['mimeType'] == 'text/plain': + mg = CHARSET_NAME_PATTERN.match(header['value']) + if mg: + charset = mg.group(1) if (not attachmentNamePattern) or attachmentNamePattern.match(attachmentName): - attachments.append((attachmentName, part['mimeType'], part['body']['size'])) + attachments.append((attachmentName, part['mimeType'], part['body']['size'], charset)) break else: _getAttachments(messageId, part, attachmentNamePattern, attachments) @@ -67060,6 +67078,7 @@ def printShowMessagesThreads(users, entityType): row[f'Attachments{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{i}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}name'] = attachment[0] row[f'Attachments{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{i}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}mimeType'] = attachment[1] row[f'Attachments{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{i}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}size'] = attachment[2] + row[f'Attachments{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{i}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}charset'] = attachment[3] csvPF.WriteRowTitles(row) parameters['messagesProcessed'] += 1