import rt 3.4.6
[freeside.git] / rt / lib / RT / I18N.pm
index af5ece0..448f4a2 100644 (file)
@@ -1,8 +1,8 @@
-# {{{ BEGIN BPS TAGGED BLOCK
+# BEGIN BPS TAGGED BLOCK {{{
 # 
 # COPYRIGHT:
 #  
-# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC 
+# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC 
 #                                          <jesse@bestpractical.com>
 # 
 # (Except where explicitly superseded by other copyright notices)
@@ -42,7 +42,8 @@
 # works based on those contributions, and sublicense and distribute
 # those contributions and any derivatives thereof.
 # 
-# }}} END BPS TAGGED BLOCK
+# END BPS TAGGED BLOCK }}}
+
 =head1 NAME
 
 RT::I18N - a base class for localization of RT
@@ -98,9 +99,11 @@ ok(RT::I18N->Init);
 =cut
 
 sub Init {
+    require File::Glob;
+
     # Load language-specific functions
-    foreach my $language ( glob(substr(__FILE__, 0, -3) . "/*.pm")) {
-        if ($language =~ /^([-\w.\/\\~:]+)$/) {
+    foreach my $language ( File::Glob::bsd_glob(substr(__FILE__, 0, -3) . "/*.pm")) {
+        if ($language =~ /^([-\w\s.\/\\~:]+)$/) {
             require $1;
         }
         else {
@@ -117,6 +120,7 @@ sub Init {
            $_  => [
                Gettext => (substr(__FILE__, 0, -3) . "/$_.po"),
                Gettext => "$RT::LocalLexiconPath/*/$_.po",
+               Gettext => "$RT::LocalLexiconPath/$_.po",
            ],
        } @lang
     });
@@ -219,7 +223,7 @@ sub SetMIMEEntityToEncoding {
 
        # {{{ Convert the body
        eval {
-           $RT::Logger->debug("Converting '$charset' to '$enc' for ". $head->mime_type . " - ". $head->get('subject'));
+           $RT::Logger->debug("Converting '$charset' to '$enc' for ". $head->mime_type . " - ". ($head->get('subject') || 'Subjectless message'));
 
            # NOTE:: see the comments at the end of the sub.
            Encode::_utf8_off( $lines[$_] ) foreach ( 0 .. $#lines );
@@ -285,11 +289,13 @@ sub DecodeMIMEWordsToEncoding {
     my $str = shift;
     my $enc = shift;
 
-   
-    @_ = $str =~ m/([^=]*)=\?([^?]+)\?([QqBb])\?([^?]+)\?=([^=]*)/g;
-
+    @_ = $str =~ m/(.*?)=\?([^?]+)\?([QqBb])\?([^?]+)\?=([^=]*)/gc;
     return ($str) unless (@_);
 
+    # add everything that hasn't matched to the end of the latest
+    # string in array this happen when we have 'key="=?encoded?="; key="plain"'
+    $_[-1] .= substr($str, pos $str);
+
     $str = "";
     while (@_) {
        my ($prefix, $charset, $encoding, $enc_str, $trailing) =
@@ -318,6 +324,20 @@ sub DecodeMIMEWordsToEncoding {
            }
        }
 
+        # XXX TODO: RT doesn't currently do the right thing with mime-encoded headers
+        # We _should_ be preserving them encoded until after parsing is completed and
+        # THEN undo the mime-encoding.
+        #
+        # This routine should be translating the existing mimeencoding to utf8 but leaving
+        # things encoded.
+        #
+        # It's legal for headers to contain mime-encoded commas and semicolons which
+        # should not be treated as address separators. (Encoding == quoting here)
+        #
+        # until this is fixed, we must escape any string containing a comma or semicolon
+        # this is only a bandaid
+
+        $enc_str = qq{"$enc_str"} if ($enc_str =~ /[,;]/);                                     
        $str .= $prefix . $enc_str . $trailing;
     }
 
@@ -357,7 +377,6 @@ sub _FindOrGuessCharset {
 
 # }}}
 
-
 # {{{ _GuessCharset
 
 =head2 _GuessCharset STRING
@@ -423,6 +442,7 @@ sub SetMIMEHeadToEncoding {
     return if $charset eq $enc and $preserve_words;
 
     foreach my $tag ( $head->tags ) {
+        next unless $tag; # seen in wild: headers with no name
         my @values = $head->get_all($tag);
         $head->delete($tag);
         foreach my $value (@values) {