Allow identity users (e.g., openid accounts) to post an entry in a 
community and  also add tags  like normal users (if allowed) will be useful for 
suggestions. Only site administrators can set this on an account.

        Patch by fu. 

diffs (205 lines):

diff -r 68507e240fe8 -r bf2ba22edace bin/upgrading/proplists.dat
--- a/bin/upgrading/proplists.dat       Tue Oct 12 21:49:53 2010 +0800
+++ b/bin/upgrading/proplists.dat       Tue Oct 12 23:04:40 2010 +0800
@@ -405,6 +405,14 @@ userproplist.icq:
   indexed: 1
   multihomed: 1
   prettyname: ICQ
+
+userproplist.identity_posting:
+  cldversion: 4
+  datatype: bol
+  des: Whether to allow identity users to post entries to this journal
+  indexed: 0
+  multihomed: 0
+  prettyname: Entries from Identity Users
 
 userproplist.import_job:
   cldversion: 4
diff -r 68507e240fe8 -r bf2ba22edace cgi-bin/LJ/Tags.pm
--- a/cgi-bin/LJ/Tags.pm        Tue Oct 12 21:49:53 2010 +0800
+++ b/cgi-bin/LJ/Tags.pm        Tue Oct 12 23:04:40 2010 +0800
@@ -473,7 +473,11 @@ sub can_add_tags {
     my $u = LJ::want_user(shift);
     my $remote = LJ::want_user(shift);
     return undef unless $u && $remote;
-    return undef unless $remote->is_person;
+
+    # we don't allow identity users to add tags, even when tag permissions 
would otherwise allow any user on the site
+    # exception are communities that explicitly allow identity users to post 
in them
+    # FIXME: perhaps we should restrict on all users, but allow for more 
restrictive settings such as members?
+    return undef unless $remote->is_personal || $remote->is_identity && 
$u->prop( 'identity_posting' );
     return undef if $u->has_banned( $remote );
 
     # get permission hashref and check it; note that we fall back to the 
control
@@ -491,9 +495,9 @@ sub can_add_entry_tags {
     $remote = LJ::want_user( $remote );
 
     return undef unless $remote && $entry;
-    return undef unless $remote->is_personal;
 
     my $journal = $entry->journal;
+    return undef unless $remote->is_personal || $remote->is_identity && 
$journal->prop( 'identity_posting' );
     return undef if $journal->has_banned( $remote );
 
     my $perms = LJ::Tags::get_permission_levels( $journal );
@@ -529,7 +533,7 @@ sub can_control_tags {
     my $u = LJ::want_user(shift);
     my $remote = LJ::want_user(shift);
     return undef unless $u && $remote;
-    return undef unless $remote->is_person;
+    return undef unless $remote->is_personal || $remote->is_identity && 
$u->prop( 'identity_posting' );
     return undef if $u->has_banned( $remote );
 
     # get permission hashref and check it
diff -r 68507e240fe8 -r bf2ba22edace cgi-bin/ljprotocol.pl
--- a/cgi-bin/ljprotocol.pl     Tue Oct 12 21:49:53 2010 +0800
+++ b/cgi-bin/ljprotocol.pl     Tue Oct 12 23:04:40 2010 +0800
@@ -1157,7 +1157,7 @@ sub postevent
 
     ### make sure community or identity journals don't post
     return fail($err,150) if $u->is_community;
-    return fail($err,150) if ! $importer_bypass && $u->is_identity;
+    return fail($err,150) if ! $importer_bypass && ! $uowner->prop( 
"identity_posting" ) && $u->is_identity;
 
     # suspended users can't post
     return fail($err,305) if ! $importer_bypass && $u->is_suspended;
diff -r 68507e240fe8 -r bf2ba22edace t/protocol.t
--- a/t/protocol.t      Tue Oct 12 21:49:53 2010 +0800
+++ b/t/protocol.t      Tue Oct 12 23:04:40 2010 +0800
@@ -3,13 +3,14 @@ use warnings;
 use warnings;
 
 use Test::More;
-plan tests => 191;
+plan tests => 201;
 
 use lib "$ENV{LJHOME}/cgi-bin";
 require 'ljlib.pl';
 require 'ljprotocol.pl';
 
 use LJ::Test qw( temp_user temp_comm );
+no warnings "once";
 
 my $u = temp_user();
 my $watched = temp_user();
@@ -38,9 +39,10 @@ my $do_request = sub {
     my ( $mode, %request_args ) = @_;
 
     my $err = 0;
+    my %flags = %{ delete  $request_args{flags} || {} };
     my $req = \%request_args;
 
-    my $res = LJ::Protocol::do_request( $mode, $req, \$err, { noauth => 1 } );
+    my $res = LJ::Protocol::do_request( $mode, $req, \$err, { noauth => 1, 
%flags } );
 
     return ( $res, $err );
 };
@@ -473,3 +475,107 @@ note( "editcircle" );
     ( $res, $err ) = $do_request->( "getcircle", username => $u->user, 
includecontentfilters => 1 );
     ok( $res->{contentfilters}->[0]->{data} eq "", "No more data in the 
content filter." );
 }
+
+
+note( "post to community by various journaltypes" );
+{
+    # test cases:
+    # personal journal posting to a community
+    # community posting to a community
+    # openid to a community with no openid posting cap
+    # openid to a community which has the openid posting cap
+    # openid to a community which normally does not allow openid posting, but 
with the importer bypass on
+
+    # open up community posting to everybody
+    my $admin = temp_user();
+    $admin->join_community( $comm, 1, 1 );
+    LJ::set_rel( $comm->userid, $admin->userid, "A" );
+    delete $LJ::REQ_CACHE_REL{$comm->userid."-".$admin->userid."-A"};  # to be 
safe
+
+    $comm->set_comm_settings( $admin, { membership => "open", postlevel => 
"members" } );
+    $comm->set_prop( nonmember_posting => 1 );
+
+
+    # validate the user, so they can post
+    LJ::update_user( $u, { status => 'A' } );
+
+    ( $res, $err ) = $do_request->( "postevent",
+        username   => $u->user,
+        usejournal => $comm->user,
+
+        event      => "new test post to community",
+        tz         => "guess",
+    );
+    $success->( $err, "Entry posted successfully to community by personal 
journal." );
+
+
+    my $comm2 = temp_comm();
+    ( $res, $err ) = $do_request->( "postevent",
+        username    => $comm2->user,
+        usejournal  => $comm->user,
+        event       => "new test post to community by community2"
+    );
+    $check_err->( $err, 300, "Communities cannot post entries." );
+
+    ( $res, $err ) = $do_request->( "postevent",
+        username    => $comm->user,
+        usejournal  => $comm->user,
+
+        event       => "new test post to self by a community",
+        tz          => "guess",
+    );
+    $check_err->( $err, 300, "Communities cannot post entries, not even to 
themselves." );
+
+
+
+    # openid casess
+    my $identity_u = temp_user( journaltype => "I" );
+    $identity_u->update_self( { status => "A" } );
+
+    ( $res, $err ) = $do_request->( "postevent",
+        username    => $identity_u->user,
+        usejournal  => $comm->user,
+
+        event       => "new test post to a community by an identity user",
+        tz          => "guess",
+    );
+    $check_err->( $err, 150, "OpenID users cannot post entries to communities 
with no OpenID posting prop." );
+
+
+    ( $res, $err ) = $do_request->( "postevent",
+        username    => $identity_u->user,
+        usejournal  => $comm->user,
+
+        event       => "new test post to a community by an identity user",
+        tz          => "guess",
+
+        flags       => { importer_bypass => 1 },
+    );
+    $success->( $err, "Always allow posting with the importer bypass." );
+
+
+    # allow all users to add and control tags (for convenience)
+    $comm->set_prop( opt_tagpermissions => "public,public" );
+
+
+    ok( ! LJ::Tags::can_control_tags( $comm, $identity_u ), "Identity user 
cannot control tags on communities that don't allow identity posting." );
+    ok( ! LJ::Tags::can_add_tags( $comm, $identity_u ), "Identity user cannot 
control tags on communities that don't allow identity posting." );
+
+
+    # allow identity users to post entries and add / control tags as 
appropriate
+    $comm->set_prop( identity_posting => 1 );
+
+    ok( LJ::Tags::can_control_tags( $comm, $identity_u ), "Identity user can 
control tags on communities if they allow identity posting." );
+    ok( LJ::Tags::can_add_tags( $comm, $identity_u ), "Identity user can 
control tags on communities if they allow identity posting." );
+
+
+    ( $res, $err ) = $do_request->( "postevent",
+        username    => $identity_u->user,
+        usejournal  => $comm->user,
+
+        event       => "new test post to a community by an identity user",
+        props       => { taglist => "testing" },
+        tz          => "guess",
+    );
+    $success->( $err, "OpenID users can post entries to communities with the 
appropriate prop." );
+}
_______________________________________________
dw-changelog mailing list
[email protected]
http://lists.dwscoalition.org/mailman/listinfo/dw-changelog

Reply via email to