/usr/share/perl5/MIME/Decoder/Base64.pm is in libmime-tools-perl 5.503-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | package MIME::Decoder::Base64;
use strict;
use warnings;
=head1 NAME
MIME::Decoder::Base64 - encode/decode a "base64" stream
=head1 SYNOPSIS
A generic decoder object; see L<MIME::Decoder> for usage.
=head1 DESCRIPTION
A L<MIME::Decoder> subclass for the C<"base64"> encoding.
The name was chosen to jibe with the pre-existing MIME::Base64
utility package, which this class actually uses to translate each chunk.
=over 4
=item *
When B<decoding>, the input is read one line at a time.
The input accumulates in an internal buffer, which is decoded in
multiple-of-4-sized chunks (plus a possible "leftover" input chunk,
of course).
=item *
When B<encoding>, the input is read 45 bytes at a time: this ensures
that the output lines are not too long. We chose 45 since it is
a multiple of 3 and produces lines under 76 characters, as RFC 2045
specifies:
The encoded output stream must be represented in lines of no more
than 76 characters each.
=back
=head1 SEE ALSO
L<MIME::Decoder>
=head1 AUTHOR
Eryq (F<eryq@zeegee.com>), ZeeGee Software Inc (F<http://www.zeegee.com>).
All rights reserved. This program is free software; you can redistribute
it and/or modify it under the same terms as Perl itself.
=cut
use vars qw(@ISA $VERSION);
use MIME::Decoder;
use MIME::Base64 2.04;
use MIME::Tools qw(debug);
@ISA = qw(MIME::Decoder);
### The package version, both in 1.23 style *and* usable by MakeMaker:
$VERSION = "5.503";
### How many bytes to encode at a time (must be a multiple of 3, and
### less than (76 * 0.75)!
my $EncodeChunkLength = 45;
### How many bytes to decode at a time?
my $DecodeChunkLength = 32 * 1024;
#------------------------------
#
# decode_it IN, OUT
#
sub decode_it {
my ($self, $in, $out) = @_;
my $len_4xN;
### Create a suitable buffer:
my $buffer = ' ' x (120 + $DecodeChunkLength); $buffer = '';
debug "in = $in; out = $out";
### Get chunks until done:
local($_) = ' ' x $DecodeChunkLength;
while ($in->read($_, $DecodeChunkLength)) {
tr{A-Za-z0-9+/}{}cd; ### get rid of non-base64 chars
### Concat any new input onto any leftover from the last round:
$buffer .= $_;
length($buffer) >= $DecodeChunkLength or next;
### Extract substring with highest multiple of 4 bytes:
### 0 means not enough to work with... get more data!
$len_4xN = length($buffer) & ~3;
### Partition into largest-multiple-of-4 (which we decode),
### and the remainder (which gets handled next time around):
$out->print(decode_base64(substr($buffer, 0, $len_4xN)));
$buffer = substr($buffer, $len_4xN);
}
### No more input remains. Dispose of anything left in buffer:
if (length($buffer)) {
### Pad to 4-byte multiple, and decode:
$buffer .= "==="; ### need no more than 3 pad chars
$len_4xN = length($buffer) & ~3;
### Decode it!
$out->print(decode_base64(substr($buffer, 0, $len_4xN)));
}
1;
}
#------------------------------
#
# encode_it IN, OUT
#
sub encode_it {
my ($self, $in, $out) = @_;
my $encoded;
my $nread;
my $buf = '';
while ($nread = $in->read($buf, $EncodeChunkLength)) {
$encoded = encode_base64($buf);
$encoded .= "\n" unless ($encoded =~ /\n\Z/); ### ensure newline!
$out->print($encoded);
}
1;
}
#------------------------------
1;
|