fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2010-06-04 03:27 pm

[dw-free] Disable/remove "Comment" button when user isn't allowed to comment

[commit: http://hg.dwscoalition.org/dw-free/rev/c8d6107aa1b5]

http://bugs.dwscoalition.org/show_bug.cgi?id=361

Disable quick reply if you are not allowed to comment to this journal
(setting + not a member or not on the access list). Previously, you would
only find out once you had typed a comment and hit post; now, you will be
redirected to the full form with an error message if you click on the reply
link. Also some refactoring.

Patch from LiveJournal, with some tweaks by [personal profile] kareila.

Files modified:
  • cgi-bin/LJ/S2.pm
  • cgi-bin/LJ/Talk.pm
  • cgi-bin/LJ/User.pm
  • cgi-bin/weblib.pl
--------------------------------------------------------------------------------
diff -r 2417a253fad1 -r c8d6107aa1b5 cgi-bin/LJ/S2.pm
--- a/cgi-bin/LJ/S2.pm	Fri Jun 04 13:59:12 2010 +0800
+++ b/cgi-bin/LJ/S2.pm	Fri Jun 04 23:33:03 2010 +0800
@@ -3277,6 +3277,7 @@ sub _print_quickreply_link
 
     $onclick = "" unless $page->{'_type'} eq 'EntryPage';
     $onclick = "" unless LJ::is_enabled('s2quickreply');
+    $onclick = "" if $page->{'_u'}->does_not_allow_comments_from( $remote );
 
     # See if we want to force them to change their password
     my $bp = LJ::bad_password_redirect({ 'returl' => 1 });
diff -r 2417a253fad1 -r c8d6107aa1b5 cgi-bin/LJ/Talk.pm
--- a/cgi-bin/LJ/Talk.pm	Fri Jun 04 13:59:12 2010 +0800
+++ b/cgi-bin/LJ/Talk.pm	Fri Jun 04 23:33:03 2010 +0800
@@ -1172,6 +1172,10 @@ sub load_comments
     return map { $posts->{$_} } @top_replies;
 }
 
