summaryrefslogtreecommitdiff
path: root/fml/lib
diff options
context:
space:
mode:
Diffstat (limited to 'fml/lib')
-rw-r--r--fml/lib/FML/Article/Summary.pm3
-rw-r--r--fml/lib/FML/CGI/Anonymous/DB.pm15
-rw-r--r--fml/lib/FML/CGI/Skin/Anonymous.pm10
-rw-r--r--fml/lib/FML/Filter/TextPlain.pm3
-rw-r--r--fml/lib/FML/Process/CGI/Kernel.pm4
-rw-r--r--fml/lib/Mail/Message.pm1
-rw-r--r--fml/lib/Mail/Message/Charset.pm10
-rw-r--r--fml/lib/Mail/Message/Encode.pm82
-rw-r--r--fml/lib/Mail/Message/ToHTML.pm126
9 files changed, 145 insertions, 109 deletions
diff --git a/fml/lib/FML/Article/Summary.pm b/fml/lib/FML/Article/Summary.pm
index 93cd5700..0e66c916 100644
--- a/fml/lib/FML/Article/Summary.pm
+++ b/fml/lib/FML/Article/Summary.pm
@@ -129,6 +129,9 @@ sub _prepare_info
$subject = $sbj->as_external_form();
}
+ use Encode qw(from_to);
+ from_to($subject, 'euc-jp', 'utf-8');
+
my $info = {
id => $id,
address => $address,
diff --git a/fml/lib/FML/CGI/Anonymous/DB.pm b/fml/lib/FML/CGI/Anonymous/DB.pm
index 598066f1..a1d4d9af 100644
--- a/fml/lib/FML/CGI/Anonymous/DB.pm
+++ b/fml/lib/FML/CGI/Anonymous/DB.pm
@@ -189,6 +189,10 @@ sub is_correct_magic_string
my $db_session_id = $confirm->get($session_id, "session_id");
my $db_magic_string = $confirm->get($session_id, "magic_string");
+ print STDERR "INPUT MAGIC STRING : ", (defined($magic_string) ? $magic_string : "UNDEFINED"), "\n";
+ print STDERR "DB SESSION ID : ", (defined($db_session_id) ? $db_session_id : "UNDEFINED"), "\n";
+ print STDERR "DB MAGIC STRING : ", (defined($db_magic_string) ? $db_magic_string : "UNDEFINED"), "\n";
+
# case insensitive
$magic_string =~ tr/A-Z/a-z/;
$db_magic_string =~ tr/A-Z/a-z/;
@@ -220,15 +224,22 @@ sub _db_open
my ($curproc) = $self->{ _curproc };
my ($config) = $curproc->config();
my ($pcb) = $curproc->pcb();
+ my ($buffer) = << 'EOF';
+Suppose dev-list@dangofactory.net ML. Firstly, send the mail with
+
+subscribe YOUR-NAME
+
+to dev-list-ctl@dangofactory.net address.
+EOF
use FML::Confirm;
- my $cache_dir = $config->{ db_dir };
+ my $cache_dir = '/var/spool/ml/@tmp@';
my $confirm = new FML::Confirm $curproc, {
keyword => "confirm",
cache_dir => $cache_dir,
class => "cgi",
address => "dummy",
- buffer => "dummy",
+ buffer => $buffer,
};
return $confirm;
}
diff --git a/fml/lib/FML/CGI/Skin/Anonymous.pm b/fml/lib/FML/CGI/Skin/Anonymous.pm
index 92682c9b..70c57f20 100644
--- a/fml/lib/FML/CGI/Skin/Anonymous.pm
+++ b/fml/lib/FML/CGI/Skin/Anonymous.pm
@@ -192,11 +192,11 @@ sub _anonymous_is_human_operating
my $db = new FML::CGI::Anonymous::DB $curproc;
# 1. expired ?
- if ($db->is_expired($session_id)) {
- $curproc->logerror("expired request");
- $global_error_reason = "expired";
- return 0;
- }
+ #if ($db->is_expired($session_id)) {
+ # $curproc->logerror("expired request");
+ # $global_error_reason = "expired";
+ # return 0;
+ #}
# 2. not expired, ok, check if the magic string is correct.
if ($db->is_correct_magic_string($session_id, $magic_string)) {
diff --git a/fml/lib/FML/Filter/TextPlain.pm b/fml/lib/FML/Filter/TextPlain.pm
index ef210690..2aa4224a 100644
--- a/fml/lib/FML/Filter/TextPlain.pm
+++ b/fml/lib/FML/Filter/TextPlain.pm
@@ -35,8 +35,7 @@ constructor.
# default rules for convenience.
-my (@default_rules) = qw(reject_not_iso2022jp_japanese_string
- reject_null_mail_body
+my (@default_rules) = qw(reject_null_mail_body
reject_one_line_message
reject_old_fml_command_syntax
reject_invalid_fml_command_syntax
diff --git a/fml/lib/FML/Process/CGI/Kernel.pm b/fml/lib/FML/Process/CGI/Kernel.pm
index a4891fe0..4f8f938b 100644
--- a/fml/lib/FML/Process/CGI/Kernel.pm
+++ b/fml/lib/FML/Process/CGI/Kernel.pm
@@ -103,8 +103,8 @@ sub prepare
$curproc->_set_charset();
my $charset = $curproc->langinfo_get_charset("cgi"); # updated charset.
- print header(-type => "text/html; charset=$charset",
- -charset => $charset,
+ print header(-type => "text/html; charset=euc-jp",
+ -charset => "euc-jp",
-target => "_top");
# generate and save the session string and identifier.
diff --git a/fml/lib/Mail/Message.pm b/fml/lib/Mail/Message.pm
index 32aeee8f..5c717974 100644
--- a/fml/lib/Mail/Message.pm
+++ b/fml/lib/Mail/Message.pm
@@ -2547,6 +2547,7 @@ sub message_text
{
my ($self, $size) = @_;
my $data = $self->{ data };
+
my $base_data_type = $self->{ base_data_type };
my ($pos, $pos_begin, $msglen);
diff --git a/fml/lib/Mail/Message/Charset.pm b/fml/lib/Mail/Message/Charset.pm
index 0f130ad8..a229abfc 100644
--- a/fml/lib/Mail/Message/Charset.pm
+++ b/fml/lib/Mail/Message/Charset.pm
@@ -176,8 +176,8 @@ my %internal_charset_map = (
my %message_charset_map = (
- 'ja' => 'iso-2022-jp',
- 'japanese' => 'iso-2022-jp',
+ 'ja' => 'euc-jp',
+ 'japanese' => 'euc-jp',
'en' => 'us-ascii',
'english' => 'us-ascii',
@@ -239,6 +239,8 @@ sub language_to_internal_charset
{
my ($self, $language) = @_;
+ $language = 'ja';
+
return( $internal_charset_map{ lc($language) } || '' );
}
@@ -251,6 +253,8 @@ sub language_to_message_charset
{
my ($self, $language) = @_;
+ $language = 'ja';
+
return( $message_charset_map{ lc($language) } || '' );
}
@@ -263,6 +267,8 @@ sub message_charset_to_language
{
my ($self, $charset) = @_;
+ $charset = 'iso-2022-jp';
+
return( $rev_message_charset_map{ lc($charset) } || '' );
}
diff --git a/fml/lib/Mail/Message/Encode.pm b/fml/lib/Mail/Message/Encode.pm
index 346ae3b6..7b45aadd 100644
--- a/fml/lib/Mail/Message/Encode.pm
+++ b/fml/lib/Mail/Message/Encode.pm
@@ -88,23 +88,22 @@ sub detect_code
my ($self, $str) = @_;
my $lang = $self->{ _language };
- # XXX Japanese includes English.
if ($lang eq 'japanese' || $lang eq 'english') {
- # getcode() can detect the follogin code:
- # jis, sjis, euc, utf8, ucs2, ucs4, utf16, utf16-ge, utf16-le,
- # utf32, utf32-ge, utf32-le, ascii, binary, sjis-imode,
- # sjis-doti, sjis-jsky.
- use Unicode::Japanese;
- my $obj = new Unicode::Japanese;
- return $obj->getcode($str);
+
+ my $hex = unpack('H*', $str);
+
+ use Unicode::Japanese;
+ my $obj = new Unicode::Japanese;
+ my $code = $obj->getcode($str);
+
+ return $code;
}
else {
- carp("Mail::Message::Encode: unknown language");
- return 'unknown';
+ carp("Mail::Message::Encode: unknown language");
+ return 'unknown';
}
}
-
# Unicode::Japanese
# 'jis', 'sjis', 'euc', 'utf8', 'ucs2', 'ucs4', 'utf16',
# 'utf16-ge', 'utf16-le', 'utf32', 'utf32-ge',
@@ -156,35 +155,33 @@ sub convert_str_ref
my $lang = $self->{ _language };
unless (ref($str_ref) eq 'SCALAR') {
- croak("convert_str_ref: invalid input data");
+ croak("convert_str_ref: invalid input data");
}
- # XXX Japanese includes English.
if ($lang eq 'japanese' || $lang eq 'english') {
- # 1. if the encoding for the given $str_ref is unknown, return ASAP.
- unless (defined $in_code) {
- $in_code = $self->detect_code($$str_ref);
- if ($in_code eq 'unknown') {
- return 0;
- }
- }
- else {
- # print "1 ok\n";
- }
-
- # 2. try conversion ! (converted to 'euc' by default).
- if ($in_code) {
- return $self->_jp_str_ref($str_ref, $out_code, $in_code);
- }
- }
- else {
- croak("Mail::Message::Encode: unknown language");
+
+ unless (defined $in_code) {
+ $in_code = $self->detect_code($$str_ref);
+
+ if ($in_code eq 'unknown') {
+ return 0;
+ }
+ }
+
+ if ($in_code) {
+ my $r = $self->_jp_str_ref(
+ $str_ref,
+ $out_code,
+ $in_code
+ );
+
+ return $r;
+ }
}
return 0;
}
-
# Descriptions: convert japanese string to $out_code.
# XXX $in_code must be determined here !
# Arguments: OBJ($self) STR_REF($str_ref) STR($out_code) STR($in_code)
@@ -195,25 +192,28 @@ sub _jp_str_ref
my ($self, $str_ref, $out_code, $in_code) = @_;
if ($out_code =~ /^(jis|sjis|euc)$|^(jis|sjis|euc)[-_]jp$/i) {
- my $code = $1 || $2;
- $code =~ tr/A-Z/a-z/;
- use Jcode;
- &Jcode::convert($str_ref, $code, $in_code);
+ my $code = $1 || $2;
+ $code =~ tr/A-Z/a-z/;
- return 1;
+ use Jcode;
+ &Jcode::convert($str_ref, $code, $in_code);
+
+ return 1;
}
elsif ($out_code =~ /^(iso2022jp|iso-2022-jp)$/i) {
- use Jcode;
- &Jcode::convert($str_ref, 'jis', $in_code);
- return 1;
+ use Jcode;
+ &Jcode::convert($str_ref, 'jis', $in_code);
+
+ return 1;
}
+ warn "_jp_str_ref: unsupported out_code=$out_code\n";
+
return 0;
}
-
=head2 run_in_code($proc, $s, $args, $out_code, $in_code)
run $proc($s) under $out_code environment.
diff --git a/fml/lib/Mail/Message/ToHTML.pm b/fml/lib/Mail/Message/ToHTML.pm
index 0a682f85..9369ce73 100644
--- a/fml/lib/Mail/Message/ToHTML.pm
+++ b/fml/lib/Mail/Message/ToHTML.pm
@@ -852,6 +852,10 @@ sub _text_plain_part_safe_print
# Arguments: OBJ($self) HASH_REF($args)
# Side Effects: none
# Return Value: STR
+use Encode qw(is_utf8);
+use MIME::Base64 qw(decode_base64);
+use MIME::QuotedPrint qw(decode_qp);
+
sub _text_safe_print
{
my ($self, $args) = @_;
@@ -861,25 +865,15 @@ sub _text_safe_print
my $encoding = $args->{ encoding } || '7bit';
if ($encoding eq 'base64') {
- use Mail::Message::Encode;
- my $encode = new Mail::Message::Encode;
- $buf = $encode->decode_base64_string($buf);
+ $buf = decode_base64($buf);
}
elsif ($encoding eq 'quoted-printable') {
- use Mail::Message::Encode;
- my $encode = new Mail::Message::Encode;
- $buf = $encode->decode_qp_string($buf);
- }
-
- # XXX-TODO: euc-jp is hard-coded.
- if (defined $buf && $buf) {
- $buf = $self->_convert($buf, 'euc');
+ $buf = decode_qp($buf);
}
- _print_safe_buf($fh, $buf);
+ _print_safe_buf($fh, $buf, $in_code);
}
-
# Descriptions: print out message without escaping
# Arguments: OBJ($self) HASH_REF($args)
# Side Effects: create $outf
@@ -917,6 +911,10 @@ sub _text_raw_print
# Arguments: OBJ($self) HASH_REF($args)
# Side Effects: create $outf file
# Return Value: none
+use FileHandle;
+use MIME::Base64 qw(decode_base64);
+use MIME::QuotedPrint qw(decode_qp);
+
sub _binary_print
{
my ($self, $args) = @_;
@@ -928,39 +926,37 @@ sub _binary_print
umask(022);
if (defined( $args->{ file } )) {
- my $outf = $args->{ file };
- use FileHandle;
- my $fh = new FileHandle "> $outf";
-
- if (defined $fh) {
- $fh->autoflush(1);
- binmode($fh);
-
- use Mail::Message::Encode;
- my $encode = new Mail::Message::Encode;
- if ($enc eq 'base64') {
- print $fh $encode->raw_decode_base64( $msg->message_text() );
- }
- elsif ($enc eq 'quoted-printable') {
- print $fh $encode->raw_decode_qp( $msg->message_text() );
- }
- elsif ($enc eq '7bit') {
- _print_safe_str($fh, $msg->message_text());
- }
- else {
- my $r = "*** unknown MIME encoding enc='$enc' ***\n";
- _print_safe_str($fh, $r);
- _print_safe_str($fh, $msg->message_text());
- }
-
- $fh->close();
- }
+ my $outf = $args->{ file };
+ my $fh = FileHandle->new("> $outf");
+
+ if (defined $fh) {
+ $fh->autoflush(1);
+ binmode($fh);
+
+ my $data = $msg->message_text();
+
+ if ($enc eq 'base64') {
+ print $fh decode_base64($data);
+ }
+ elsif ($enc eq 'quoted-printable') {
+ print $fh decode_qp($data);
+ }
+ elsif ($enc eq '7bit') {
+ _print_safe_str($fh, $data);
+ }
+ else {
+ my $r = "*** unknown MIME encoding enc='$enc' ***\n";
+ _print_safe_str($fh, $r);
+ _print_safe_str($fh, $data);
+ }
+
+ $fh->close();
+ }
}
umask($mask);
}
-
=head2 is_ignore($id)
we should not process this C<$id>
@@ -1960,18 +1956,18 @@ sub _charset_to_code
if (defined $charset) {
$charset =~ tr/A-Z/a-z/;
- if ($charset eq 'euc-jp') {
- return 'euc';
+ if ($charset eq 'euc') {
+ return 'euc-jp';
}
elsif ($charset eq 'iso-2022-jp') {
- return 'jis';
+ return 'sjis';
}
else {
return $charset; # may be wrong, but I hope it works well:-)
}
}
else {
- return 'euc'; # euc-jp by default
+ return 'euc-jp'; # euc-jp by default
}
}
@@ -1987,7 +1983,7 @@ sub _print_raw_str
# XXX-TODO: euc-jp is hard-coded.
if (defined($str) && $str) {
- $str = __nc_convert($str, $code || 'euc');
+ $str = __nc_convert($str, $code || 'euc-jp');
}
print $wh $str;
@@ -2055,7 +2051,7 @@ sub __sprintf_safe_str
# XXX-TODO: euc-jp is hard-coded.
if (defined($str) && $str) {
- $str = __nc_convert($str, $code || 'euc');
+ $str = __nc_convert($str, $code || 'euc-jp');
}
if (defined $str) {
@@ -2271,7 +2267,7 @@ sub _decode_mime_string
use Mail::Message::Subject;
my $sbj = new Mail::Message::Subject $str;
$sbj->mime_header_decode();
- return $sbj->as_external_form();
+ return $sbj->as_str();
}
else {
return '';
@@ -2283,13 +2279,21 @@ sub _decode_mime_string
# Arguments: OBJ($self) STR($str) STR($out_code) STR($in_code)
# Side Effects: none
# Return Value: STR
+use Encode qw(decode encode);
+
sub _convert
{
my ($self, $str, $out_code, $in_code) = @_;
- use Mail::Message::Encode;
- my $encode = new Mail::Message::Encode;
- return $encode->convert($str, $out_code, $in_code);
+ return '' unless defined $str && $str ne '';
+
+ $in_code ||= 'euc-jp';
+ $out_code ||= 'euc-jp';
+
+ my $decoded = eval {
+ decode($in_code, $str, Encode::FB_DEFAULT);
+ };
+ return $decoded;
}
# Descriptions: convert $str to $out_code code (non method version)
@@ -2300,10 +2304,22 @@ sub _convert
sub __nc_convert
{
my ($str, $out_code, $in_code) = @_;
-
- use Mail::Message::Encode;
- my $encode = new Mail::Message::Encode;
- return $encode->convert($str, $out_code, $in_code);
+
+ return '' unless defined $str && $str ne '';
+
+ $in_code ||= 'euc-jp';
+ $out_code ||= 'euc-jp';
+
+ my $decoded;
+
+ eval {
+ $decoded = decode($out_code, $str);
+ 1;
+ } or do {
+ # fallback: 元データを返す
+ $decoded = $str;
+ };
+ return defined $decoded ? $decoded : $str;
}