X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=rt%2Flib%2FRT%2FUtil.pm;h=bd3a22803c736cc4321f42dbf6c880b46086b47d;hp=03d27a39ec00cc69cbcf07612130f661281adc2f;hb=919e930aa9279b3c5cd12b593889cd6de79d67bf;hpb=624b2d44625f69d71175c3348cae635d580c890b diff --git a/rt/lib/RT/Util.pm b/rt/lib/RT/Util.pm index 03d27a39e..bd3a22803 100644 --- a/rt/lib/RT/Util.pm +++ b/rt/lib/RT/Util.pm @@ -1,40 +1,40 @@ # BEGIN BPS TAGGED BLOCK {{{ -# +# # COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# -# +# +# This software is Copyright (c) 1996-2015 Best Practical Solutions, LLC +# +# # (Except where explicitly superseded by other copyright notices) -# -# +# +# # LICENSE: -# +# # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have # been provided with this software, but in any event can be snarfed # from www.gnu.org. -# +# # This work is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 or visit their web page on the internet at # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# +# +# # CONTRIBUTION SUBMISSION POLICY: -# +# # (The following paragraph is not intended to limit the rights granted # to you to modify and distribute this software under the terms of # the GNU General Public License and is only of importance to you if # you choose to contribute your changes and enhancements to the # community by submitting them to Best Practical Solutions, LLC.) -# +# # By intentionally submitting any modifications, corrections or # derivatives to this work, or any other work intended for use with # Request Tracker, to Best Practical Solutions, LLC, you confirm that @@ -43,15 +43,16 @@ # royalty-free, perpetual, license to use, copy, create derivative # works based on those contributions, and sublicense and distribute # those contributions and any derivatives thereof. -# +# # END BPS TAGGED BLOCK }}} package RT::Util; use strict; use warnings; + use base 'Exporter'; -our @EXPORT = qw/safe_run_child/; +our @EXPORT = qw/safe_run_child mime_recommended_filename/; sub safe_run_child (&) { my $our_pid = $$; @@ -64,62 +65,91 @@ sub safe_run_child (&) { # values. Instead we set values, eval code, check pid # on failure and reset values only in our original # process + my ($oldv_dbh, $oldv_rth); my $dbh = $RT::Handle->dbh; + $oldv_dbh = $dbh->{'InactiveDestroy'} if $dbh; $dbh->{'InactiveDestroy'} = 1 if $dbh; + $oldv_rth = $RT::Handle->{'DisconnectHandleOnDestroy'}; $RT::Handle->{'DisconnectHandleOnDestroy'} = 0; + my ($reader, $writer); + pipe( $reader, $writer ); + my @res; my $want = wantarray; eval { + my $code = shift; + local @ENV{ 'LANG', 'LC_ALL' } = ( 'C', 'C' ); unless ( defined $want ) { - _safe_run_child( @_ ); + $code->(); } elsif ( $want ) { - @res = _safe_run_child( @_ ); + @res = $code->(); } else { - @res = ( scalar _safe_run_child( @_ ) ); + @res = ( scalar $code->() ); } + exit 0 if $our_pid != $$; 1; } or do { + my $err = $@; + $err =~ s/^Stack:.*$//ms; if ( $our_pid == $$ ) { - $dbh->{'InactiveDestroy'} = 0 if $dbh; - $RT::Handle->{'DisconnectHandleOnDestroy'} = 1; + $dbh->{'InactiveDestroy'} = $oldv_dbh if $dbh; + $RT::Handle->{'DisconnectHandleOnDestroy'} = $oldv_rth; + die "System Error: $err"; + } else { + print $writer "System Error: $err"; + exit 1; } - die $@; }; + + close($writer); + $reader->blocking(0); + my ($response) = $reader->getline; + warn $response if $response; + + $dbh->{'InactiveDestroy'} = $oldv_dbh if $dbh; + $RT::Handle->{'DisconnectHandleOnDestroy'} = $oldv_rth; return $want? (@res) : $res[0]; } -sub _safe_run_child { - local @ENV{ 'LANG', 'LC_ALL' } = ( 'C', 'C' ); +=head2 mime_recommended_filename( MIME::Head|MIME::Entity ) - return shift->() if $ENV{'MOD_PERL'} || $CGI::SpeedyCGI::i_am_speedy; +# mimic our own recommended_filename +# since MIME-tools 5.501, head->recommended_filename requires the head are +# mime encoded, we don't meet this yet. - # We need to reopen stdout temporarily, because in FCGI - # environment, stdout is tied to FCGI::Stream, and the child - # of the run3 wouldn't be able to reopen STDOUT properly. - my $stdin = IO::Handle->new; - $stdin->fdopen( 0, 'r' ); - local *STDIN = $stdin; +=cut + +sub mime_recommended_filename { + my $head = shift; + $head = $head->head if $head->isa('MIME::Entity'); + + for my $attr_name (qw( content-disposition.filename content-type.name )) { + my $value = Encode::decode("UTF-8",$head->mime_attr($attr_name)); + if ( defined $value && $value =~ /\S/ ) { + return $value; + } + } + return; +} - my $stdout = IO::Handle->new; - $stdout->fdopen( 1, 'w' ); - local *STDOUT = $stdout; +sub assert_bytes { + my $string = shift; + return unless utf8::is_utf8($string); + return unless $string =~ /([^\x00-\x7F])/; - my $stderr = IO::Handle->new; - $stderr->fdopen( 2, 'w' ); - local *STDERR = $stderr; + my $msg; + if (ord($1) > 255) { + $msg = "Expecting a byte string, but was passed characters"; + } else { + $msg = "Expecting a byte string, but was possibly passed charcters;" + ." if the string is actually bytes, please use utf8::downgrade"; + } + $RT::Logger->warn($msg, Carp::longmess()); - return shift->(); } -eval "require RT::Util_Vendor"; -if ($@ && $@ !~ qr{^Can't locate RT/Util_Vendor.pm}) { - die $@; -}; -eval "require RT::Util_Local"; -if ($@ && $@ !~ qr{^Can't locate RT/Util_Local.pm}) { - die $@; -}; +RT::Base->_ImportOverlays(); 1;