Patch by mark. 

diffs (471 lines):

diff -r cbef12206273 -r b5bf8561aab5 bin/upgrading/en.dat
--- a/bin/upgrading/en.dat      Mon Aug 31 09:03:41 2009 +0000
+++ b/bin/upgrading/en.dat      Mon Aug 31 21:27:13 2009 +0000
@@ -4188,6 +4188,8 @@ widget.importchoosesource.password=Passw
 
 widget.importchoosesource.service=Choose a service to import from:
 
+widget.importchoosesource.usejournal=Community on other service
+
 widget.importchoosesource.username=Username on other service
 
 widget.importchoosesource.warning=Warning: You have another import currently 
in progress. Setting up a new import will abort your current import!
@@ -4203,6 +4205,8 @@ widget.importconfirm.items=<strong>Data 
 widget.importconfirm.items=<strong>Data that you are importing:</strong><br 
/>[[items]]
 
 widget.importconfirm.source=<strong>Importing from:</strong><br />[[user]] at 
[[host]]
+
+widget.importconfirm.source.comm=<strong>Importing from:</strong><br 
/>[[comm]] (authenticated as [[user]]) at [[host]]
 
 widget.importconfirm.warning=Warning: Once confirmed, you cannot stop or 
reverse an import!
 
diff -r cbef12206273 -r b5bf8561aab5 bin/upgrading/update-db-general.pl
--- a/bin/upgrading/update-db-general.pl        Mon Aug 31 09:03:41 2009 +0000
+++ b/bin/upgrading/update-db-general.pl        Mon Aug 31 21:27:13 2009 +0000
@@ -2972,6 +2972,7 @@ CREATE TABLE import_data (
     import_data_id INT UNSIGNED NOT NULL,
     hostname VARCHAR(255),
     username VARCHAR(255),
+    usejournal VARCHAR(255),
     password_md5 VARCHAR(255),
     groupmap BLOB,
 
@@ -3940,6 +3941,11 @@ register_alter(sub {
         set_dbnote( "userprop_ljcut_to_cut", 1 );
     }
 
+    unless ( column_type( 'import_data', 'usejournal' ) ) {
+        do_alter( 'import_data',
+                  q{ALTER TABLE import_data ADD COLUMN usejournal VARCHAR(255) 
AFTER username} );
+    }
+
 });
 
 
