Fixed bug in gam <UserTypeEntity> show messages ... showattachments to avoid a trap when text/plain attachments in character sets other than UTF-8 are displayed.

This commit is contained in:
Ross Scroggs
2024-02-03 21:14:16 -08:00
parent 566a0c0345
commit 267d63fcd6
5 changed files with 44 additions and 16 deletions

View File

@ -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 <UserTypeEntity> 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 <BatchContent>` and `gam tbatch <BatchContent>` commands to accept lines with the following form:

View File

@ -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 <ross.scroggs@gmail.com>
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 <ross.scroggs@gmail.com>
Python 3.12.1 64-bit final
Windows-10-10.0.17134 AMD64

View File

@ -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 <ross.scroggs@gmail.com>
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 <ross.scroggs@gmail.com>
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 <ross.scroggs@gmail.com>
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 <ross.scroggs@gmail.com>
Python 3.12.1 64-bit final
MacOS Sonoma 14.2.1 x86_64

View File

@ -2,6 +2,11 @@
Merged GAM-Team version
6.67.37
Fixed bug in `gam <UserTypeEntity> 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 <BatchContent>` and `gam tbatch <BatchContent>` commands to accept lines with the following form:

View File

@ -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