+# XXX these strings should be in talk, but moving them means we have
+# to retranslate.  so for now we're just gonna put it off.
+my $SC = '/talkpost_do.bml';
+
 sub talkform {
     # Takes a hashref with the following keys / values:
     # remote:      optional remote u object
@@ -1256,6 +1260,7 @@ sub talkform {
     }
 
     my $oid_identity = $remote ? $remote->openid_identity : undef;
+    my $logged_in = $remote ? LJ::ehtml( $remote->display_name ) : '';
 
     # Default radio button
     # 4 possible scenarios:
@@ -1299,6 +1304,21 @@ sub talkform {
         return;
     };
 
+    my $bantext = sub {
+        my ( $type, $other_user ) = @_;
+        $other_user = '' unless $other_user;
+        my $ml_loggedin =
+            BML::ml( ".opt.loggedin", { username => "<strong>$logged_in</strong>" } );
+        my $ml_bannedfrom =
+            BML::ml( ".opt.bannedfrom", { journal => $journalu->user } );
+        return qq{
+    <td align='center'><img src='$LJ::IMGPREFIX/silk/identity/$type.png' /></td>
+    <td align='center'>( )</td>
+    <td align='left'><span class='ljdeem'>$ml_loggedin</span>
+      $ml_bannedfrom$other_user</td>
+        };
+    };
+
     # special link to create an account
     my $create_link;
     if (!$remote || defined $oid_identity) {
@@ -1318,15 +1338,13 @@ sub talkform {
         return "You cannot edit this comment." unless $remote && !defined $oid_identity;
 
         $ret .= "<tr valign='middle' id='ljuser_row'>";
-        my $logged_in = LJ::ehtml($remote->display_name);
 
-        if (LJ::is_banned($remote, $journalu)) {
-            $ret .= "<td align='center'><img src='$LJ::IMGPREFIX/silk/identity/user.png' /></td>";
-            $ret .= "<td align='center'>( )</td>";
-            $ret .= "<td align='left'><span class='ljdeem'>" . BML::ml(".opt.loggedin", {'username'=>"<i>$logged_in</i>"}) . "</font>" . BML::ml(".opt.bannedfrom", {'journal'=>$journalu->{'user'}}) . "</td>";
+        if ( LJ::is_banned( $remote, $journalu ) ) {
+            $ret .= $bantext->( 'user' );
         } else {
             $ret .= "<td align='center'><img src='$LJ::IMGPREFIX/silk/identity/user.png'  onclick='handleRadios(1);' /></td>";
-            $ret .= "<td align='left'><label for='talkpostfromremote'>" . BML::ml(".opt.loggedin", {'username'=>"<i>$logged_in</i>"}) . "</label>\n";
+            $ret .= "<td align='left'><label for='talkpostfromremote'>";
+            $ret .= BML::ml( ".opt.loggedin", { username => "<strong>$logged_in</strong>" } ) . "</label>\n";
 
             $ret .= "<input type='hidden' name='usertype' value='cookieuser' />";
             $ret .= "<input type='hidden' name='cookieuser' value='$remote->{'user'}' id='cookieuser' />\n";
@@ -1360,11 +1378,13 @@ sub talkform {
             # Logged in
             if (defined $oid_identity) {
                 $ret .= "<tr valign='middle' id='oidli' name='oidli'>";
-                $ret .= "<td align='center'><img src='$LJ::IMGPREFIX/silk/identity/openid.png' onclick='handleRadios(4);' /></td><td align='center'><input type='radio' name='usertype' value='openid_cookie' id='talkpostfromoidli'" .
-                    $whocheck->('openid_cookie') . "/>";
+                $ret .= "<td align='center'><img src='$LJ::IMGPREFIX/silk/identity/openid.png' onclick='handleRadios(4);' /></td>";
+                $ret .= "<td align='center'><input type='radio' name='usertype' value='openid_cookie' id='talkpostfromoidli'";
+                $ret .= $whocheck->('openid_cookie') . "/>";
                 $ret .= "</td><td align='left'><b><label for='talkpostfromoid' onclick='handleRadios(4);return false;'>OpenID identity:</label></b> ";
 
-                $ret .= "<i>" . $remote->display_name . "</i>";
+                $ret .= "<strong>$logged_in</strong>";
+
                 # show willscreen if a) all comments are screened b) anonymous is screened and OpenID user not validated, c) non-access is screened and OpenID user
                 # is not on access list
                 $ret .= $BML::ML{'.opt.willscreen'} if $screening eq 'A' || ( $screening eq 'R' && !$remote->is_validated )
@@ -1414,18 +1434,16 @@ sub talkform {
             if ( defined $oid_identity && ( $remote->is_validated ||
                                             $journalu->trusts( $remote ) )
                ) {
-                my $logged_in = LJ::ehtml($remote->display_name);
                 $ret .= "<tr valign='middle' id='oidli' name='oidli'>";
-                if (LJ::is_banned($remote, $journalu)) {
-                    $ret .= "<td align='center'><img src='$LJ::IMGPREFIX/silk/identity/openid.png' /></td>";
-                    $ret .= "<td align='center'>( )</td>";
-                    $ret .= "<td align='left'><span class='ljdeem'>" . BML::ml(".opt.loggedin", {'username'=>"<i>$logged_in</i>"}) . "</font>" . BML::ml(".opt.bannedfrom", {'journal'=>$journalu->{'user'}}) . "</td>";
+                if ( LJ::is_banned( $remote, $journalu ) ) {
+                    $ret .= $bantext->( 'openid' );
                 } else {
-                    $ret .= "<td align='center'><img src='$LJ::IMGPREFIX/silk/identity/openid.png' onclick='handleRadios(4);' /></td><td align='center'><input type='radio' name='usertype' value='openid_cookie' id='talkpostfromoidli'" .
-                        $whocheck->('openid_cookie') . "/>";
+                    $ret .= "<td align='center'><img src='$LJ::IMGPREFIX/silk/identity/openid.png' onclick='handleRadios(4);' /></td>";
+                    $ret .= "<td align='center'><input type='radio' name='usertype' value='openid_cookie' id='talkpostfromoidli'";
+                    $ret .= $whocheck->('openid_cookie') . "/>";
                     $ret .= "</td><td align='left'><b><label for='talkpostfromoid' onclick='handleRadios(4);return false;'>OpenID identity:</label></b> ";
 
-                    $ret .= "<i>" . $remote->display_name . "</i>";
+                    $ret .= "<strong>$logged_in</strong>";
 
                     $ret .= $BML::ML{'.opt.willscreen'} if $screening;
                 }
@@ -1446,6 +1464,8 @@ sub talkform {
         }
     }
 
+    my $remote_can_comment = ! $journalu->does_not_allow_comments_from( $remote );
+
     if ($journalu->{'opt_whocanreply'} eq 'friends') {
         $ret .= "<tr valign='middle'>";
         $ret .= "<td align='center' width='20'><img src='$LJ::IMGPREFIX/silk/identity/anonymous.png' /></td>";
@@ -1455,17 +1475,27 @@ sub talkform {
         $ret .= " " . BML::ml($stringname, {'username'=>"<b>$journalu->{'user'}</b>"});
         $ret .= "</tr>\n";
 
-        ## the if clause is a copy of code from ($journalu->{'opt_whocanreply'} eq 'all')`
+        ## the if clause was a copy of code from ($journalu->{'opt_whocanreply'} eq 'all')
         if (LJ::OpenID->consumer_enabled) {
             # OpenID!!
             # Logged in
             if (defined $oid_identity) {
                 $ret .= "<tr valign='middle' id='oidli' name='oidli'>";
-                $ret .= "<td align='center'><img src='$LJ::IMGPREFIX/silk/identity/openid.png' onclick='handleRadios(4);' /></td><td align='center'><input type='radio' name='usertype' value='openid_cookie' id='talkpostfromoidli'" .
-                    $whocheck->('openid_cookie') . "/>";
-                $ret .= "</td><td align='left'><b><label for='talkpostfromoid' onclick='handleRadios(4);return false;'>OpenID identity:</label></b> ";
+                $ret .= "<td align='center'><img src='$LJ::IMGPREFIX/silk/identity/openid.png' onclick='handleRadios(4);' /></td>";
+                if ( $remote_can_comment ) {
+                    $ret .= "<td align='center'><input type='radio' name='usertype' value='openid_cookie' id='talkpostfromoidli'";
+                    $ret .= $whocheck->('openid_cookie') . "/>";
+                    $ret .= "</td><td align='left'><b><label for='talkpostfromoid' onclick='handleRadios(4);return false;'>OpenID identity:</label></b> ";
+                } else {
+                    $ret .= "<td align='center'>( )</td><td align='left'><b><font color='#c0c0c0'>OpenID identity:</font></b>&nbsp;";
+                }
 
-                $ret .= "<i>" . $remote->display_name . "</i>";
+                $ret .= "<strong>$logged_in</strong>";
+                unless ( $remote_can_comment ) {
+                    my $msg = $journalu->is_comm ? "notamember" : "notafriend";
+                    $ret .= "&nbsp;- " . BML::ml( "$SC.error.$msg",
+                                                  { user => $journalu->user } );
+                }
 
                 $ret .= $BML::ML{'.opt.willscreen'} if $screening eq 'A';
                 $ret .= "</td></tr>\n";
@@ -1501,24 +1531,38 @@ sub talkform {
         }
     }
 
-    if ($remote && !defined $oid_identity) {
-        $ret .= "<tr valign='middle' id='ljuser_row'>";
-        my $logged_in = LJ::ehtml($remote->display_name);
+    if ( $remote && ! defined $oid_identity ) {
+        $ret .= "<tr valign='middle' id='ljuser_row" . ($remote_can_comment ? '' : '_cannot') . "'>";
 
         # Don't worry about a real href since js hides the row anyway
         my $other_user = "<script language='JavaScript'>if (document.getElementById) {document.write(\"&nbsp;<a href='#' onClick='otherLJUser();return false;'>[other]</a>\");}</script>";
 
-        if (LJ::is_banned($remote, $journalu)) {
-            $ret .= "<td align='center'><img src='$LJ::IMGPREFIX/silk/identity/user.png' /></td>";
-            $ret .= "<td align='center'>( )</td>";
-            $ret .= "<td align='left'><span class='ljdeem'>" . BML::ml(".opt.loggedin", {'username'=>"<i>$logged_in</i>"}) . "</font>" . BML::ml(".opt.bannedfrom", {'journal'=>$journalu->{'user'}}) . $other_user . "</td>";
+        if ( LJ::is_banned( $remote, $journalu ) ) {
+            $ret .= $bantext->( 'user', $other_user );
         } else {
-            $ret .= "<td align='center'><img src='$LJ::IMGPREFIX/silk/identity/user.png'  onclick='handleRadios(1);' /></td><td align='center'><input type='radio' name='usertype' value='cookieuser' id='talkpostfromremote'" .
-                     $whocheck->('remote') .
-                     " /></td>";
-            $ret .= "<td align='left'><label for='talkpostfromremote'>" . BML::ml(".opt.loggedin", {'username'=>"<i>$logged_in</i>"}) . "</label>\n";
+            $ret .= "<td align='center'><img src='$LJ::IMGPREFIX/silk/identity/user.png'  onclick='handleRadios(1);' /></td>";
+            if ( $remote_can_comment ) {
+                $ret .= "<td align='center'><input type='radio' name='usertype' value='cookieuser' id='talkpostfromremote'";
+                $ret .= $whocheck->('remote') . " /></td>";
+            } else {
+                $ret .= "<td align='center'>( )</td>";
+            }
+            $ret .= "<td align='left'>";
+            if ( $remote_can_comment ) {
+                $ret .= "<label for='talkpostfromremote'>";
+                $ret .= BML::ml( ".opt.loggedin", { username => "<strong>$logged_in</strong>" } );
+                $ret .= "</label>\n";
 
-            $ret .= $other_user;
+                $ret .= $other_user;
+            } else {
+                $ret .= "<font color='#c0c0c0'>";
+                $ret .= BML::ml( ".opt.loggedin", { username => "</font><strong>$logged_in</strong><font color='#c0c0c0'>" } );
+                $ret .= "</font>\n";
+
+                my $msg = $journalu->is_comm ? "notamember" : "notafriend";
+                $ret .= "&nbsp;- " . BML::ml( "$SC.error.$msg",
+                                              { user => $journalu->user } );
+            }
 
             $ret .= "<input type='hidden' name='cookieuser' value='$remote->{'user'}' id='cookieuser' />\n";
             if ($screening eq 'A' ||
@@ -1532,9 +1576,11 @@ sub talkform {
 
     # ( ) Site user:
     $ret .= "<tr valign='middle' id='otherljuser_row' name='otherljuser_row'>";
-    $ret .= "<td align='center'><img src='$LJ::IMGPREFIX/silk/identity/user.png' onclick='handleRadios(2);' /></td><td align='center'><input type='radio' name='usertype' value='user' id='talkpostfromlj'" .
-        $whocheck->('ljuser') . "/>";
-    $ret .= "</td><td align='left'><b><label for='talkpostfromlj' onclick='handleRadios(2); return false;'>" . BML::ml( '.opt.siteuser', { sitename => $LJ::SITENAMESHORT } ) . "</label></b> ";
+    $ret .= "<td align='center'><img src='$LJ::IMGPREFIX/silk/identity/user.png' onclick='handleRadios(2);' /></td>";
+    $ret .= "<td align='center'><input type='radio' name='usertype' value='user' id='talkpostfromlj'";
+    $ret .= $remote_can_comment ? $whocheck->('ljuser') : ' checked="checked"';
+    $ret .= " /></td><td align='left'><b><label for='talkpostfromlj' onclick='handleRadios(2); return false;'>";
+    $ret .= BML::ml( '.opt.siteuser', { sitename => $LJ::SITENAMESHORT } ) . "</label></b> ";
     $ret .= $BML::ML{'.opt.willscreenfriend'} if $screening eq 'F';
     $ret .= $BML::ML{'.opt.willscreen'} if $screening eq 'A';
     $ret .= "</td></tr>\n";
@@ -1564,6 +1610,7 @@ sub talkform {
             $ljuser_def = $remote->{user};
         }
     }
+    $ljuser_def = "" unless $remote_can_comment;
 
     $ret .= "<table><tr><td>";
     $ret .= "$BML::ML{'Username'}:</td><td>";
@@ -2848,10 +2895,6 @@ sub enter_imported_comment {
     return $jtalkid;
 }
 
-# XXX these strings should be in talk, but moving them means we have
-# to retranslate.  so for now we're just gonna put it off.
-my $SC = '/talkpost_do.bml';
-
 sub init {
     my ($form, $remote, $need_captcha, $errret) = @_;
     my $sth;
diff -r 2417a253fad1 -r c8d6107aa1b5 cgi-bin/LJ/User.pm
--- a/cgi-bin/LJ/User.pm	Fri Jun 04 13:59:12 2010 +0800
+++ b/cgi-bin/LJ/User.pm	Fri Jun 04 23:33:03 2010 +0800
@@ -3435,6 +3435,15 @@ sub usersearch_age_with_expire {
 =head2 Comment-Related Functions
 =cut
 
+# true if u1 restricts commenting to trusted and u2 is not trusted
+sub does_not_allow_comments_from {
+    my ( $u1, $u2 ) = @_;
+    return unless LJ::isu( $u1 ) && LJ::isu( $u2 );
+    return $u1->prop('opt_whocanreply') eq 'friends'
+        && ! $u1->trusts_or_has_member( $u2 );
+}
+
+
 # get recent talkitems posted to this user
 # args: maximum number of comments to retrieve
 # returns: array of hashrefs with jtalkid, nodetype, nodeid, parenttalkid, posterid, state
diff -r 2417a253fad1 -r c8d6107aa1b5 cgi-bin/weblib.pl
--- a/cgi-bin/weblib.pl	Fri Jun 04 13:59:12 2010 +0800
+++ b/cgi-bin/weblib.pl	Fri Jun 04 23:33:03 2010 +0800
@@ -944,6 +944,13 @@ sub make_qr_link
         $basesubject = "Re: $basesubject" if $basesubject;
         $basesubject = LJ::ehtml(LJ::ejs($basesubject));
         my $onclick = "return quickreply(\"$dtid\", $pid, \"$basesubject\")";
+
+        my $r = DW::Request->get;
+        my $ju;
+        $ju = LJ::load_userid( $r->note( 'journalid' ) )
+            if $r and $r->note( 'journalid' );
+
+        $onclick = "" if $ju && $ju->does_not_allow_comments_from( $remote );
         return "<a onclick='$onclick' href='$replyurl' >$linktext</a>";
     } else { # QR Disabled
         return "<a href='$replyurl' >$linktext</a>";
--------------------------------------------------------------------------------
turlough: large orange flowers in lush green grass ((tu) such a brilliant star you are)

[personal profile] turlough 2010-06-04 07:31 pm (UTC)(link)
Excellent!
yvi: Kaylee half-smiling, looking very pretty (Default)

[personal profile] yvi 2010-06-05 09:59 am (UTC)(link)
Nice :)