diff -r cbef12206273 -r b5bf8561aab5 cgi-bin/DW/Logic/Importer.pm
--- a/cgi-bin/DW/Logic/Importer.pm      Mon Aug 31 09:03:41 2009 +0000
+++ b/cgi-bin/DW/Logic/Importer.pm      Mon Aug 31 21:27:13 2009 +0000
@@ -29,7 +29,7 @@ sub get_import_data_for_user {
     # load up their most recent (active) import
     # FIXME: memcache this
     my $imports = $dbh->selectall_arrayref(
-        'SELECT import_data_id, hostname, username, password_md5 FROM 
import_data WHERE userid = ? ' .
+        'SELECT import_data_id, hostname, username, usejournal, password_md5 
FROM import_data WHERE userid = ? ' .
         'ORDER BY import_data_id DESC LIMIT 1',
         undef, $u->id
     );
@@ -47,8 +47,8 @@ sub get_import_items_for_user {
 
     my $has_items = 0;
     foreach my $import ( @$imports ) {
-        my ( $importid, $host, $username, $password ) = @$import;
-        $items{$importid} = { host => $host, user => $username, pw => 
$password, items => {} };
+        my ( $importid, $host, $username, $usejournal, $password ) = @$import;
+        $items{$importid} = { host => $host, user => $username, pw => 
$password, usejournal => $usejournal, items => {} };
 
         my $import_items = $dbh->selectall_arrayref(
             'SELECT item, status, created, last_touch FROM import_items WHERE 
userid = ? AND import_data_id = ?',
@@ -72,6 +72,7 @@ sub set_import_data_for_user {
     my $hn = $opts{hostname};
     my $un = $opts{username};
     my $pw = $opts{password};
+    my $uj = $opts{usejournal};
 
     return "Did not pass hostname, username, and password."
         unless $hn && $un && $pw;
@@ -81,8 +82,8 @@ sub set_import_data_for_user {
 
     my $id = LJ::alloc_user_counter( $u, "I" ) or return "Can't get id for 
import data.";
     $dbh->do(
-        "INSERT INTO import_data (userid, import_data_id, hostname, username, 
password_md5) VALUES (?, ?, ?, ?, ?)",
-        undef, $u->id, $id, $hn, $un, md5_hex( $pw )
+        "INSERT INTO import_data (userid, import_data_id, hostname, username, 
usejournal, password_md5) VALUES (?, ?, ?, ?, ?, ?)",
+        undef, $u->id, $id, $hn, $un, $uj, md5_hex( $pw )
     );
     return $dbh->errstr if $dbh->err;
 
diff -r cbef12206273 -r b5bf8561aab5 cgi-bin/DW/Worker/ContentImporter.pm
--- a/cgi-bin/DW/Worker/ContentImporter.pm      Mon Aug 31 09:03:41 2009 +0000
+++ b/cgi-bin/DW/Worker/ContentImporter.pm      Mon Aug 31 21:27:13 2009 +0000
@@ -96,7 +96,7 @@ sub import_data {
 
     my $dbh = LJ::get_db_writer()
         or croak 'unable to get global database master';
-    my $hr = $dbh->selectrow_hashref( 'SELECT userid, hostname, username, 
password_md5, import_data_id ' .
+    my $hr = $dbh->selectrow_hashref( 'SELECT userid, hostname, username, 
usejournal, password_md5, import_data_id ' .
                                       'FROM import_data WHERE userid = ? AND 
import_data_id = ?', undef, $userid, $impid );
     croak $dbh->errstr if $dbh->err;
 
diff -r cbef12206273 -r b5bf8561aab5 
cgi-bin/DW/Worker/ContentImporter/LiveJournal.pm
--- a/cgi-bin/DW/Worker/ContentImporter/LiveJournal.pm  Mon Aug 31 09:03:41 
2009 +0000
+++ b/cgi-bin/DW/Worker/ContentImporter/LiveJournal.pm  Mon Aug 31 21:27:13 
2009 +0000
@@ -372,11 +372,16 @@ sub call_xmlrpc {
 
     my $response = md5_hex( $chal . ( $opts->{md5password} || 
$opts->{password_md5} || md5_hex( $opts->{password} ) ) );
 
+    # we have to do this like this so that we don't send the argument if it's 
not valid
+    my %usejournal;
+    $usejournal{usejournal} = $opts->{usejournal} if $opts->{usejournal};
+
     my $res = $class->xmlrpc_call_helper( $opts, $xmlrpc, "LJ.XMLRPC.$mode", {
         username       => $opts->{user} || $opts->{username},
         auth_method    => 'challenge',
         auth_challenge => $chal,
         auth_response  => $response,
+        %usejournal,
         %{ $hash || {} },
     }, $mode, $hash, $depth );
 
diff -r cbef12206273 -r b5bf8561aab5 
cgi-bin/DW/Worker/ContentImporter/LiveJournal/Bio.pm
--- a/cgi-bin/DW/Worker/ContentImporter/LiveJournal/Bio.pm      Mon Aug 31 
09:03:41 2009 +0000
+++ b/cgi-bin/DW/Worker/ContentImporter/LiveJournal/Bio.pm      Mon Aug 31 
21:27:13 2009 +0000
@@ -61,7 +61,8 @@ sub try_work {
 # FIXME: have to flip this back to using the user_path value instead of 
hardcoded
 # livejournal.com ... this should probably be part of the import_data 
structure?
 # abstract out sites?
-    my ( $items, $interests, $schools ) = $class->get_foaf_from( 
"http://$data->{username}.$data->{hostname}/data/foaf" );
+    my $un = $data->{usejournal} || $data->{username};
+    my ( $items, $interests, $schools ) = $class->get_foaf_from( 
"http://$un.$data->{hostname}/data/foaf" );
     return $temp_fail->( 'Unable to load FOAF data' )
         unless $items;
 
diff -r cbef12206273 -r b5bf8561aab5 
cgi-bin/DW/Worker/ContentImporter/LiveJournal/Comments.pm
--- a/cgi-bin/DW/Worker/ContentImporter/LiveJournal/Comments.pm Mon Aug 31 
09:03:41 2009 +0000
+++ b/cgi-bin/DW/Worker/ContentImporter/LiveJournal/Comments.pm Mon Aug 31 
21:27:13 2009 +0000
@@ -113,13 +113,15 @@ sub try_work {
         $turl =~ s/-/_/g; # makes \b work below
         $log->( 'Filtering entry URL: %s', $turl );
         next unless $turl =~ /\Q$data->{hostname}\E/ &&
-                    $turl =~ /\b$data->{username}\b/;
+                    ( $turl =~ /\b$data->{username}\b/ ||
+                        ( $data->{usejournal} && $turl =~ 
/\b$data->{usejournal}\b/ ) );
 
         my $jitemid = $1 >> 8
             if $url =~ m!/(\d+)\.html$!;
         $jitemid_map->{$jitemid} = $entry_map->{$url};
         $entry_source->{$jitemid_map->{$jitemid}} = $url;
     }
+    $log->( 'Entry map has %d entries post-prune.', scalar( keys %$entry_map ) 
);
 
     foreach my $jitemid ( keys %$xpost_map ) {
         $jitemid_map->{$jitemid} = $xpost_map->{$jitemid};
@@ -138,7 +140,8 @@ sub try_work {
         $turl =~ s/-/_/g; # makes \b work below
         $log->( 'Filtering comment URL: %s', $turl );
         next unless $turl =~ /\Q$data->{hostname}\E/ &&
-                    $turl =~ /\b$data->{username}\b/;
+                    ( $turl =~ /\b$data->{username}\b/ ||
+                        ( $data->{usejournal} && $turl =~ 
/\b$data->{usejournal}\b/ ) );
 
         my $jtalkid = $1 >> 8
             if $url =~ m!thread=(\d+)$!;
@@ -443,7 +446,8 @@ sub do_authed_comment_fetch {
 
     # hit up the server with the specified information and return the raw 
content
     my $ua = LWP::UserAgent->new;
-    my $request = HTTP::Request->new( GET => 
"http://www.$data->{hostname}/export_comments.bml?get=$mode&startid=$startid&numitems=$numitems"
 );
+    my $authas = $data->{usejournal} ? "&authas=$data->{usejournal}" : '';
+    my $request = HTTP::Request->new( GET => 
"http://www.$data->{hostname}/export_comments.bml?get=$mode&startid=$startid&numitems=$numitems$authas"
 );
     $request->push_header( Cookie => "ljsession=$data->{_session}" );
 
     # try to get the response
diff -r cbef12206273 -r b5bf8561aab5 
cgi-bin/DW/Worker/ContentImporter/LiveJournal/Entries.pm
--- a/cgi-bin/DW/Worker/ContentImporter/LiveJournal/Entries.pm  Mon Aug 31 
09:03:41 2009 +0000
+++ b/cgi-bin/DW/Worker/ContentImporter/LiveJournal/Entries.pm  Mon Aug 31 
21:27:13 2009 +0000
@@ -46,9 +46,9 @@ sub try_work {
     my ( $class, $job, $opts, $data ) = @_;
     my $begin_time = [ gettimeofday() ];
 
-    # we know that we can potentially take a while, so budget a few hours for
+    # we know that we can potentially take a while, so budget an hour for
     # the import job before someone else comes in to snag it
-    $job->grabbed_until( time() + 3600*12 );
+    $job->grabbed_until( time() + 3600 );
     $job->save;
 
     # failure wrappers for convenience
@@ -177,6 +177,9 @@ sub try_work {
         return $sync{$id}->[1] if @{$sync{$id} || []};
     };
 
+    # helper so we don't have to get so much FOAF data
+    my %user_map;
+
     # now get the actual events
     while ( scalar( keys %sync ) > 0 ) {
         my ( $count, $last_itemid ) = ( 0, undef );
@@ -210,13 +213,34 @@ sub try_work {
                 $newmask = 0;
                 push @item_errors, "Could not determine groups to post to.";
             }
-
             $evt->{allowmask} = $newmask;
 
-            my $event = $evt->{event};
+            # now try to determine if we need to post this as a user
+            my $posteru;
+            if ( $evt->{poster} && $evt->{poster} ne $data->{username} ) {
+                my $posterid = exists $user_map{$evt->{poster}} ? 
$user_map{$evt->{poster}} :
+                    
DW::Worker::ContentImporter::LiveJournal->remap_username_friend( $data, 
$evt->{poster} );
+
+                unless ( $posterid ) {
+                    # set it to 0, but exists, so we don't hit LJ again, but 
we continue to fail this poster
+                    $user_map{$evt->{poster}} = 0;
+
+                    # FIXME: need a better way of totally dying...
+                    push @item_errors, "Unable to map poster from LJ user 
'$evt->{poster}' to local user.";
+                    $status->(
+                        remote_url => $evt->{url},
+                        errors     => \...@item_errors,
+                    );
+                    return;
+                }
+
+                $user_map{$evt->{poster}} ||= $posterid;
+                $posteru = LJ::load_userid( $posterid );
+            }
 
             # we just link polls to the original site
 # FIXME: this URL should be from some method and not manually constructed
+            my $event = $evt->{event};
             $event =~ s!<.+?-poll-(\d+?)>![<a 
href="http://www.$data->{hostname}/poll/?id=$1">Poll #$1</a>]!g;
 
             if ( $event =~ m/<.+?-embed-.+?>/ ) {
@@ -235,7 +259,7 @@ sub try_work {
 
             # actually post it
             my ( $ok, $res ) =
-                DW::Worker::ContentImporter::Local::Entries->post_event( 
$data, $entry_map, $u, $evt, \...@item_errors );
+                DW::Worker::ContentImporter::Local::Entries->post_event( 
$data, $entry_map, $u, $posteru, $evt, \...@item_errors );
 
             # now record any errors that happened
             $status->(
diff -r cbef12206273 -r b5bf8561aab5 
cgi-bin/DW/Worker/ContentImporter/LiveJournal/Friends.pm
--- a/cgi-bin/DW/Worker/ContentImporter/LiveJournal/Friends.pm  Mon Aug 31 
09:03:41 2009 +0000
+++ b/cgi-bin/DW/Worker/ContentImporter/LiveJournal/Friends.pm  Mon Aug 31 
21:27:13 2009 +0000
@@ -45,6 +45,10 @@ sub try_work {
     my $ok        = sub { return $class->ok( $data, 'lj_friends', $job ); };
     my $temp_fail = sub { return $class->temp_fail( $data, 'lj_friends', $job, 
@_ ); };
 
+    # if this is a usejournal request, we have no friends (it's a comm or 
something) so
+    # bail very early
+    return $ok->() if $data->{usejournal};
+
     # setup
     my $u = LJ::load_userid( $data->{userid} )
         or return $fail->( 'Unable to load target with id %d.', 
$data->{userid} );
diff -r cbef12206273 -r b5bf8561aab5 
cgi-bin/DW/Worker/ContentImporter/LiveJournal/Userpics.pm
--- a/cgi-bin/DW/Worker/ContentImporter/LiveJournal/Userpics.pm Mon Aug 31 
09:03:41 2009 +0000
+++ b/cgi-bin/DW/Worker/ContentImporter/LiveJournal/Userpics.pm Mon Aug 31 
21:27:13 2009 +0000
@@ -83,7 +83,8 @@ sub try_work {
     $0 = sprintf( 'content-importer [userpics: %s(%d)]', $u->user, $u->id );
 
 # FIXME: URL may not be accurate here for all sites
-    my ( $default, @pics ) = $class->get_lj_userpic_data( 
"http://$data->{hostname}/users/$data->{username}/", $data, $log );
+    my $un = $data->{usejournal} || $data->{username};
+    my ( $default, @pics ) = $class->get_lj_userpic_data( 
"http://$data->{hostname}/users/$un/", $data, $log );
 
     my $errs = [];
     my @imported = 
DW::Worker::ContentImporter::Local::Userpics->import_userpics( $u, $errs, 
$default, \...@pics, $log );
diff -r cbef12206273 -r b5bf8561aab5 
cgi-bin/DW/Worker/ContentImporter/Local/Entries.pm
--- a/cgi-bin/DW/Worker/ContentImporter/Local/Entries.pm        Mon Aug 31 
09:03:41 2009 +0000
+++ b/cgi-bin/DW/Worker/ContentImporter/Local/Entries.pm        Mon Aug 31 
21:27:13 2009 +0000
@@ -86,7 +86,7 @@ Returns (1, $res) on success, (undef, $r
 =cut
 
 sub post_event {
-    my ( $class, $data, $map, $u, $evt, $errors ) = @_;
+    my ( $class, $data, $map, $u, $posteru, $evt, $errors ) = @_;
 
     return if $map->{$evt->{key}};
 
@@ -115,6 +115,7 @@ sub post_event {
         current_coords => 1,
         personifi_word_count => 1,
         personifi_lang => 1,
+        personifi_tags => 1,
     );
     foreach my $prop ( keys %$props ) {
         next if $bad_props{$prop};
@@ -134,17 +135,16 @@ sub post_event {
     LJ::do_request(
         {
             mode => 'postevent',
-            user => $u->user,
+            user => $posteru ? $posteru->user : $u->user,
+            usejournal => $posteru ? $u->user : undef,
             ver  => $LJ::PROTOCOL_VER,
             %proto,
         },
         \%res,
         {
-            u => $u,
-            noauth => 1,
-            nonotify => 1,
-            ignore_tags_max => 1,
-            allow_inactive => 1,
+            u => $posteru || $u,
+            u_owner => $u,
+            importer_bypass => 1,
         }
     );
 
diff -r cbef12206273 -r b5bf8561aab5 cgi-bin/LJ/Widget/ImportChooseSource.pm
--- a/cgi-bin/LJ/Widget/ImportChooseSource.pm   Mon Aug 31 09:03:41 2009 +0000
+++ b/cgi-bin/LJ/Widget/ImportChooseSource.pm   Mon Aug 31 21:27:13 2009 +0000
@@ -85,6 +85,12 @@ sub render_body {
     $ret .= "<label for='password'>" . $class->ml( 
'widget.importchoosesource.password' ) . "</label>";
     $ret .= $class->html_text( type => 'password', name => 'password' );
     $ret .= "</div>";
+    if ( $LJ::ALLOW_COMM_IMPORT{$u->user} ) {
+        $ret .= "<div class='i-usejournal'>";
+        $ret .= "<label for='usejournal'>" . $class->ml( 
'widget.importchoosesource.usejournal' ) . "</label>";
+        $ret .= $class->html_text( name => 'usejournal', maxlength => 255 );
+        $ret .= "</div>";
+    }
     $ret .= "</div>";
 
     $ret .= $class->html_submit( submit => $class->ml( 
'widget.importchoosesource.btn.continue' ) );
@@ -107,11 +113,18 @@ sub handle_post {
     my $un = LJ::trim( lc $post->{username} );
     $un =~ s/-/_/g;
 
+    # be sure to sanitize the usejournal
+    my $uj = undef;
+    if ( $LJ::ALLOW_COMM_IMPORT{$u->user} ) {
+        $uj = LJ::trim( lc $post->{usejournal} );
+        $uj =~ s/-/_/g;
+    }
+
     my $pw = $post->{password};
     return ( ret => $class->ml( 
'widget.importchoosesource.error.nocredentials' ) )
         unless $un && $pw;
 
-    if ( my $error = DW::Logic::Importer->set_import_data_for_user( $u, 
hostname => $hn, username => $un, password => $pw ) ) {
+    if ( my $error = DW::Logic::Importer->set_import_data_for_user( $u, 
hostname => $hn, username => $un, password => $pw, usejournal => $uj ) ) {
         return ( ret => $error );
     }
 
diff -r cbef12206273 -r b5bf8561aab5 cgi-bin/LJ/Widget/ImportConfirm.pm
--- a/cgi-bin/LJ/Widget/ImportConfirm.pm        Mon Aug 31 09:03:41 2009 +0000
+++ b/cgi-bin/LJ/Widget/ImportConfirm.pm        Mon Aug 31 21:27:13 2009 +0000
@@ -45,7 +45,11 @@ sub render_body {
     $ret .= "<p>" . $class->ml( 'widget.importconfirm.intro' ) . "</p>";
 
     my $imports = DW::Logic::Importer->get_import_data_for_user( $u );
-    $ret .= "<p>" . $class->ml( 'widget.importconfirm.source', { user => 
$imports->[0]->[2], host => $imports->[0]->[1] } ) . "</p>";
+    if ( $imports->[0]->[3] ) {
+        $ret .= "<p>" . $class->ml( 'widget.importconfirm.source.comm', { user 
=> $imports->[0]->[2], host => $imports->[0]->[1], comm => $imports->[0]->[3] } 
) . "</p>";
+    } else {
+        $ret .= "<p>" . $class->ml( 'widget.importconfirm.source', { user => 
$imports->[0]->[2], host => $imports->[0]->[1] } ) . "</p>";
+    }
     $ret .= "<p>" . $class->ml( 'widget.importconfirm.destination', { user => 
$u->ljuser_display, host => $LJ::SITENAMESHORT } ) . "</p>";
     $ret .= "<p>" . $class->ml( 'widget.importconfirm.items', { items => join( 
'<br />', @items_display ) } ) . "</p>";
 
diff -r cbef12206273 -r b5bf8561aab5 cgi-bin/ljprotocol.pl
--- a/cgi-bin/ljprotocol.pl     Mon Aug 31 09:03:41 2009 +0000
+++ b/cgi-bin/ljprotocol.pl     Mon Aug 31 21:27:13 2009 +0000
@@ -990,6 +990,20 @@ sub postevent
     my ($req, $err, $flags) = @_;
     un_utf8_request($req);
 
+    # if the importer is calling us, we want to allow it to post in all but 
the most extreme
+    # of cases.  and even then, we try our hardest to allow content to be 
posted.  setting this
+    # flag will bypass a lot of the safety restrictions about who can post 
where and when, so
+    # we trust the importer to be intelligent about this.  (And if you aren't 
the importer, don't
+    # use this option!!!)
+    my $importer_bypass = $flags->{importer_bypass} ? 1 : 0;
+    if ( $importer_bypass ) {
+        $flags->{nomod} = 1;
+        $flags->{ignore_tags_max} = 1;
+        $flags->{nonotify} = 1;
+        $flags->{noauth} = 1;
+        $flags->{usejournal_okay} = 1;
+    }
+
     return undef unless LJ::run_hook('post_noauth', $req) || 
authenticate($req, $err, $flags);
 
     # if going through mod queue, then we know they're permitted to post at 
least this entry
@@ -998,6 +1012,7 @@ sub postevent
     my $u = $flags->{'u'};
     my $ownerid = $flags->{'ownerid'}+0;
     my $uowner = $flags->{'u_owner'} || $u;
+
     # Make sure we have a real user object here
     $uowner = LJ::want_user($uowner) unless LJ::isu($uowner);
     my $clusterid = $uowner->{'clusterid'};
@@ -1009,22 +1024,23 @@ sub postevent
     return fail($err,200) unless $req->{'event'} =~ /\S/;
 
     ### make sure community or identity journals don't post
-    return fail($err,150) if $u->is_community || $u->is_identity;
+    return fail($err,150) if $u->is_community;
+    return fail($err,150) if ! $importer_bypass && $u->is_identity;
 
     # suspended users can't post
-    return fail($err,305) if $u->is_suspended;
+    return fail($err,305) if ! $importer_bypass && $u->is_suspended;
 
     # memorials can't post
-    return fail($err,309) if $u->is_memorial;
+    return fail($err,309) if ! $importer_bypass && $u->is_memorial;
 
     # locked accounts can't post
-    return fail($err,308) if $u->is_locked;
+    return fail($err,308) if ! $importer_bypass && $u->is_locked;
 
     # check the journal's read-only bit
     return fail($err,306) if LJ::get_cap($uowner, "readonly");
 
     # is the user allowed to post?
-    return fail($err,404,$LJ::MSG_NO_POST) unless LJ::get_cap($u, "can_post");
+    return fail($err,404,$LJ::MSG_NO_POST) unless $importer_bypass || 
LJ::get_cap($u, "can_post");
 
     # is the user allowed to post?
     return fail($err,410) if LJ::get_cap($u, "disable_can_post");
@@ -1036,7 +1052,7 @@ sub postevent
     return fail($err,317) if $uowner->is_readonly;
 
     # can't post to deleted/suspended community
-    return fail($err,307) unless $uowner->is_visible;
+    return fail($err,307) unless $importer_bypass || $uowner->is_visible;
 
     # must have a validated email address to post to a community
     # unless this is approved from the mod queue (we'll error out initially, 
but in case they change later)
@@ -1079,7 +1095,7 @@ sub postevent
     # confirm we can add tags, at least
     return fail($err, 312)
         if $req->{props} && $req->{props}->{taglist} &&
-           ! LJ::Tags::can_add_tags($uowner, $u);
+           ! ( $importer_bypass || LJ::Tags::can_add_tags( $uowner, $u ) );
 
     my $event = $req->{'event'};
 
@@ -1150,8 +1166,8 @@ sub postevent
 
     # don't allow backdated posts in communities
     return fail($err,152) if
-        ($req->{'props'}->{"opt_backdated"} &&
-         ! $uowner->is_person);
+        ( $req->{props}->{opt_backdated} &&
+         ! ( $importer_bypass || $uowner->is_person ) );
 
     # do processing of embedded polls (doesn't add to database, just
     # does validity checking)
@@ -1335,7 +1351,7 @@ sub postevent
     $getlock->(); return $res if $res_done;
 
     # do rate-checking
-    if ( ! $u->is_syndicated && ! LJ::rate_log($u, "post", 1) ) {
+    if ( ! $u->is_syndicated && ! LJ::rate_log($u, "post", 1) && ! 
$importer_bypass ) {
         return $fail->($err,405);
     }
 
@@ -1433,6 +1449,7 @@ sub postevent
         my $logtag_opts = {
             remote => $u,
             ignore_max => $flags->{ignore_tags_max} ? 1 : 0,
+            force => $importer_bypass,
             err_ref => \$tagerr,
         };
 
_______________________________________________
dw-changelog mailing list
[email protected]
http://lists.dwscoalition.org/mailman/listinfo/dw-changelog

Reply via email to