View | Details | Raw Unified | Return to bug 8897
Collapse All | Expand All

(-)a/C4/GnuPG.pm (+119 lines)
Line 0 Link Here
1
package C4::GnuPG;
2
3
# Copyright 2012 Mirko Tietgen
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 2 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
use strict;
21
use warnings;
22
use C4::Context;
23
use Crypt::GPG;
24
25
=head1 C4::GnuPG
26
27
C4::GnuPG
28
29
=head1 Description
30
31
Provides methods to interact with GnuPG via Crypt::GPG for the purpose of encrypting emails to patrons
32
33
=cut
34
35
our $gpg = new Crypt::GPG;
36
$gpg->gpgbin('/usr/bin/gpg');
37
$gpg->encryptsafe(0); # we have to allow untrusted keys
38
39
=head2 encrypt
40
41
Take email content and patron's email address, send back encrypted content. Call like
42
43
$content = C4::GnuPG->encrypt($content, $patronemail);
44
45
=cut
46
47
sub encrypt {
48
    my ($self, $content, $patronemail) = @_;
49
    $content = $gpg->encrypt($content, $patronemail);
50
    return $content;
51
}
52
53
=head2 does_exist
54
55
Check if there is a GnuPG key for the patron's email address. Call like
56
57
if ( C4::GnuPG->does_exist($patronemail) = 1 ) {
58
    # … encrypt …
59
}
60
61
=cut
62
63
sub does_exist {
64
    # TODO: check if gpg binary is found before encrypting to avoid errors
65
    my ($self, $patronemail) = @_;
66
    if ( $gpg->keydb($patronemail) ) {
67
        return 1;
68
    }
69
    else {
70
        return 0;
71
    }
72
}
73
74
=head2 add_key
75
76
Add or replace a patron's key. If there is already a key present, delete. Then add the new key.
77
78
=cut
79
80
sub add_key {
81
    my ($self, $key, $patronemail) = @_;
82
    # check if it is a public key before doing anything
83
    if ( $key =~ /BEGIN PGP PUBLIC KEY BLOCK/ ) {
84
        # if we already got a key, delete
85
        if ( does_exist($patronemail) ) {
86
            my @oldkey = $gpg->keydb($patronemail);
87
            if ( $oldkey[0] ) {
88
                $gpg->delkey($oldkey[0]);
89
            }
90
        }
91
        # … add new key
92
        $gpg->addkey($key);
93
    }
94
    else {
95
        return 0;
96
    }
97
}
98
99
sub del_key {
100
    my ($self, $patronemail) = @_;
101
    my @key = $gpg->keydb($patronemail);
102
    $gpg->delkey($key[0]);
103
}
104
105
=head2 get_key
106
107
=cut
108
109
sub get_key {
110
    # TODO: check security issue: can i get a secret key with this?
111
    my ($self, $patronemail) = @_;
112
    my @key = $gpg->keydb($patronemail);
113
    my $keystring = $gpg->export($key[0]);
114
    if ( $keystring =~ /BEGIN PGP PUBLIC KEY BLOCK/) {
115
        return $keystring;
116
    }
117
}
118
119
1;
(-)a/C4/Installer/PerlDependencies.pm (+5 lines)
Lines 699-704 our $PERL_DEPS = { Link Here
699
        'required' => '0',
699
        'required' => '0',
700
        'min_ver'  => '0.73',
700
        'min_ver'  => '0.73',
701
    },
701
    },
702
    'Crypt::GPG' => {
703
        'usage'    => 'Messaging (encryption)',
704
        'required'  => '1',
705
        'min_ver'  => '1.52',
706
    },
702
};
707
};
703
708
704
1;
709
1;
(-)a/C4/Letters.pm (-3 / +13 lines)
Lines 30-35 use C4::Branch; Link Here
30
use C4::Log;
30
use C4::Log;
31
use C4::SMS;
31
use C4::SMS;
32
use C4::Debug;
32
use C4::Debug;
33
use C4::GnuPG;
33
use Koha::DateUtils;
34
use Koha::DateUtils;
34
use Date::Calc qw( Add_Delta_Days );
35
use Date::Calc qw( Add_Delta_Days );
35
use Encode;
36
use Encode;
Lines 302-314 sub SendAlerts { Link Here
302
                },
