Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/future/backports/email/base64mime.py: 60%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

47 statements  

1# Copyright (C) 2002-2007 Python Software Foundation 

2# Author: Ben Gertzfield 

3# Contact: email-sig@python.org 

4 

5"""Base64 content transfer encoding per RFCs 2045-2047. 

6 

7This module handles the content transfer encoding method defined in RFC 2045 

8to encode arbitrary 8-bit data using the three 8-bit bytes in four 7-bit 

9characters encoding known as Base64. 

10 

11It is used in the MIME standards for email to attach images, audio, and text 

12using some 8-bit character sets to messages. 

13 

14This module provides an interface to encode and decode both headers and bodies 

15with Base64 encoding. 

16 

17RFC 2045 defines a method for including character set information in an 

18`encoded-word' in a header. This method is commonly used for 8-bit real names 

19in To:, From:, Cc:, etc. fields, as well as Subject: lines. 

20 

21This module does not do the line wrapping or end-of-line character conversion 

22necessary for proper internationalized headers; it only does dumb encoding and 

23decoding. To deal with the various line wrapping issues, use the email.header 

24module. 

25""" 

26from __future__ import unicode_literals 

27from __future__ import division 

28from __future__ import absolute_import 

29from future.builtins import range 

30from future.builtins import bytes 

31from future.builtins import str 

32 

33__all__ = [ 

34 'body_decode', 

35 'body_encode', 

36 'decode', 

37 'decodestring', 

38 'header_encode', 

39 'header_length', 

40 ] 

41 

42 

43from base64 import b64encode 

44from binascii import b2a_base64, a2b_base64 

45 

46CRLF = '\r\n' 

47NL = '\n' 

48EMPTYSTRING = '' 

49 

50# See also Charset.py 

51MISC_LEN = 7 

52 

53 

54# Helpers 

55def header_length(bytearray): 

56 """Return the length of s when it is encoded with base64.""" 

57 groups_of_3, leftover = divmod(len(bytearray), 3) 

58 # 4 bytes out for each 3 bytes (or nonzero fraction thereof) in. 

59 n = groups_of_3 * 4 

60 if leftover: 

61 n += 4 

62 return n 

63 

64 

65def header_encode(header_bytes, charset='iso-8859-1'): 

66 """Encode a single header line with Base64 encoding in a given charset. 

67 

68 charset names the character set to use to encode the header. It defaults 

69 to iso-8859-1. Base64 encoding is defined in RFC 2045. 

70 """ 

71 if not header_bytes: 

72 return "" 

73 if isinstance(header_bytes, str): 

74 header_bytes = header_bytes.encode(charset) 

75 encoded = b64encode(header_bytes).decode("ascii") 

76 return '=?%s?b?%s?=' % (charset, encoded) 

77 

78 

79def body_encode(s, maxlinelen=76, eol=NL): 

80 r"""Encode a string with base64. 

81 

82 Each line will be wrapped at, at most, maxlinelen characters (defaults to 

83 76 characters). 

84 

85 Each line of encoded text will end with eol, which defaults to "\n". Set 

86 this to "\r\n" if you will be using the result of this function directly 

87 in an email. 

88 """ 

89 if not s: 

90 return s 

91 

92 encvec = [] 

93 max_unencoded = maxlinelen * 3 // 4 

94 for i in range(0, len(s), max_unencoded): 

95 # BAW: should encode() inherit b2a_base64()'s dubious behavior in 

96 # adding a newline to the encoded string? 

97 enc = b2a_base64(s[i:i + max_unencoded]).decode("ascii") 

98 if enc.endswith(NL) and eol != NL: 

99 enc = enc[:-1] + eol 

100 encvec.append(enc) 

101 return EMPTYSTRING.join(encvec) 

102 

103 

104def decode(string): 

105 """Decode a raw base64 string, returning a bytes object. 

106 

107 This function does not parse a full MIME header value encoded with 

108 base64 (like =?iso-8895-1?b?bmloISBuaWgh?=) -- please use the high 

109 level email.header class for that functionality. 

110 """ 

111 if not string: 

112 return bytes() 

113 elif isinstance(string, str): 

114 return a2b_base64(string.encode('raw-unicode-escape')) 

115 else: 

116 return a2b_base64(string) 

117 

118 

119# For convenience and backwards compatibility w/ standard base64 module 

120body_decode = decode 

121decodestring = decode