Skip to content

Commit

Permalink
[#973 state:resolved] Integrated bug fixes and other changes containe…
Browse files Browse the repository at this point in the history
…d in Movable Type 4.37.
  • Loading branch information
jayallen committed Jul 11, 2011
1 parent 513ad23 commit 861b9a2
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 33 deletions.
11 changes: 11 additions & 0 deletions lib/MT/Atom.pm
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,17 @@ package MT::Atom::Entry;
use MT::I18N qw( encode_text );
use base qw( XML::Atom::Entry );

my $ns_prefix;

sub new {
my $class = shift;
my (%param) = @_;
$ns_prefix = delete $param{_prefix} if $param{_prefix};
$class->SUPER::new(@_);
}

sub element_name { $ns_prefix ? $ns_prefix . ":entry" : 'entry' }

sub _create_issued {
my ( $ts, $blog ) = @_;
my @co_list = unpack 'A4A2A2A2A2A2', $ts;
Expand Down
65 changes: 47 additions & 18 deletions lib/MT/AtomServer.pm
Original file line number Diff line number Diff line change
Expand Up @@ -228,12 +228,26 @@ sub xml_body {
my $app = shift;
unless ( exists $app->{xml_body} ) {
if (LIBXML) {
my $parser = XML::LibXML->new;
$app->{xml_body} = $parser->parse_string( $app->request_content );
my $parser = MT::Util->libxml_parser;
eval {
$app->{xml_body}
= $parser->parse_string( $app->request_content );
};
if ($@) {
die "Error Parsing XML Input $@ ";
}
}
else {
my $xp = XML::XPath->new( xml => $app->request_content );
$app->{xml_body} = ( $xp->find('/')->get_nodelist )[0];
my $parser = MT::Util->expat_parser;
my $xp;
eval {
$xp = XML::XPath->new( xml => $app->request_content,
parser => $parser );
$app->{xml_body} = ( $xp->find('/')->get_nodelist )[0];
};
if ($@) {
die "Error Parsing XML Input $@ ";
}
}
}
$app->{xml_body};
Expand All @@ -242,14 +256,26 @@ sub xml_body {
sub atom_body {
my $app = shift;
my $atom;
my $xml = $app->xml_body;
if ( $app->{is_soap} ) {
my $xml = $app->xml_body;
$atom = MT::Atom::Entry->new( Elem => first( $xml, NS_SOAP, 'Body' ) )
or return $app->error( 500, MT::Atom::Entry->errstr );
$atom = MT::Atom::Entry->new(
Elem => first( $xml, NS_SOAP, 'Body' ),
_prefix => $xml->getFirstChild->getPrefix
) or return $app->error( 500, MT::Atom::Entry->errstr );
}
else {
$atom = MT::Atom::Entry->new( Stream => \$app->request_content )
or return $app->error( 500, MT::Atom::Entry->errstr );
my $parser;
if (LIBXML) {
$parser = MT::Util->libxml_parser;
}
else {
$parser = MT::Util->expat_parser;
}
$atom = MT::Atom::Entry->new(
Stream => \$app->request_content,
Parser => $parser,
_prefix => $xml->getFirstChild->getPrefix
) or return $app->error( 500, MT::Atom::Entry->errstr );
}
$atom;
}
Expand Down Expand Up @@ -329,6 +355,11 @@ sub atom_x_content_type {'application/atom+xml'}
sub edit_link_rel {'edit'}
sub get_posts_order_field {'modified_on'}

sub init_app {
$XML::Atom::ForceUnicode = 1;
$XML::Atom::DefaultVersion = 1.0;
}

sub new_feed {
my $app = shift;
XML::Atom::Feed->new( Version => 1.0 );
Expand Down Expand Up @@ -575,17 +606,15 @@ sub new_post {
my $body
= encode_text( MT::I18N::utf8_off( $content->body ), 'utf-8', $enc );
my $asset;
if ( $type && $type !~ m!^application/.*xml$! ) {
if ( $type !~ m!^text/! ) {
if ( $type && $type eq 'text/plain' ) {
## Check for LifeBlog Note & SMS records.
my $format = $atom->get( NS_DC, 'format' );
if ( $format && ( $format eq 'Note' || $format eq 'SMS' ) ) {
$asset = $app->_upload_to_asset or return;
}
elsif ( $type && $type eq 'text/plain' ) {
## Check for LifeBlog Note & SMS records.
my $format = $atom->get( NS_DC, 'format' );
if ( $format && ( $format eq 'Note' || $format eq 'SMS' ) ) {
$asset = $app->_upload_to_asset or return;
}
}
}
elsif ( $type && $type !~ m!^(application/.*xml|text/.*|html)$! ) {
$asset = $app->_upload_to_asset or return;
}
if ( $atom->get( NS_TYPEPAD, 'standalone' ) && $asset ) {
$app->response_code(201);
Expand Down
14 changes: 8 additions & 6 deletions lib/MT/Auth/OpenID.pm
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
package MT::Auth::OpenID;
use strict;

use MT::Util qw( decode_url is_valid_email escape_unicode ts2epoch );
use MT::Util
qw( decode_url is_valid_email escape_unicode ts2epoch expat_parser );
use MT::I18N qw( encode_text );

sub NS_OPENID_AX {"http://openid.net/srv/ax/1.0"}
Expand Down Expand Up @@ -296,7 +297,7 @@ sub _get_nickname {
my $name;

require XML::XPath;
my $xml = XML::XPath->new( xml => $foaf );
my $xml = XML::XPath->new( xml => $foaf, parser => expat_parser(), );
$xml->set_namespace( 'RDF',
'http://www.w3.org/1999/02/22-rdf-syntax-ns#' );
$xml->set_namespace( 'FOAF', 'http://xmlns.com/foaf/0.1/' );
Expand All @@ -319,7 +320,9 @@ sub _get_nickname {
my $name;

require XML::XPath;
my $xml = XML::XPath->new( xml => $resp->content );
my $xml =
XML::XPath->new( xml => $resp->content,
parser => expat_parser() );
if ( my ($name_el) = $xml->findnodes('/feed/author/name') ) {
$name = $name_el->string_value;
}
Expand Down Expand Up @@ -419,9 +422,8 @@ sub _asset_from_url {
unlink $local;
return undef;
}

my $has_html = eval { MT::Image->has_html_signature( path => $local ) };
if ( $has_html || $@ ) {

if ( MT::Image->has_html_signature( path => $local ) ) {
unlink $local;
return undef;
}
Expand Down
2 changes: 1 addition & 1 deletion lib/MT/Object.pm
Original file line number Diff line number Diff line change
Expand Up @@ -729,8 +729,8 @@ sub meta {
sub summary {
my $obj = shift;
my ( $terms, $value ) = @_;
$obj->{__summary}->set_primary_keys($obj);
return undef if ( !$obj->{__summary} );
$obj->{__summary}->set_primary_keys($obj);
return $obj->{__summary}->set( $terms, $value ) if ( scalar @_ == 2 );
return $obj->{__summary}->get($terms);
}
Expand Down
53 changes: 45 additions & 8 deletions lib/MT/Util.pm
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ our @EXPORT_OK
start_background_task launch_background_tasks substr_wref
extract_urls extract_domain extract_domains is_valid_date
epoch2ts ts2epoch escape_unicode unescape_unicode
sax_parser trim ltrim rtrim asset_cleanup caturl multi_iter
weaken log_time make_string_csv sanitize_embed
sax_parser expat_parser libxml_parser trim ltrim rtrim asset_cleanup
caturl multi_iter weaken log_time make_string_csv sanitize_embed
browser_language encode_json );

# NOTE: The following are not made available for export (for some reason):
Expand Down Expand Up @@ -2308,11 +2308,18 @@ sub unescape_unicode {
sub init_sax {
require XML::SAX;
if ( @{ XML::SAX->parsers } == 1 ) {
map {
eval { XML::SAX->add_parser($_) }
} qw( XML::SAX::Expat XML::LibXML::SAX::Parser
XML::LibXML::SAX
XML::SAX::ExpatXS );
my @parsers = (
'XML::SAX::ExpatXS 1.30',
'XML::LibXML::SAX 1.70',
'XML::SAX::Expat 0.37',
);
for my $parser (@parsers) {
eval "use $parser";
next if $@;
my ($module) = split /\s+/, $parser;
XML::SAX->add_parser($module);
last;
}
}
$initialized_sax = 1;
}
Expand All @@ -2321,10 +2328,34 @@ sub unescape_unicode {
init_sax() unless $initialized_sax;
require XML::SAX::ParserFactory;
my $f = XML::SAX::ParserFactory->new;
$f->parser();
$f->parser( LexicalHandler => 'MT::Util::XML::SAX::LexicalHandler', );
}
}

sub expat_parser {
my $parser = XML::Parser->new(
Handlers => {
ExternEnt => sub {
die "External entities disabled.";
'';
},
ExternEntFin => sub { },
},
);
return $parser;
}

sub libxml_parser {
return
XML::LibXML->new(
no_network => 1,
expand_xinclude => 0,
expand_entities => 1,
load_ext_dtd => 0,
ext_ent_handler => sub { die "External entities disabled."; '' },
);
}

sub multi_iter {
my ( $iters, $picker ) = @_;
my @streams;
Expand Down Expand Up @@ -2778,6 +2809,12 @@ sub match_file_extension {
} ## end sub match_file_extension


package MT::Util::XML::SAX::LexicalHandler;

sub start_dtd {
die "DOCTYPE declaration is not allowed.";
}

1;

__END__
Expand Down

0 comments on commit 861b9a2

Please sign in to comment.