303
                },
303
                want_librarian => 1,
304
                want_librarian => 1,
304
            ) or return;
305
            ) or return;
305
306
            my $subject = Encode::encode( "utf8", "" . $letter->{title} );
307
            my $content = Encode::encode( "utf8", "" . $letter->{content} );
308
            if ( C4::GnuPG->does_exist($email) ) {
309
                $subject = 'A message from your library';
310
                $content = C4::GnuPG->encrypt($content, $email);
311
            }
306
            # ... then send mail
312
            # ... then send mail
307
            my %mail = (
313
            my %mail = (
308
                To      => $email,
314
                To      => $email,
309
                From    => $branchdetails->{'branchemail'} || C4::Context->preference("KohaAdminEmailAddress"),
315
                From    => $branchdetails->{'branchemail'} || C4::Context->preference("KohaAdminEmailAddress"),
310
                Subject => Encode::encode( "utf8", "" . $letter->{title} ),
316
                Subject => $subject,
311
                Message => Encode::encode( "utf8", "" . $letter->{content} ),
317
                Message => $content,
312
                'Content-Type' => 'text/plain; charset="utf8"',
318
                'Content-Type' => 'text/plain; charset="utf8"',
313
                );
319
                );
314
            sendmail(%mail) or carp $Mail::Sendmail::error;
320
            sendmail(%mail) or carp $Mail::Sendmail::error;
Lines 954-959 sub _send_message_by_email { Link Here
954
960
955
    my $branch_email = ( $member ) ? GetBranchDetail( $member->{'branchcode'} )->{'branchemail'} : undef;
961
    my $branch_email = ( $member ) ? GetBranchDetail( $member->{'branchcode'} )->{'branchemail'} : undef;
956
962
963
    if ( C4::GnuPG->does_exist($to_address) ) {
964
        $subject = 'A message from your library';
965
        $content = C4::GnuPG->encrypt($content, $to_address);
966
    }
957
    my %sendmail_params = (
967
    my %sendmail_params = (
958
        To   => $to_address,
968
        To   => $to_address,
959
        From => $message->{'from_address'} || $branch_email || C4::Context->preference('KohaAdminEmailAddress'),
969
        From => $message->{'from_address'} || $branch_email || C4::Context->preference('KohaAdminEmailAddress'),
(-)a/debian/control (+3 lines)
Lines 26-31 Build-Depends: libalgorithm-checkdigits-perl, Link Here
26
 libclass-accessor-perl,
26
 libclass-accessor-perl,
27
 libclass-factory-util-perl,
27
 libclass-factory-util-perl,
28
 libcrypt-eksblowfish-perl,
28
 libcrypt-eksblowfish-perl,
29
 libcrypt-gpg-perl,
29
 libdata-ical-perl,
30
 libdata-ical-perl,
30
 libdata-paginator-perl,
31
 libdata-paginator-perl,
31
 libdate-calc-perl,
32
 libdate-calc-perl,
Lines 176-181 Depends: ${misc:Depends}, Link Here
176
 at,
177
 at,
177
 daemon,
178
 daemon,
178
 debconf,
179
 debconf,
180
 gnupg,
179
 idzebra-2.0,
181
 idzebra-2.0,
180
 libjs-jquery,
182
 libjs-jquery,
181
 libjs-yui,
183
 libjs-yui,
Lines 214-219 Depends: libalgorithm-checkdigits-perl, Link Here
214
 libclass-accessor-perl,
216
 libclass-accessor-perl,
215
 libclass-factory-util-perl,
217
 libclass-factory-util-perl,
216
 libcrypt-eksblowfish-perl,
218
 libcrypt-eksblowfish-perl,
219
 libcrypt-gpg-perl,
217
 libdata-ical-perl,
220
 libdata-ical-perl,
218
 libdata-paginator-perl,
221
 libdata-paginator-perl,
219
 libdate-calc-perl,
222
 libdate-calc-perl,
(-)a/debian/control.in (+1 lines)
Lines 69-74 Depends: ${misc:Depends}, Link Here
69
 cron-daemon,
69
 cron-daemon,
70
 daemon,
70
 daemon,
71
 debconf,
71
 debconf,
72
 gnupg,
72
 idzebra-2.0,
73
 idzebra-2.0,
73
 libjs-jquery,
74
 libjs-jquery,
74
 libjs-yui,
75
 libjs-yui,
(-)a/install_misc/debian.packages (+2 lines)
Lines 2-7 apache2 install Link Here
2
at install
2
at install
3
cvs	install
3
cvs	install
4
daemon install
4
daemon install
5
gnupg install
5
gcc install
6
gcc install
6
gettext install
7
gettext install
7
idzebra-2.0	install
8
idzebra-2.0	install
Lines 23-28 libcgi-session-perl install Link Here
23
libcgi-session-serialize-yaml-perl install
24
libcgi-session-serialize-yaml-perl install
24
libclass-accessor-perl		install
25
libclass-accessor-perl		install
25
libclass-factory-util-perl	install
26
libclass-factory-util-perl	install
27
libcypt-gpg-perl	install
26
libdata-ical-perl	install
28
libdata-ical-perl	install
27
libdata-paginator-perl		install
29
libdata-paginator-perl		install
28
libdate-calc-perl install
30
libdate-calc-perl install
(-)a/install_misc/ubuntu.10.04.packages (+2 lines)
Lines 35-40 libidzebra-2.0-modules install Link Here
35
35
36
# crypto packages
36
# crypto packages
37
37
38
gnupg					install
38
libgcrypt11				install
39
libgcrypt11				install
39
libgcrypt11-dev				install
40
libgcrypt11-dev				install
40
41
Lines 62-67 libcgi-session-perl install Link Here
62
libcgi-session-serialize-yaml-perl	install
63
libcgi-session-serialize-yaml-perl	install
63
libclass-accessor-perl		install
64
libclass-accessor-perl		install
64
libclass-factory-util-perl		install
65
libclass-factory-util-perl		install
66
libcrypt-gpg-perl			install
65
libdata-ical-perl			install
67
libdata-ical-perl			install
66
libdata-paginator-perl		install
68
libdata-paginator-perl		install
67
libdate-calc-perl			install
69
libdate-calc-perl			install
(-)a/install_misc/ubuntu.12.04.packages (+2 lines)
Lines 34-39 libidzebra-2.0-modules install Link Here
34
34
35
# crypto packages
35
# crypto packages
36
36
37
gnupg					install
37
libgcrypt11				install
38
libgcrypt11				install
38
libgcrypt11-dev				install
39
libgcrypt11-dev				install
39
40
Lines 64-69 libchi-driver-memcached-perl install Link Here
64
libchi-perl				install
65
libchi-perl				install
65
libclass-accessor-perl			install
66
libclass-accessor-perl			install
66
libclass-factory-util-perl		install
67
libclass-factory-util-perl		install
68
libcrypt-gpg-perl			install
67
libdata-ical-perl			install
69
libdata-ical-perl			install
68
libdata-paginator-perl		install
70
libdata-paginator-perl		install
69
libdate-calc-perl			install
71
libdate-calc-perl			install
(-)a/install_misc/ubuntu.packages (+2 lines)
Lines 34-39 libidzebra-2.0-modules install Link Here
34
34
35
# crypto packages
35
# crypto packages
36
36
37
gnupg					install
37
libgcrypt11				install
38
libgcrypt11				install
38
libgcrypt11-dev				install
39
libgcrypt11-dev				install
39
40
Lines 64-69 libchi-driver-memcached-perl install Link Here
64
libchi-perl				install
65
libchi-perl				install
65
libclass-accessor-perl			install
66
libclass-accessor-perl			install
66
libclass-factory-util-perl		install
67
libclass-factory-util-perl		install
68
libcrypt-gpg-perl			install
67
libdata-ical-perl			install
69
libdata-ical-perl			install
68
libdata-paginator-perl		install
70
libdata-paginator-perl		install
69
libdate-calc-perl			install
71
libdate-calc-perl			install
(-)a/koha-tmpl/opac-tmpl/prog/en/includes/usermenu.inc (+1 lines)
Lines 12-17 Link Here
12
  [% IF ( OpacPasswordChange ) %]
12
  [% IF ( OpacPasswordChange ) %]
13
    [% IF ( passwdview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/opac-passwd.pl">change my password</a></li>
13
    [% IF ( passwdview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/opac-passwd.pl">change my password</a></li>
14
  [% END %]
14
  [% END %]
15
  [% IF ( gnupgview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/opac-gnupg.pl">email encryption</a></li>
15
  [% IF ( ShowOpacRecentSearchLink ) %]
16
  [% IF ( ShowOpacRecentSearchLink ) %]
16
  [% IF ( searchhistoryview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/opac-search-history.pl">my search history</a></li>
17
  [% IF ( searchhistoryview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/opac-search-history.pl">my search history</a></li>
17
  [% END %]
18
  [% END %]
(-)a/koha-tmpl/opac-tmpl/prog/en/modules/opac-gnupg.tt (+59 lines)
Line 0 Link Here
1
[% INCLUDE 'doc-head-open.inc' %][% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo; Add or change your GPG key
2
[% INCLUDE 'doc-head-close.inc' %]
3
</head>
4
<body id="opac-passwd">
5
<div id="doc3" class="yui-t1">
6
   <div id="bd">
7
[% INCLUDE 'masthead.inc' %]
8
9
	<div id="yui-main">
10
	<div class="yui-b"><div class="yui-g">
11
	<div id="usergnupg" class="container">
12
    <h3><a href="/cgi-bin/koha/opac-gnupg.pl">[% firstname %] [% surname %]'s account</a> &#8674; Add or change your GPG key </h3>
13
    <p>If you paste your GPG <strong>public</strong> key here, we will try to encrypt the emails we send you.<br />
14
    If you want to learn about email encryption, you will find some information at link</p>
15
16
    [% IF ( Error_messages ) %]
17
        <div class="dialog error">        <h3>There was a problem with your submission</h3>
18
            <p>
19
                [% IF ( NoGnuPG ) %]
20
                    Could not find the path to GnuPG. This has to be set by the library for encryption to work. Please ask our staff about it.
21
                [% END %]
22
            </p></div>
23
    [% END %]
24
25
    <p>Path to GPG [% IF (gpgbinary) %]found[% ELSE %]not found[% END %].</p>
26
27
    <form action="/cgi-bin/koha/opac-gnupg.pl" name="mainform" id="mainform" method="post">
28
    <fieldset class="brief">
29
        <p><label for="PublicKey">
30
            [% IF ( does_exist ) %]
31
                We have the following public key for your email address:
32
            [% ELSE %]
33
                Paste your public key here:
34
            [% END %]
35
        </p>
36
        <ol><li><textarea id="PublicKey" name="PublicKey" cols="70" rows="30">[% IF (keythingy) %][% keythingy %][% END %]</textarea></li></ol>
37
    </fieldset>
38
    <fieldset class="action"><input type="submit" value="Save" class="submit" /> <a href="/cgi-bin/koha/opac-user.pl" class="cancel">Cancel</a></fieldset>
39
    </form>
40
41
    [% IF ( does_exist ) %]
42
    <p>Delete the key from our server if you wish to receive unencrypted emails in the future.</p>
43
    <form action="/cgi-bin/koha/opac-gnupg.pl" name="deleteform" id="deleteform" method="post">
44
        <input type="hidden" name="DeleteKey" value="1" />
45
        <fieldset class="action"><input type="submit" value="Delete my public key" class="submit" /></fieldset>
46
    </form>
47
    [% END %]
48
49
</div>
50
</div>
51
</div>
52
</div>
53
<div class="yui-b">
54
<div id="leftmenus" class="container">
55
[% INCLUDE 'navigation.inc' IsPatronPage=1 %]
56
</div>
57
</div>
58
</div>
59
[% INCLUDE 'opac-bottom.inc' %]
(-)a/opac/opac-gnupg.pl (+81 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
# Copyright 2013 Mirko Tietgen
4
#
5
# This file is part of Koha
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 2 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
use strict;
21
use warnings;
22
23
use CGI;
24
25
use C4::Auth;    # checkauth, getborrowernumber.
26
use C4::Context;
27
use Digest::MD5 qw(md5_base64);
28
use C4::Circulation;
29
use C4::Members;
30
use C4::Output;
31
use C4::GnuPG;
32
33
my $query = new CGI;
34
my $dbh   = C4::Context->dbh;
35
36
my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
37
    {
38
        template_name   => "opac-gnupg.tt",
39
        query           => $query,
40
        type            => "opac",
41
        authnotrequired => 0,
42
        flagsrequired   => { borrow => 1 },
43
        debug           => 1,
44
    }
45
);
46
47
# get borrower information ....
48
my ( $borr ) = GetMemberDetails( $borrowernumber );
49
my $patronemail = $borr->{'email'};
50
# save key if key received
51
if ( $query->param('PublicKey') ) {
52
    C4::GnuPG->add_key($query->param('PublicKey'), $patronemail);
53
#    $template->param( 'addedkey' => $query->param('PublicKey') );
54
#    $template->param( 'added' => '1' );
55
}
56
elsif ( $query->param('DeleteKey') ) {
57
    C4::GnuPG->del_key($patronemail);
58
}
59
    if ( C4::GnuPG->does_exist($patronemail) ) {
60
        # TODO: display public key if present
61
        my $keythingy = C4::GnuPG->get_key($patronemail);
62
        $template->param( 'does_exist' => '1' );
63
        $template->param( 'keythingy' => $keythingy );
64
    }
65
    # ask for key
66
    #$template->param( 'Ask_data'       => '1' );
67
    #$template->param( 'Error_messages' => '1' );
68
69
 my $gnupgbinary = '/usr/bin/gpg';
70
 if (-e $gnupgbinary) {
71
     $template->param( 'gpgbinary' => '1' );
72
 }
73
74
$template->param(
75
    firstname => $borr->{'firstname'},
76
    surname => $borr->{'surname'},
77
    patronemail => $patronemail,
78
    gnupgview => 1,
79
);
80
81
output_html_with_http_headers $query, $cookie, $template->output;
(-)a/opac/opac-sendbasket.pl (-4 / +19 lines)
Lines 33-38 use C4::Auth; Link Here
33
use C4::Output;
33
use C4::Output;
34
use C4::Biblio;
34
use C4::Biblio;
35
use C4::Members;
35
use C4::Members;
36
use C4::GnuPG;
36
37
37
my $query = new CGI;
38
my $query = new CGI;
38
39
Lines 157-162 if ( $email_add ) { Link Here
157
    my $boundary = "====" . time() . "====";
158
    my $boundary = "====" . time() . "====";
158
159
159
    $mail{'content-type'} = "multipart/mixed; boundary=\"$boundary\"";
160
    $mail{'content-type'} = "multipart/mixed; boundary=\"$boundary\"";
161
162
    my $email_header_and_body = $email_header . $body;
163
164
    my $attachmentfilename;
165
    # encrypt the attachment if we have a key
166
    if ( C4::GnuPG->does_exist($email_add) ) {
167
        $mail{'subject'} = "A message from your library";
168
        $email_header_and_body = C4::GnuPG->encrypt($email_header_and_body, $email_add);
169
        $iso2709 = C4::GnuPG->encrypt($iso2709, $email_add);
170
        $attachmentfilename = 'attachment.gpg';
171
    }
172
    else {
173
        $attachmentfilename = 'basket.iso2709';
174
    }
175
160
    my $isofile = encode_base64(encode("UTF-8", $iso2709));
176
    my $isofile = encode_base64(encode("UTF-8", $iso2709));
161
    $boundary = '--' . $boundary;
177
    $boundary = '--' . $boundary;
162
    $mail{body} = <<END_OF_BODY;
178
    $mail{body} = <<END_OF_BODY;
Lines 165-176 MIME-Version: 1.0 Link Here
165
Content-Type: text/plain; charset="UTF-8"
181
Content-Type: text/plain; charset="UTF-8"
166
Content-Transfer-Encoding: quoted-printable
182
Content-Transfer-Encoding: quoted-printable
167
183
168
$email_header
184
$email_header_and_body
169
$body
170
$boundary
185
$boundary
171
Content-Type: application/octet-stream; name="basket.iso2709"
186
Content-Type: application/octet-stream; name=$attachmentfilename
172
Content-Transfer-Encoding: base64
187
Content-Transfer-Encoding: base64
173
Content-Disposition: attachment; filename="basket.iso2709"
188
Content-Disposition: attachment; filename=$attachmentfilename
174
189
175
$isofile
190
$isofile
176
$boundary--
191
$boundary--
(-)a/opac/opac-sendshelf.pl (-5 / +18 lines)
Lines 33-38 use C4::Items; Link Here
33
use C4::Output;
33
use C4::Output;
34
use C4::VirtualShelves;
34
use C4::VirtualShelves;
35
use C4::Members;
35
use C4::Members;
36
use C4::GnuPG;
36
37
37
my $query = new CGI;
38
my $query = new CGI;
38
39
Lines 141-147 if ( $email ) { Link Here
141
    # We set and put the multipart content
142
    # We set and put the multipart content
142
    $mail{'content-type'} = "multipart/mixed; boundary=\"$boundary\"";
143
    $mail{'content-type'} = "multipart/mixed; boundary=\"$boundary\"";
143
144
145
    my $email_header_and_body = $email_header . $body;
146
147
    my $attachmentfilename;
148
    # encrypt the attachment if we have a key
149
    if ( C4::GnuPG->does_exist($email) ) {
150
        $mail{'subject'} = "A message from your library";
151
        $email_header_and_body = C4::GnuPG->encrypt($email_header_and_body, $email);
152
        $iso2709 = C4::GnuPG->encrypt($iso2709, $email);
153
        $attachmentfilename = 'attachment.gpg';
154
    }
155
    else {
156
        $attachmentfilename = 'shelf.iso2709';
157
    }
144
    my $isofile = encode_base64(encode("UTF-8", $iso2709));
158
    my $isofile = encode_base64(encode("UTF-8", $iso2709));
159
145
    $boundary = '--' . $boundary;
160
    $boundary = '--' . $boundary;
146
161
147
    $mail{body} = <<END_OF_BODY;
162
    $mail{body} = <<END_OF_BODY;
Lines 150-161 MIME-Version: 1.0 Link Here
150
Content-Type: text/plain; charset="utf-8"
165
Content-Type: text/plain; charset="utf-8"
151
Content-Transfer-Encoding: quoted-printable
166
Content-Transfer-Encoding: quoted-printable
152
167
153
$email_header
168
$email_header_and_body
154
$body
155
$boundary
169
$boundary
156
Content-Type: application/octet-stream; name="list.iso2709"
170
Content-Type: application/octet-stream; name=$attachmentfilename
157
Content-Transfer-Encoding: base64
171
Content-Transfer-Encoding: base64
158
Content-Disposition: attachment; filename="list.iso2709"
172
Content-Disposition: attachment; filename=$attachmentfilename
159
173
160
$isofile
174
$isofile
161
$boundary--
175
$boundary--
162
- 

Return to bug 8897