[dw-free] Remove ability to flag other people's content as adult
[commit: http://hg.dwscoalition.org/dw-free/rev/9fbd871d8aeb]
http://bugs.dwscoalition.org/show_bug.cgi?id=599
Remove ability for users to flag other users content as adult content.
Patch by
janinedog.
Files modified:
http://bugs.dwscoalition.org/show_bug.cgi?id=599
Remove ability for users to flag other users content as adult content.
Patch by
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Files modified:
- bin/upgrading/base-data.sql
- bin/upgrading/en.dat
- bin/upgrading/proplists.dat
- bin/upgrading/s2layers/core1.s2
- bin/upgrading/s2layers/core2.s2
- bin/upgrading/update-db-general.pl
- cgi-bin/Apache/LiveJournal.pm
- cgi-bin/DW/Logic/AdultContent.pm
- cgi-bin/DW/Setting/AdultContentReason.pm
- cgi-bin/LJ/Console/Command/SetFlag.pm
- cgi-bin/LJ/ContentFlag.pm
- cgi-bin/LJ/Entry.pm
- cgi-bin/LJ/M/ProfilePage.pm
- cgi-bin/LJ/S2.pm
- cgi-bin/LJ/S2/DayPage.pm
- cgi-bin/LJ/S2/FriendsPage.pm
- cgi-bin/LJ/S2/RecentPage.pm
- cgi-bin/LJ/Setting/AdultContent.pm
- cgi-bin/LJ/Setting/SafeSearch.pm
- cgi-bin/LJ/Setting/ViewingAdultContent.pm
- cgi-bin/LJ/User.pm
- cgi-bin/LJ/Widget/ContentFlagReport.pm
- cgi-bin/LJ/Widget/ContentFlagSummary.pm
- cgi-bin/LJ/Widget/IPPU/ContentFlagReporters.pm
- cgi-bin/LJ/Widget/IPPU/EntrySummary.pm
- cgi-bin/imageconf.pl
- cgi-bin/supportlib.pl
- cgi-bin/talklib.pl
- cgi-bin/weblib.pl
- etc/config.pl
- htdocs/admin/contentflag.bml
- htdocs/admin/contentflag_home.bml
- htdocs/admin/entryprops.bml
- htdocs/allpics.bml
- htdocs/community/create.bml
- htdocs/community/settings.bml
- htdocs/js/widget_ippu/contentflagreporters.js
- htdocs/js/widget_ippu/entrysummary.js
- htdocs/misc/adult_concepts.bml
- htdocs/misc/adult_concepts_blocked.bml
- htdocs/misc/adult_explicit.bml
- htdocs/misc/adult_explicit_blocked.bml
- htdocs/stc/contentflag.css
- htdocs/stc/widgets/contentflagreport.css
- htdocs/talkpost.bml
- htdocs/talkread.bml
- htdocs/tools/content_flag.bml
- htdocs/tools/content_flag_reported.bml
- htdocs/tools/content_flag_spam.bml
- htdocs/tools/content_flag_spam.bml.text
- htdocs/tools/memories.bml
- htdocs/view/index.bml
- t/content_flag.t
-------------------------------------------------------------------------------- diff -r 1138cfcfec8f -r 9fbd871d8aeb bin/upgrading/base-data.sql --- a/bin/upgrading/base-data.sql Wed Apr 01 03:43:15 2009 +0000 +++ b/bin/upgrading/base-data.sql Wed Apr 01 03:50:07 2009 +0000 @@ -570,8 +570,6 @@ UPDATE priv_list SET des='Allows a user UPDATE priv_list SET des='Allows a user to edit site text in a given language. arg=Unique language code, optionally appended by |domainid.domaincode',is_public='1',privname='Translate/Update Text',scope='general' WHERE privcode='translate'; INSERT IGNORE INTO ratelist (des, name) VALUES ('Logged when a user adds someone to their Friends list', 'addfriend'); UPDATE ratelist SET des='Logged when a user adds someone to their Friends list' WHERE name='addfriend'; -INSERT IGNORE INTO ratelist (des, name) VALUES ('Logged when user flags content', 'ctflag'); -UPDATE ratelist SET des='Logged when user flags content' WHERE name='ctflag'; INSERT IGNORE INTO ratelist (des, name) VALUES ('Logged when wrong username/password is used.', 'failed_login'); UPDATE ratelist SET des='Logged when wrong username/password is used.' WHERE name='failed_login'; INSERT IGNORE INTO ratelist (des, name) VALUES ('Logged when a user sends a free VGift', 'freevgifts'); @@ -917,7 +915,6 @@ REPLACE INTO schematables (des, public_b REPLACE INTO schematables (des, public_browsable, redist_mode, redist_where, tablename) VALUES ('Global. Stores database connection and replication info, instead of in the %LJ::DBINFO hash, for easier (web-based) management of LiveJournal installations with many databases.', '0', 'off', NULL, 'dbinfo'); REPLACE INTO schematables (des, public_browsable, redist_mode, redist_where, tablename) VALUES ('Global. Stores each database\'s roles and weights. The [dbtable[dbinfo]] table keeps track of which databases exist.', '0', 'off', NULL, 'dbweights'); REPLACE INTO schematables (des, public_browsable, redist_mode, redist_where, tablename) VALUES ('Global. Stores external user mappings. Note: extuser/extuserid are expected to sometimes be NULL, even though they are keyed. (Null values are not taken into account when using indexes).', '0', 'off', NULL, 'extuser'); -REPLACE INTO schematables (des, public_browsable, redist_mode, redist_where, tablename) VALUES ('Global. Stores flagged content metadata. Content can be flagged as adult content, etc.', '0', 'off', NULL, 'content_flag'); REPLACE INTO schematables (des, public_browsable, redist_mode, redist_where, tablename) VALUES ('Global. Stores information on syndicated accounts like feed URI, readership, polling, etc.', '0', 'off', NULL, 'syndicated'); REPLACE INTO schematables (des, public_browsable, redist_mode, redist_where, tablename) VALUES ('Global. Stores list of ESN notification class types.', '0', 'off', NULL, 'notifytypelist'); REPLACE INTO schematables (des, public_browsable, redist_mode, redist_where, tablename) VALUES ('Global. Stores list of different admin privileges that users can have.', '1', 'replace', NULL, 'priv_list'); diff -r 1138cfcfec8f -r 9fbd871d8aeb bin/upgrading/en.dat --- a/bin/upgrading/en.dat Wed Apr 01 03:43:15 2009 +0000 +++ b/bin/upgrading/en.dat Wed Apr 01 03:50:07 2009 +0000 @@ -2005,8 +2005,6 @@ img.editentry=Edit Entry img.edittags=Edit Tags -img.flag_btn=Flag - img.ins_obj=Insert Image/Object img.memadd=Add to memories! @@ -3251,8 +3249,6 @@ web.controlstrip.links.editcommprofile=E web.controlstrip.links.explore=Explore [[sitenameabbrev]] -web.controlstrip.links.flag=Flag Journal - web.controlstrip.links.home=Home web.controlstrip.links.inbox=Inbox @@ -3418,28 +3414,6 @@ widget.commsofuser.viewfriendspage=View widget.commsofuser.viewfriendspage=View [[user]]'s Friends page widget.commsofuser.viewprofile=View [[user]]'s profile - -widget.contentflagreport.btn.returnentry=Return to Entry - -widget.contentflagreport.btn.returnjournal=Return to Journal - -widget.contentflagreport.btn.submit=Submit Report - -widget.contentflagreport.confirm=I feel that this content meets the description of <a [[aopts]]>Explicit Adult Content</a>. - -widget.contentflagreport.description=Go <a [[confirmaopts]]>here</a> to flag this content as explicitly adult. - -widget.contentflagreport.done=Thank you for your report. We will process it as soon as possible and take the appropriate action. Unfortunately, we can't respond individually to each report we receive. - -widget.contentflagreport.error.invalidentry=Invalid entry. - -widget.contentflagreport.error.invalidurl=Invalid URL. - -widget.contentflagreport.error.invalidusername=Invalid username. - -widget.contentflagreport.explore=Explore [[sitenameabbrev]] - -widget.contentflagreport.note=<span class='note-header'>Note:</span> <span class='note-text'>You have not yet flagged this content. Please review the following options and select the one that best fits your concerns.</span> widget.createaccount.alt_layout.error.tos=You must agree to the Terms of Service. diff -r 1138cfcfec8f -r 9fbd871d8aeb bin/upgrading/proplists.dat --- a/bin/upgrading/proplists.dat Wed Apr 01 03:43:15 2009 +0000 +++ b/bin/upgrading/proplists.dat Wed Apr 01 03:50:07 2009 +0000 @@ -13,14 +13,6 @@ userproplist.ad_visibility: indexed: 0 multihomed: 0 prettyname: Ad Visibility - -userproplist.admin_content_flag: - cldversion: 4 - datatype: char - des: Internal flag describing the nature of this journal, set by an admin - indexed: 0 - multihomed: 0 - prettyname: Admin Content Flag userproplist.adult_content: cldversion: 4 @@ -1215,13 +1207,6 @@ talkproplist.unknown8bit: des: True if text has 8-bit data that's not in UTF-8 prettyname: Unknown 8-bit text -logproplist.admin_content_flag: - datatype: char - des: Internal flag describing the nature of this entry, set by an admin - prettyname: Admin Content Flag - sortorder: 106 - ownership: system - logproplist.adult_content: datatype: char des: Sets the entry as containing adult content (none, explicit, concepts) diff -r 1138cfcfec8f -r 9fbd871d8aeb bin/upgrading/s2layers/core1.s2 --- a/bin/upgrading/s2layers/core1.s2 Wed Apr 01 03:43:15 2009 +0000 +++ b/bin/upgrading/s2layers/core1.s2 Wed Apr 01 03:50:07 2009 +0000 @@ -1346,11 +1346,6 @@ property string text_unwatch_comments { } set text_unwatch_comments = "Untrack This"; -property string text_flag { - des = "Text to flag an entry"; -} -set text_flag = "Flag"; - property string text_month_screened_comments { des = "Text to indicate there are screened comments"; } diff -r 1138cfcfec8f -r 9fbd871d8aeb bin/upgrading/s2layers/core2.s2 --- a/bin/upgrading/s2layers/core2.s2 Wed Apr 01 03:43:15 2009 +0000 +++ b/bin/upgrading/s2layers/core2.s2 Wed Apr 01 03:50:07 2009 +0000 @@ -1747,9 +1747,6 @@ set text_watch_comments = "Track This"; property string text_unwatch_comments { des = "Text to stop tracking events on an entry"; } set text_unwatch_comments = "Untrack This"; - -property string text_flag { des = "Text to flag an entry"; } -set text_flag = "Flag"; property string text_permalink { des = "Text for an entry's permanent link"; diff -r 1138cfcfec8f -r 9fbd871d8aeb bin/upgrading/update-db-general.pl --- a/bin/upgrading/update-db-general.pl Wed Apr 01 03:43:15 2009 +0000 +++ b/bin/upgrading/update-db-general.pl Wed Apr 01 03:50:07 2009 +0000 @@ -2860,27 +2860,6 @@ CREATE TABLE uniqmap ( ) EOC -register_tablecreate("content_flag", <<'EOC'); -CREATE TABLE content_flag ( - flagid INT UNSIGNED NOT NULL AUTO_INCREMENT, - journalid INT UNSIGNED NOT NULL, - typeid TINYINT UNSIGNED NOT NULL, - itemid INT UNSIGNED, - catid TINYINT UNSIGNED NOT NULL, - reporterid INT UNSIGNED NOT NULL, - reporteruniq VARCHAR(15), - instime INT UNSIGNED NOT NULL, - modtime INT UNSIGNED NOT NULL, - status CHAR(1), - - PRIMARY KEY (flagid), - INDEX (journalid, typeid, itemid), - INDEX (instime), - INDEX (reporterid), - INDEX (status) -) -EOC - # clustered register_tablecreate("usermsg", <<'EOC'); CREATE TABLE usermsg ( @@ -3195,11 +3174,6 @@ register_alter(sub { my $dbh = shift; my $runsql = shift; - - if (column_type("content_flag", "reporteruniq") eq "") { - do_alter("content_flag", - "ALTER TABLE content_flag ADD reporteruniq VARCHAR(15) AFTER reporterid"); - } if (column_type("supportcat", "is_selectable") eq "") { do_alter("supportcat", @@ -3807,12 +3781,6 @@ register_alter(sub { "AFTER hide_helpers"); } - unless (column_type("content_flag", "supportid")) { - do_alter("content_flag", - "ALTER TABLE content_flag " . - "ADD supportid INT(10) UNSIGNED NOT NULL DEFAULT '0'"); - } - # add a status column to polls unless (column_type("poll", "status")) { do_alter("poll", diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/Apache/LiveJournal.pm --- a/cgi-bin/Apache/LiveJournal.pm Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/Apache/LiveJournal.pm Wed Apr 01 03:50:07 2009 +0000 @@ -441,7 +441,7 @@ sub trans } # check if this entry or journal contains adult content - if (LJ::is_enabled('content_flag')) { + if ( LJ::is_enabled( 'adult_content' ) ) { # force remote to be checked my $burl = LJ::remote_bounce_url(); return remote_domsess_bounce() if LJ::remote_bounce_url(); @@ -477,14 +477,14 @@ sub trans if ($adult_content ne "none" && $is_journal_page && !$should_show_page) { my $returl = "http://$host" . $r->uri . "$args_wq"; - LJ::ContentFlag->check_adult_cookie($returl, \%BMLCodeBlock::POST, "concepts"); - LJ::ContentFlag->check_adult_cookie($returl, \%BMLCodeBlock::POST, "explicit"); + DW::Logic::AdultContent->check_adult_cookie( $returl, \%BMLCodeBlock::POST, "concepts" ); + DW::Logic::AdultContent->check_adult_cookie( $returl, \%BMLCodeBlock::POST, "explicit" ); - my $cookie = $BML::COOKIE{LJ::ContentFlag->cookie_name($adult_content)}; + my $cookie = $BML::COOKIE{DW::Logic::AdultContent->cookie_name( $adult_content )}; # if they've confirmed that they're over 18, then they're over 14 too if ($adult_content eq "concepts" && !$cookie) { - $cookie = 1 if $BML::COOKIE{LJ::ContentFlag->cookie_name("explicit")}; + $cookie = 1 if $BML::COOKIE{DW::Logic::AdultContent->cookie_name( "explicit" )}; } LJ::set_active_journal( $u ); @@ -495,12 +495,12 @@ sub trans # logged in users without defined ages and logged out users are given confirmation pages (unless they have already confirmed) if ($remote) { if ($adult_content eq "explicit" && $remote->is_minor) { - return $bml_handler->(LJ::ContentFlag->adult_interstitial_path(type => "${adult_content}_blocked")); + return $bml_handler->( DW::Logic::AdultContent->adult_interstitial_path( type => "${adult_content}_blocked" ) ); } elsif (!$remote->best_guess_age && !$cookie) { - return $bml_handler->(LJ::ContentFlag->adult_interstitial_path(type => $adult_content)); + return $bml_handler->( DW::Logic::AdultContent->adult_interstitial_path( type => $adult_content ) ); } } elsif (!$remote && !$cookie) { - return $bml_handler->(LJ::ContentFlag->adult_interstitial_path(type => $adult_content)); + return $bml_handler->( DW::Logic::AdultContent->adult_interstitial_path( type => $adult_content ) ); } } } @@ -1224,7 +1224,7 @@ sub journal_content my $u = LJ::load_user($RQ{'user'}); return 404 unless $u; - $u->preload_props("opt_blockrobots", "adult_content", "admin_content_flag"); + $u->preload_props("opt_blockrobots", "adult_content"); $r->content_type("text/plain"); # $r->send_http_header(); my @extra = LJ::run_hook("robots_txt_extra", $u), (); diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/DW/Logic/AdultContent.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cgi-bin/DW/Logic/AdultContent.pm Wed Apr 01 03:50:07 2009 +0000 @@ -0,0 +1,167 @@ +#!/usr/bin/perl +# +# DW::Logic::AdultContent +# +# This module provides logic for various adult content related functions. +# +# Authors: +# Janine Costanzo <janine@netrophic.com> +# +# Copyright (c) 2009 by Dreamwidth Studios, LLC. +# +# This program is free software; you may redistribute it and/or modify it under +# the same terms as Perl itself. For a copy of the license, please reference +# 'perldoc perlartistic' or 'perldoc perlgpl'. +# + +package DW::Logic::AdultContent; + +use strict; + +# changes an adult post into a fake LJ-cut if this journal/entry is marked as adult content +# and the viewer doesn't want to see such entries +sub transform_post { + my ( $class, %opts ) = @_; + + my $post = delete $opts{post} or return ''; + return $post unless LJ::is_enabled( 'adult_content' ); + + my $entry = $opts{entry} or return $post; + my $journal = $opts{journal} or return $post; + my $remote = delete $opts{remote} || LJ::get_remote(); + + # we should show the entry expanded if: + # the remote user owns the journal that the entry is posted in OR + # the remote user posted the entry + my $poster = $entry->poster; + return $post if LJ::isu( $remote ) && ( $remote->can_manage( $journal ) || $remote->equals( $poster ) ); + + my $adult_content = $entry->adult_content_calculated || $journal->adult_content_calculated; + return $post if $adult_content eq 'none'; + + my $view_adult = LJ::isu( $remote ) ? $remote->hide_adult_content : 'concepts'; + if ( !$view_adult || $view_adult eq 'none' || ( $view_adult eq 'explicit' && $adult_content eq 'concepts' ) ) { + return $post; + } + + # return a fake LJ-cut going to an adult content warning interstitial page + my $adult_interstitial = sub { + return $class->adult_interstitial_link( type => shift(), %opts ) || $post; + }; + + if ( $adult_content eq 'concepts' ) { + return $adult_interstitial->( 'concepts' ); + } elsif ( $adult_content eq 'explicit' ) { + return $adult_interstitial->( 'explicit' ); + } + + return $post; +} + +# returns an link to an adult content warning page +sub adult_interstitial_link { + my ( $class, %opts ) = @_; + + my $entry = $opts{entry}; + my $type = $opts{type}; + return '' unless $entry && $type; + + my $url = $entry->url; + my $msg; + + my $markedby = $entry->adult_content_marker; + + if ( $type eq 'explicit' ) { + $msg = LJ::Lang::ml( 'contentflag.viewingexplicit.by' . $markedby ); + } else { + $msg = LJ::Lang::ml( 'contentflag.viewingconcepts.by' . $markedby ); + } + + return '' unless $msg; + + my $fake_cut = qq{<b>( <a href="$url">$msg</a> )</b>}; + return $fake_cut; +} + +# returns path for adult content warning page +sub adult_interstitial_path { + my ( $class, %opts ) = @_; + + my $type = $opts{type}; + return '' unless $type; + + my $path = "$LJ::HOME/htdocs/misc/adult_${type}.bml"; + return $path; +} + +sub interstitial_reason { + my ( $class, $journal, $entry ) = @_; + my $poster = defined $entry ? $entry->poster : $journal; + my $ret = ""; + my $reason_exists = 0; + + if ( $journal->adult_content ne 'none' && $journal->adult_content_reason ) { + my $what = $journal->is_community ? 'community' : 'journal'; + my $reason = LJ::ehtml( $journal->adult_content_reason ); + + if ( $journal->adult_content_calculated eq 'concepts' ) { + $ret .= LJ::Lang::ml( '/misc/adult_content.bml.message.concepts.' . $what . 'reason', { journal => $journal->ljuser_display, poster => $poster->ljuser_display, reason => $reason } ); + } else { + $ret .= LJ::Lang::ml( '/misc/adult_content.bml.message.explicit.' . $what . 'reason', { journal => $journal->ljuser_display, poster => $poster->ljuser_display, reason => $reason } ); + } + + $reason_exists = 1; + } + + if ( defined $entry && $entry->adult_content && $entry->adult_content ne 'none' && $entry->adult_content_reason ) { + $ret .= "<br />" if $reason_exists; + my $reason = LJ::ehtml( $entry->adult_content_reason ); + + if ( $entry->adult_content eq 'concepts' ) { + $ret .= LJ::Lang::ml( '/misc/adult_content.bml.message.concepts.byposter.reason', { journal => $journal->ljuser_display, poster => $poster->ljuser_display, reason => $reason } ); + } else { + $ret .= LJ::Lang::ml( '/misc/adult_content.bml.message.explicit.byposter.reason', { journal => $journal->ljuser_display, poster => $poster->ljuser_display, reason => $reason } ); + } + $reason_exists = 1; + } + + if ( defined $entry && $entry->adult_content_maintainer && $entry->adult_content_maintainer ne 'none' && $entry->adult_content_maintainer_reason ) { + $ret .= "<br />" if $reason_exists; + my $reason = LJ::ehtml( $entry->adult_content_maintainer_reason ); + + if ( $entry->adult_content_maintainer eq 'concepts' ) { + $ret .= LJ::Lang::ml( '/misc/adult_content.bml.message.concepts.byjournal.reason', { journal => $journal->ljuser_display, poster => $poster->ljuser_display, reason => $reason } ); + } else { + $ret .= LJ::Lang::ml( '/misc/adult_content.bml.message.explicit.byjournal.reason', { journal => $journal->ljuser_display, poster => $poster->ljuser_display, reason => $reason } ); + } + $reason_exists = 1; + } + + if ( $reason_exists ) { + $ret = "<tr><td colspan=\"2\">\n$ret\n</td></tr>\n"; + } + + return $ret; +} + +sub check_adult_cookie { + my ( $class, $returl, $postref, $type ) = @_; + + my $cookiename = __PACKAGE__->cookie_name( $type ); + return undef unless $cookiename; + + my $has_seen = $BML::COOKIE{$cookiename}; + my $adult_check = $postref->{adult_check}; + + BML::set_cookie( $cookiename => '1', 0 ) if $adult_check; + return $has_seen || $adult_check ? $returl : undef; +} + +sub cookie_name { + my ( $class, $type ) = @_; + + return "" unless $type eq "concepts" || $type eq "explicit"; + return "adult_$type"; +} + +1; diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/DW/Setting/AdultContentReason.pm --- a/cgi-bin/DW/Setting/AdultContentReason.pm Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/DW/Setting/AdultContentReason.pm Wed Apr 01 03:50:07 2009 +0000 @@ -7,7 +7,7 @@ sub should_render { sub should_render { my ( $class, $u ) = @_; - return !LJ::is_enabled( "content_flag" ) || !$u || $u->is_identity ? 0 : 1; + return !LJ::is_enabled( 'adult_content' ) || !$u || $u->is_identity ? 0 : 1; } sub label { diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/Console/Command/SetFlag.pm --- a/cgi-bin/LJ/Console/Command/SetFlag.pm Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -package LJ::Console::Command::SetFlag; - -use strict; -use base qw(LJ::Console::Command); -use Carp qw(croak); - -sub cmd { "set_flag" } - -sub desc { "Set a content flag for an account or an entry." } - -sub args_desc { [ - 'content' => "The username of the account or the URL of the entry", - 'state' => "Options are: 'explicit_adult', 'hate_speech', 'illegal_activity', 'child_porn', 'self_harm', 'sexual_content', 'other', or 'none' (which unsets the flag)", - 'reason' => "Reason why the action is being done", - ] } - -sub usage { '<content> <state> <reason>' } - -sub can_execute { - my $remote = LJ::get_remote(); - return $remote && $remote->can_admin_content_flagging ? 1 : 0; -} - -sub execute { - my ($self, $content, $state, $reason, @args) = @_; - - return $self->error("This command takes three arguments. Consult the reference.") - unless $content && $state && $reason && scalar(@args) == 0; - - # check to see if it's a user or an entry - my $u = LJ::load_user($content); - my $entry = LJ::Entry->new_from_url($content); - my ($type, $content_obj, $for_u); - if ($u && !$entry) { - $type = "Journal"; - $content_obj = $u; - $for_u = $u; - } elsif (!$u && $entry) { - $type = "Entry"; - $content_obj = $entry; - $for_u = $entry->journal; - } else { - return $self->error("First argument must be either a username or the URL to an entry."); - } - - return $self->error("Second argument must be one of: 'explicit_adult', 'hate_speech', 'illegal_activity', 'child_porn', 'self_harm', 'sexual_content', 'other', or 'none'.") - unless $state =~ /^(?:explicit_adult|hate_speech|illegal_activity|child_porn|self_harm|sexual_content|other|none)$/; - - if ($content_obj->admin_content_flag eq $state) { - return $self->error("$type is already flagged as: $state"); - } elsif (!$content_obj->admin_content_flag && $state eq "none") { - return $self->error("$type already doesn't have a content flag set."); - } - - if ($state eq "none") { - $content_obj->set_prop("admin_content_flag", undef); - $self->print("${type}'s content flag has been unset."); - } else { - $content_obj->set_prop("admin_content_flag", $state); - $self->print("$type has been flagged as: $state"); - } - - my $remote = LJ::get_remote(); - if ($type eq "Journal") { - LJ::statushistory_add($for_u, $remote, "set_flag", "journal flagged as $state: " . $reason); - } else { # entry - LJ::statushistory_add($for_u, $remote, "set_flag", "$content flagged as $state: " . $reason); - } - - return 1; -} - -1; diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/ContentFlag.pm --- a/cgi-bin/LJ/ContentFlag.pm Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,799 +0,0 @@ -use strict; -package LJ::ContentFlag; -use Carp qw (croak); -use Digest::MD5; - -use constant { - # status - NEW => 'N', - CLOSED => 'C', - - FLAG_EXPLICIT_ADULT => 'E', - FLAG_HATRED => 'H', - FLAG_ILLEGAL => 'I', - FLAG_CHILD_PORN => 'P', - FLAG_SELF_HARM => 'X', - FLAG_SEXUAL => 'L', - FLAG_OTHER => 'R', - - # these are not used - ABUSE_WARN => 'W', - ABUSE_DELETE => 'D', - ABUSE_SUSPEND => 'S', - ABUSE_TERMINATE => 'T', - ABUSE_FLAG_ADULT=> 'E', - REPORTER_BANNED => 'B', - PERM_OK => 'O', - - # category - CHILD_PORN => 1, - ILLEGAL_ACTIVITY => 2, - ILLEGAL_CONTENT => 3, # not used - EXPLICIT_ADULT_CONTENT => 4, - OFFENSIVE_CONTENT => 5, - HATRED_SITE => 6, - SPAM => 7, - - # type - ENTRY => 1, - COMMENT => 2, - JOURNAL => 3, - PROFILE => 4, -}; - -# constants to English -our %CAT_NAMES = ( - LJ::ContentFlag::CHILD_PORN => "Nude Images of Minors", - LJ::ContentFlag::ILLEGAL_ACTIVITY => "Illegal Activity", - LJ::ContentFlag::EXPLICIT_ADULT_CONTENT => "Age 18 and Over Only", - LJ::ContentFlag::OFFENSIVE_CONTENT => "Offensive Content", - LJ::ContentFlag::HATRED_SITE => "Hate Speech", - LJ::ContentFlag::SPAM => "Spam", -); - -our @CAT_ORDER = ( - LJ::ContentFlag::SPAM, - LJ::ContentFlag::EXPLICIT_ADULT_CONTENT, - LJ::ContentFlag::OFFENSIVE_CONTENT, - LJ::ContentFlag::HATRED_SITE, - LJ::ContentFlag::ILLEGAL_ACTIVITY, - LJ::ContentFlag::CHILD_PORN, -); - -# categories that, when selected by the user, will bring them to an Abuse report form -# value is the key name of the section of the abuse form that the user should start at -our %CATS_TO_ABUSE = ( - LJ::ContentFlag::HATRED_SITE => "hatespeech", - LJ::ContentFlag::ILLEGAL_ACTIVITY => "illegal", - LJ::ContentFlag::CHILD_PORN => "childporn", -); - -# categories that, when selected by the user, should handle the reported content as spam -our @CATS_TO_SPAMREPORTS = ( - LJ::ContentFlag::SPAM, -); - -our %STATUS_NAMES = ( - LJ::ContentFlag::NEW => 'New', - LJ::ContentFlag::CLOSED => 'Marked as Bogus Report (No Action)', - LJ::ContentFlag::FLAG_EXPLICIT_ADULT => 'Flagged as Age 18 and Over Only', - LJ::ContentFlag::FLAG_HATRED => 'Flagged as Hate Speech', - LJ::ContentFlag::FLAG_ILLEGAL => 'Flagged as Illegal Activity', - LJ::ContentFlag::FLAG_CHILD_PORN => 'Flagged as Nude Images of Minors', - LJ::ContentFlag::FLAG_SELF_HARM => 'Flagged as Self Harm', - LJ::ContentFlag::FLAG_SEXUAL => 'Flagged as Sexual Content', - LJ::ContentFlag::FLAG_OTHER => 'Flagged as Other', -); - -sub category_names { \%CAT_NAMES } -sub category_order { \@CAT_ORDER } -sub categories_to_abuse { \%CATS_TO_ABUSE } -sub categories_to_spamreports { \@CATS_TO_SPAMREPORTS } -sub status_names { \%STATUS_NAMES } - -our @fields; - -# there has got to be a better way to use fields with a list -BEGIN { - @fields = qw (flagid journalid typeid itemid catid reporterid reporteruniq instime modtime status); - eval "use fields qw(" . join (' ', @fields) . " _count); 1;" or die $@; -}; - - -####### Class methods - - -# create a flag for an item -# opts: -# $item or $type + $itemid - need to pass $item (entry, comment, etc...) or $type constant with $itemid -# $journal - journal the $item is in (not needed if $item passed) -# $reporter - person flagging this item -# $cat - category constant (why is the reporter flagging this?) -sub create { - my ($class, %opts) = @_; - - my $journal = delete $opts{journal} || LJ::load_userid(delete $opts{journalid}); - my $type = delete $opts{type} || delete $opts{typeid}; - my $item = delete $opts{item}; - my $itemid = delete $opts{itemid}; - my $reporter = (delete $opts{reporter} || LJ::get_remote()) or croak 'no reporter'; - my $cat = delete $opts{cat} || delete $opts{catid} or croak 'no category'; - - croak "need item or type" unless $item || $type; - croak "need journal" unless $journal; - - croak "unknown options: " . join(', ', keys %opts) if %opts; - - # if $item passed, get itemid and type from it - if ($item) { - if ($item->isa("LJ::Entry")) { - $itemid = $item->ditemid; - $type = ENTRY; - } else { - croak "unknown item type: $item"; - } - } - - my $uniq = LJ::UniqCookie->current_uniq; - - my %flag = ( - journalid => $journal->id, - itemid => $itemid, - typeid => $type, - catid => $cat, - reporterid => $reporter->id, - status => LJ::ContentFlag::NEW, - instime => time(), - reporteruniq => $uniq, - ); - - my $dbh = LJ::get_db_writer() or die "could not get db writer"; - my @params = keys %flag; - my $bind = LJ::bindstr(@params); - $dbh->do("INSERT INTO content_flag (" . join(',', @params) . ") VALUES ($bind)", - undef, map { $flag{$_} } @params); - die $dbh->errstr if $dbh->err; - - my $flagid = $dbh->{mysql_insertid}; - die "did not get an insertid" unless defined $flagid; - - # log this rating - LJ::rate_log($reporter, 'ctflag', 1); - - $flag{flagid} = $flagid; - my ($dbflag) = $class->absorb_row(\%flag); - return $dbflag; -} -# alias flag() to create() -*flag = \&create; - -*load_by_flagid = \&load_by_id; -sub load_by_id { - my ($class, $flagid, %opts) = @_; - return undef unless $flagid; - return $class->load(flagid => $flagid+0, %opts); -} - -sub load_by_flagids { - my ($class, $flagidsref, %opts) = @_; - croak "not passed a flagids arrayref" unless ref $flagidsref && ref $flagidsref eq 'ARRAY'; - return () unless @$flagidsref; - return $class->load(flagids => $flagidsref, %opts); -} - -sub load_by_journal { - my ($class, $journal, %opts) = @_; - return $class->load(journalid => LJ::want_userid($journal), %opts); -} - -sub load_by_status { - my ($class, $status, %opts) = @_; - return $class->load(status => $status, %opts); -} - -# load flags marked NEW -sub load_outstanding { - my ($class, %opts) = @_; - return $class->load(status => LJ::ContentFlag::NEW, %opts); -} - -# given a flag, find other flags that have the same journalid, typeid, itemid, catid -sub find_similar_flags { - my ($self, %opts) = @_; - return $self->load( - journalid => $self->journalid, - itemid => $self->itemid, - typeid => $self->typeid, - catid => $self->catid, - %opts, - ); -} - -sub find_similar_flagids { - my ($self, %opts) = @_; - my $dbr = LJ::get_db_reader(); - my $flagids = $dbr->selectcol_arrayref("SELECT flagid FROM content_flag WHERE " . - "journalid=? AND typeid=? AND itemid=? AND catid=? AND flagid != ? LIMIT 1000", - undef, $self->journalid, $self->typeid, $self->itemid, $self->catid, $self->flagid); - die $dbr->errstr if $dbr->err; - return @$flagids; -} - -# load rows from DB -# if $opts{lock}, this will lock the result set for a while so that -# other people won't get the same set of flags to work on -# -# other opts: -# limit, catid, status, flagid, flagids (arrayref), sort -sub load { - my ($class, %opts) = @_; - - my $instime = $opts{from}; - - # default to showing everything in the past month - $instime = time() - 86400*30 unless defined $instime; - $opts{instime} ||= $instime; - - my $limit = $opts{limit}+0 || 1000; - - my $catid = $opts{catid}; - my $status = $opts{status}; - my $flagid = $opts{flagid}; - my $flagidsref = $opts{flagids}; - - croak "cannot pass flagid and flagids" if $flagid && $flagidsref; - - my $sort = $opts{sort}; - - my $fields = join(',', @fields); - - my $dbr = LJ::get_db_reader() or die "Could not get db reader"; - - my @vals = (); - my $constraints = ""; - - # add other constraints - foreach my $c (qw( journalid typeid itemid catid status flagid modtime instime reporterid )) { - my $val = delete $opts{$c} or next; - - my $cmp = '='; - - # use > for selecting by time, = for everything else - if ($c eq 'modtime' || $c eq 'instime') { - $cmp = '>'; - } - - # build sql - $constraints .= ($constraints ? " AND " : " ") . "$c $cmp ?"; - push @vals, $val; - } - - if ($flagidsref) { - my @flagids = @$flagidsref; - my $bind = LJ::bindstr(@flagids); - $constraints .= ($constraints ? " AND " : " ") . "flagid IN ($bind)"; - push @vals, @flagids; - } - - croak "no constraints specified" unless $constraints; - - my @locked; - - if ($opts{lock}) { - if (my @locked = $class->locked_flags) { - my $lockedbind = LJ::bindstr(@locked); - $constraints .= " AND flagid NOT IN ($lockedbind)"; - push @vals, @locked; - } - } - - my $groupby = ''; - - $sort =~ s/\W//g if $sort; - - if ($opts{group}) { - $groupby = ' GROUP BY journalid,typeid,itemid'; - $fields .= ',COUNT(flagid) as count'; - $sort ||= 'count'; - } - - $sort ||= 'instime'; - - my $sql = "SELECT $fields FROM content_flag WHERE $constraints $groupby ORDER BY $sort DESC LIMIT $limit"; - print STDERR $sql if $opts{debug}; - - my $rows = $dbr->selectall_arrayref($sql, undef, @vals); - die $dbr->errstr if $dbr->err; - - if ($opts{lock}) { - # lock flagids for a few minutes - my @flagids = map { $_->[0] } @$rows; - - # lock flags on the same items as well - my @items = $class->load_by_flagids(\@flagids); - my @related_flagids = map { $_->find_similar_flagids } @items; - - push @flagids, (@related_flagids, @locked); - - $class->lock(@flagids); - } - - return map { $class->absorb_row($_) } @$rows; -} - -sub locked_flags { - my $class = shift; - my %locked = $class->_locked_values; - return keys %locked; -} - -sub _locked_values { - my $class = shift; - my %locked = %{ LJ::MemCache::get($class->memcache_key) || {} }; - - # delete out flags that were locked >5 minutes ago - foreach (keys %locked) { - delete $locked{$_} if $locked{$_} < time() - 5*60; - } - - return %locked; -} - - -# append these flagids to the locked set -sub lock { - my ($class, @flagids) = @_; - my %locked = $class->_locked_values; - - # add in the new flags - $locked{$_} = time() foreach @flagids; - - LJ::MemCache::set($class->memcache_key, \%locked, 5 * 60); -} - -# remove these flagids from the locked set -sub unlock { - my ($class, @flagids) = @_; - - # if there's nothing memcached, there's nothing to unlock! - my %locked = $class->_locked_values - or return; - - delete $locked{$_} foreach @flagids; - - LJ::MemCache::set($class->memcache_key, \%locked, 5 * 60); -} - -sub memcache_key { 'ct_flag_locked' } - -sub absorb_row { - my ($class, $row) = @_; - - my $self = fields::new($class); - - if (ref $row eq 'ARRAY') { - $self->{$_} = (shift @$row) foreach @fields; - $self->{_count} = (shift @$row) if @$row; - } elsif (ref $row eq 'HASH') { - $self->{$_} = $row->{$_} foreach @fields; - - if ($row->{'count'}) { - $self->{_count} = $row->{'count'}; - } - } else { - croak "unknown row type"; - } - - return $self; -} - -# given journalid, typeid, and itemid returns user objects of all the reporters of this item, along with the support requests they opened -sub get_reporters { - my ($class, %opts) = @_; - - croak "invalid params" unless $opts{journalid} && $opts{typeid}; - $opts{itemid} += 0; - - my $dbr = LJ::get_db_reader(); - my $sth = $dbr->prepare('SELECT reporterid, supportid FROM content_flag WHERE ' . - 'journalid=? AND typeid=? AND itemid=? ORDER BY instime DESC LIMIT 1000'); - $sth->execute($opts{journalid}, $opts{typeid}, $opts{itemid}); - die $dbr->errstr if $dbr->err; - - my @rows = (); - while (my $row = $sth->fetchrow_hashref) { - push @rows, $row; - } - - return @rows; -} - -sub requests_exist_for_flag { - my ($class, $flag) = @_; - - my @reporters = $class->get_reporters( journalid => $flag->journalid, typeid => $flag->typeid, itemid => $flag->itemid ); - foreach my $reporter (@reporters) { - return 1 if $reporter->{supportid}; - } - - return 0; -} - -# returns a hash of catid => count -sub flag_count_by_category { - my ($class, %opts) = @_; - - # this query is unpleasant, so memcache it - my $countref = LJ::MemCache::get('ct_flag_cat_count'); - return %$countref if $countref; - - my $dbr = LJ::get_db_reader(); - my $rows = $dbr->selectall_hashref("SELECT catid, COUNT(*) as cat_count FROM content_flag " . - "WHERE status = 'N' GROUP BY catid", 'catid'); - die $dbr->errstr if $dbr->err; - - my %count = map { $_, $rows->{$_}->{cat_count} } keys %$rows; - - LJ::MemCache::set('ct_flag_cat_count', \%count, 5); - - return %count; -} - -sub get_most_common_cat_for_flag { - my ($class, %opts) = @_; - - my $dbr = LJ::get_db_reader(); - my $sth = $dbr->prepare("SELECT catid, COUNT(catid) as cat_count FROM content_flag " . - "WHERE journalid = ? AND typeid = ? AND itemid = ? GROUP BY catid"); - $sth->execute($opts{journalid}, $opts{typeid}, $opts{itemid}); - die $dbr->errstr if $dbr->err; - - my $cat_max = 0; - my $catid_with_max; - while (my $row = $sth->fetchrow_hashref) { - if ($row->{cat_count} > $cat_max) { - $cat_max = $row->{cat_count}; - $catid_with_max = $row->{catid}; - } - } - - return $catid_with_max; -} - -# returns a url for flagging this item -# pass in LJ::User, LJ::Entry or LJ::Comment -sub flag_url { - my ($class, $item, %opts) = @_; - - return unless $item && ref $item; - - my $type = $opts{type} || ''; - my $base_url = "$LJ::SITEROOT/tools/content_flag.bml"; - - if ($item->isa('LJ::User')) { - return "$base_url?user=" . $item->user; - } elsif ($item->isa('LJ::Entry')) { - my $ditemid = $item->valid ? $item->ditemid : 0; - return "$base_url?user=" . $item->journal->user . "&itemid=$ditemid"; - } - - croak "Unknown item $item passed to flag_url"; -} - -sub adult_flag_url { - my ($class, $item) = @_; - - return $class->flag_url($item, type => 'adult'); -} - -# changes an adult post into a fake LJ-cut if this journal/entry is marked as adult content -# and the viewer doesn't want to see such entries -sub transform_post { - my ($class, %opts) = @_; - - my $post = delete $opts{post} or return ''; - return $post if LJ::conf_test($LJ::DISABLED{content_flag}); - - my $entry = $opts{entry} or return $post; - my $journal = $opts{journal} or return $post; - my $remote = delete $opts{remote} || LJ::get_remote(); - - # we should show the entry expanded if: - # the remote user owns the journal that the entry is posted in OR - # the remote user posted the entry - my $poster = $entry->poster; - return $post if LJ::isu($remote) && ($remote->can_manage($journal) || $remote->equals($poster)); - - my $adult_content = $entry->adult_content_calculated || $journal->adult_content_calculated; - return $post if $adult_content eq 'none'; - - my $view_adult = LJ::isu($remote) ? $remote->hide_adult_content : 'concepts'; - if (!$view_adult || $view_adult eq 'none' || ($view_adult eq 'explicit' && $adult_content eq 'concepts')) { - return $post; - } - - # return a fake LJ-cut going to an adult content warning interstitial page - my $adult_interstitial = sub { - return $class->adult_interstitial_link(type => shift(), %opts) || $post; - }; - - if ($adult_content eq 'concepts') { - return $adult_interstitial->('concepts'); - } elsif ($adult_content eq 'explicit') { - return $adult_interstitial->('explicit'); - } - - return $post; -} - -# returns url for adult content warning page -sub adult_interstitial_url { - my ($class, %opts) = @_; - - my $type = $opts{type}; - my $entry = $opts{entry}; - return '' unless $type; - - my $ret = $opts{ret}; - $ret ||= $entry->url if $entry; - - my $url = "$LJ::SITEROOT/misc/adult_${type}.bml"; - $url .= "?ret=$ret" if $ret; - - return $url; -} - -# returns path for adult content warning page -sub adult_interstitial_path { - my ($class, %opts) = @_; - - my $type = $opts{type}; - return '' unless $type; - - my $path = "$LJ::HOME/htdocs/misc/adult_${type}.bml"; - return $path; -} - -# returns an link to an adult content warning page -sub adult_interstitial_link { - my ($class, %opts) = @_; - - my $entry = $opts{entry}; - my $type = $opts{type}; - return '' unless $entry && $type; - - my $url = $entry->url; - my $msg; - - my $markedby = $entry->adult_content_marker; - - if ($type eq 'explicit') { - $msg = LJ::Lang::ml('contentflag.viewingexplicit.by' . $markedby); - } else { - $msg = LJ::Lang::ml('contentflag.viewingconcepts.by' . $markedby); - } - - return '' unless $msg; - - my $fake_cut = qq {<b>( <a href="$url">$msg</a> )</b>}; - return $fake_cut; -} - -sub check_adult_cookie { - my ($class, $returl, $postref, $type) = @_; - - my $cookiename = __PACKAGE__->cookie_name($type); - return undef unless $cookiename; - - my $has_seen = $BML::COOKIE{$cookiename}; - my $adult_check = $postref->{adult_check}; - - BML::set_cookie($cookiename => '1', 0) if $adult_check; - return ($has_seen || $adult_check) ? $returl : undef; -} - -sub cookie_name { - my ($class, $type) = @_; - - return "" unless $type eq "concepts" || $type eq "explicit"; - return "adult_$type"; -} - -sub interstitial_reason { - my ( $journal, $entry ) = @_; - my $poster = defined( $entry ) ? $entry->poster : $journal; - my $ret = ""; - my $reason_exists = 0; - - if ($journal->adult_content ne 'none' && $journal->adult_content_reason) { - my $what = $journal->is_community ? 'community' : 'journal'; - my $reason = LJ::ehtml($journal->adult_content_reason); - - if ($journal->adult_content_calculated eq 'concepts') { - $ret .= LJ::Lang::ml('/misc/adult_content.bml.message.concepts.' . $what . 'reason',{'journal' => $journal->ljuser_display, 'poster' => $poster->ljuser_display, 'reason' => $reason}); - } else { - $ret .= LJ::Lang::ml('/misc/adult_content.bml.message.explicit.' . $what . 'reason',{'journal' => $journal->ljuser_display, 'poster' => $poster->ljuser_display, 'reason' => $reason}); - } - - $reason_exists = 1; - } - - if (defined($entry) && $entry->adult_content && $entry->adult_content ne 'none' && $entry->adult_content_reason) { - $ret .= "<br/>" if ($reason_exists); - my $reason = LJ::ehtml($entry->adult_content_reason); - - if ($entry->adult_content eq 'concepts') { - $ret .= LJ::Lang::ml('/misc/adult_content.bml.message.concepts.byposter.reason',{'journal' => $journal->ljuser_display, 'poster' => $poster->ljuser_display, 'reason' => $reason}); - } else { - $ret .= LJ::Lang::ml('/misc/adult_content.bml.message.explicit.byposter.reason',{'journal' => $journal->ljuser_display, 'poster' => $poster->ljuser_display, 'reason' => $reason}); - } - $reason_exists = 1; - } - - if (defined($entry) && $entry->adult_content_maintainer && $entry->adult_content_maintainer ne 'none' && $entry->adult_content_maintainer_reason) { - $ret .= "<br/>" if ($reason_exists); - my $reason = LJ::ehtml($entry->adult_content_maintainer_reason); - - if ($entry->adult_content_maintainer eq 'concepts') { - $ret .= LJ::Lang::ml('/misc/adult_content.bml.message.concepts.byjournal.reason',{'journal' => $journal->ljuser_display, 'poster' => $poster->ljuser_display, 'reason' => $reason}); - } else { - $ret .= LJ::Lang::ml('/misc/adult_content.bml.message.explicit.byjournal.reason',{'journal' => $journal->ljuser_display, 'poster' => $poster->ljuser_display, 'reason' => $reason}); - } - $reason_exists = 1; - } - - if ($reason_exists) { - $ret = "<tr><td colspan=\"2\">\n$ret\n</td></tr>\n"; - } - - return $ret; -} - -######## instance methods - -sub u { LJ::load_userid($_[0]->journalid) } -sub flagid { $_[0]->{flagid} } -sub status { $_[0]->{status} } -sub catid { $_[0]->{catid} } -sub modtime { $_[0]->{modtime} } -sub typeid { $_[0]->{typeid} } -sub itemid { $_[0]->{itemid} } -sub count { $_[0]->{_count} } -sub journalid { $_[0]->{journalid} } -sub reporter { LJ::load_userid($_[0]->{reporterid}) } - -sub set_field { - my ($self, $field, $val) = @_; - my $dbh = LJ::get_db_writer() or die; - - my $modtime = time(); - - $dbh->do("UPDATE content_flag SET $field = ?, modtime = UNIX_TIMESTAMP() WHERE flagid = ?", undef, - $val, $self->flagid); - die $dbh->errstr if $dbh->err; - - $self->{$field} = $val; - $self->{modtime} = $modtime; - - return 1; -} - -sub set_status { - my ($self, $status) = @_; - return $self->set_field('status', $status); -} - -# returns flagged item (entry, comment, etc...) -sub item { - my ($self, $status) = @_; - - my $typeid = $self->typeid; - if ($typeid == LJ::ContentFlag::ENTRY) { - return LJ::Entry->new($self->u, ditemid => $self->itemid); - } elsif ($typeid == LJ::ContentFlag::COMMENT) { - return LJ::Comment->new($self->u, dtalkid => $self->itemid); - } - - return undef; -} - -sub url { - my $self = shift; - - if ($self->item) { - return $self->item->url; - } elsif ($self->typeid == LJ::ContentFlag::JOURNAL) { - return $self->u->journal_base; - } elsif ($self->typeid == LJ::ContentFlag::PROFILE) { - return $self->u->profile_url('full' => 1); - } else { - return undef; - } - -} - -sub summary { - -} - -sub close { $_[0]->set_status(LJ::ContentFlag::CLOSED) } - -sub delete { - my ($self) = @_; - my $dbh = LJ::get_db_writer() or die; - - $dbh->do("DELETE FROM content_flag WHERE flagid = ?", undef, $self->flagid); - die $dbh->errstr if $dbh->err; - - return 1; -} - - -sub move_to_abuse { - my ($class, $action, @flags) = @_; - - return unless $action; - return unless @flags; - - my %req; - $req{reqtype} = "email"; - $req{reqemail} = $LJ::CONTENTFLAG_EMAIL; - $req{no_autoreply} = 1; - - if ($action eq LJ::ContentFlag::FLAG_CHILD_PORN) { - $req{spcatid} = $LJ::CONTENTFLAG_PRIORITY; - } else { - $req{spcatid} = $LJ::CONTENTFLAG_ABUSE; - } - - return unless $req{spcatid}; - - # take one flag, should be representative of all - my $flag = $flags[0]; - $req{subject} = "$action: " . $flag->u->user; - - $req{body} = "Username: " . $flag->u->user . "\n"; - $req{body} .= "URL: " . $flag->url . "\n"; - $req{body} .= "\n" . "=" x 25 . "\n\n"; - - foreach (@flags) { - $req{body} .= "Reporter: " . $_->reporter->user; - $req{body} .= " (" . $CAT_NAMES{$_->catid} . ")\n"; - } - - $req{flagid} = $flag->flagid; - - my @errors; - # returns support request id - return LJ::Support::file_request(\@errors, \%req); -} - -sub set_supportid { - my ($class, $flagid, $supportid) = @_; - - return 0 unless $flagid && $supportid; - - my $dbh = LJ::get_db_writer(); - $dbh->do("UPDATE content_flag SET supportid = ? WHERE flagid = ?", undef, $supportid, $flagid); - die $dbh->errstr if $dbh->err; - - return 1; -} - -sub get_admin_flag_from_status { - my ($class, $status) = @_; - - my %flags = ( - E => 'explicit_adult', - H => 'hate_speech', - I => 'illegal_activity', - P => 'child_porn', - X => 'self_harm', - L => 'sexual_content', - R => 'other', - ); - - return $flags{$status} || undef; -} - -1; diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/Entry.pm --- a/cgi-bin/LJ/Entry.pm Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/LJ/Entry.pm Wed Apr 01 03:50:07 2009 +0000 @@ -1006,18 +1006,10 @@ sub adult_content_reason { return $self->prop('adult_content_reason'); } -# defined by an admin -sub admin_content_flag { - my $self = shift; - - return $self->prop('admin_content_flag'); -} - -# uses both poster- and admin-defined props to figure out the adult content level +# uses both poster- and maintainer-defined props to figure out the adult content level sub adult_content_calculated { my $self = shift; - return "explicit" if $self->admin_content_flag eq "explicit_adult"; return $self->adult_content_maintainer if $self->adult_content_maintainer; return $self->adult_content; } @@ -1026,7 +1018,6 @@ sub adult_content_marker { sub adult_content_marker { my $self = shift; - return "admin" if $self->admin_content_flag eq "explicit_adult"; return "community" if $self->adult_content_maintainer; return "poster" if $self->adult_content; return $self->journal->adult_content_marker; @@ -1055,16 +1046,12 @@ sub qct_value_for_ads { sub qct_value_for_ads { my $self = shift; - return 0 unless LJ::is_enabled("content_flag"); + return 0 unless LJ::is_enabled( 'adult_content' ); my $adult_content = $self->adult_content_calculated; - my $admin_flag = $self->admin_content_flag; if ($LJ::CONTENT_FLAGS{$adult_content} && $LJ::CONTENT_FLAGS{$adult_content}->{qct_value_for_ads}) { return $LJ::CONTENT_FLAGS{$adult_content}->{qct_value_for_ads}; - } - if ($LJ::CONTENT_FLAGS{$admin_flag} && $LJ::CONTENT_FLAGS{$admin_flag}->{qct_value_for_ads}) { - return $LJ::CONTENT_FLAGS{$admin_flag}->{qct_value_for_ads}; } return 0; @@ -1075,13 +1062,11 @@ sub should_block_robots { return 1 if $self->journal->prop('opt_blockrobots'); - return 0 unless LJ::is_enabled("content_flag"); + return 0 unless LJ::is_enabled( 'adult_content' ); my $adult_content = $self->adult_content_calculated; - my $admin_flag = $self->admin_content_flag; return 1 if $LJ::CONTENT_FLAGS{$adult_content} && $LJ::CONTENT_FLAGS{$adult_content}->{block_robots}; - return 1 if $LJ::CONTENT_FLAGS{$admin_flag} && $LJ::CONTENT_FLAGS{$admin_flag}->{block_robots}; return 0; } diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/M/ProfilePage.pm --- a/cgi-bin/LJ/M/ProfilePage.pm Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/LJ/M/ProfilePage.pm Wed Apr 01 03:50:07 2009 +0000 @@ -35,7 +35,7 @@ sub _init { my @props = qw(country state city zip renamedto journaltitle journalsubtitle public_key url urlname opt_hidefriendofs dont_load_members - opt_blockrobots adult_content admin_content_flag + opt_blockrobots adult_content opt_showmutualfriends fb_num_pubpics opt_showschools); if ($u->is_community) { push @props, qw(moderated comm_theme); diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/S2.pm --- a/cgi-bin/LJ/S2.pm Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/LJ/S2.pm Wed Apr 01 03:50:07 2009 +0000 @@ -1860,7 +1860,6 @@ sub Entry push @$link_keyseq, 'tell_friend' unless $LJ::DISABLED{'tellafriend'}; push @$link_keyseq, 'watch_comments' unless $LJ::DISABLED{'esn'}; push @$link_keyseq, 'unwatch_comments' unless $LJ::DISABLED{'esn'}; - push @$link_keyseq, 'flag' unless LJ::conf_test($LJ::DISABLED{content_flag}); # Note: nav_prev and nav_next are not included in the keyseq anticipating # that their placement relative to the others will vary depending on @@ -3655,15 +3654,6 @@ sub _Entry__get_link $ctx->[S2::PROPS]->{"text_entry_next"}, LJ::S2::Image("$LJ::IMGPREFIX/btn_next.gif", 22, 20)); } - if ($key eq "flag") { - return $null_link unless LJ::is_enabled("content_flag"); - - my $entry = LJ::Entry->new($journalu, ditemid => $this->{itemid}); - return $null_link unless $remote && $remote->can_see_content_flag_button( content => $entry ); - return LJ::S2::Link(LJ::ContentFlag->adult_flag_url($entry), - $ctx->[S2::PROPS]->{"text_flag"}, - LJ::S2::Image("$LJ::IMGPREFIX/button-flag.gif", 22, 20)); - } my $etypeid = 'LJ::Event::JournalNewComment'->etypeid; my $newentry_etypeid = 'LJ::Event::JournalNewEntry'->etypeid; diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/S2/DayPage.pm --- a/cgi-bin/LJ/S2/DayPage.pm Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/LJ/S2/DayPage.pm Wed Apr 01 03:50:07 2009 +0000 @@ -155,8 +155,8 @@ sub DayPage 'unsuspend_supportid' => $suspend_msg ? $entry_obj->prop("unsuspend_supportid") : 0, }); LJ::expand_embedded($u, $ditemid, $remote, \$text); - $text = LJ::ContentFlag->transform_post(post => $text, journal => $u, - remote => $remote, entry => $entry_obj); + $text = DW::Logic::AdultContent->transform_post( post => $text, journal => $u, + remote => $remote, entry => $entry_obj ); my $nc = ""; $nc .= "nc=$replycount" if $replycount && $remote && $remote->{'opt_nctalklinks'}; diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/S2/FriendsPage.pm --- a/cgi-bin/LJ/S2/FriendsPage.pm Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/LJ/S2/FriendsPage.pm Wed Apr 01 03:50:07 2009 +0000 @@ -3,7 +3,7 @@ use strict; package LJ::S2; -use Class::Autouse qw/LJ::ContentFlag/; +use Class::Autouse qw/ DW::Logic::AdultContent /; sub FriendsPage { @@ -236,8 +236,8 @@ sub FriendsPage 'unsuspend_supportid' => $suspend_msg ? $entry_obj->prop("unsuspend_supportid") : 0, }); LJ::expand_embedded($friends{$friendid}, $ditemid, $remote, \$text); - $text = LJ::ContentFlag->transform_post(post => $text, journal => $friends{$friendid}, - remote => $remote, entry => $entry_obj); + $text = DW::Logic::AdultContent->transform_post( post => $text, journal => $friends{$friendid}, + remote => $remote, entry => $entry_obj ); my $userlite_poster = $get_lite->($posterid); my $userlite_journal = $get_lite->($friendid); diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/S2/RecentPage.pm --- a/cgi-bin/LJ/S2/RecentPage.pm Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/LJ/S2/RecentPage.pm Wed Apr 01 03:50:07 2009 +0000 @@ -175,8 +175,8 @@ sub RecentPage 'unsuspend_supportid' => $suspend_msg ? $entry_obj->prop("unsuspend_supportid") : 0, }); LJ::expand_embedded($u, $ditemid, $remote, \$text); - $text = LJ::ContentFlag->transform_post(post => $text, journal => $u, - remote => $remote, entry => $entry_obj); + $text = DW::Logic::AdultContent->transform_post( post => $text, journal => $u, + remote => $remote, entry => $entry_obj ); my @taglist; while (my ($kwid, $kw) = each %{$tags->{"$u->{userid} $itemid"} || {}}) { diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/Setting/AdultContent.pm --- a/cgi-bin/LJ/Setting/AdultContent.pm Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/LJ/Setting/AdultContent.pm Wed Apr 01 03:50:07 2009 +0000 @@ -6,7 +6,7 @@ sub should_render { sub should_render { my ($class, $u) = @_; - return !LJ::is_enabled("content_flag") || !$u || $u->is_identity ? 0 : 1; + return !LJ::is_enabled( 'adult_content' ) || !$u || $u->is_identity ? 0 : 1; } sub helpurl { diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/Setting/SafeSearch.pm --- a/cgi-bin/LJ/Setting/SafeSearch.pm Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/LJ/Setting/SafeSearch.pm Wed Apr 01 03:50:07 2009 +0000 @@ -6,7 +6,7 @@ sub should_render { sub should_render { my ($class, $u) = @_; - return !LJ::is_enabled("content_flag") || !LJ::is_enabled("safe_search") || !$u || $u->is_community ? 0 : 1; + return !LJ::is_enabled( 'adult_content' ) || !LJ::is_enabled( 'safe_search' ) || !$u || $u->is_community ? 0 : 1; } sub helpurl { diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/Setting/ViewingAdultContent.pm --- a/cgi-bin/LJ/Setting/ViewingAdultContent.pm Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/LJ/Setting/ViewingAdultContent.pm Wed Apr 01 03:50:07 2009 +0000 @@ -6,7 +6,7 @@ sub should_render { sub should_render { my ($class, $u) = @_; - return !LJ::is_enabled("content_flag") || !$u || $u->is_community ? 0 : 1; + return !LJ::is_enabled( 'adult_content' ) || !$u || $u->is_community ? 0 : 1; } sub helpurl { diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/User.pm --- a/cgi-bin/LJ/User.pm Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/LJ/User.pm Wed Apr 01 03:50:07 2009 +0000 @@ -59,7 +59,7 @@ use Class::Autouse qw( ### 11. Birthdays and Age-Related Functions ### 12. Comment-Related Functions ### 13. Community-Related Functions and Authas -### 14. Content Flagging and Adult Content Functions +### 14. Adult Content Functions ### 15. Email-Related Functions ### 16. Entry-Related Functions ### 17. Interest-Related Functions @@ -187,7 +187,7 @@ sub create_community { $u->set_prop("nonmember_posting", $opts{nonmember_posting}+0); $u->set_prop("moderated", $opts{moderated}+0); - $u->set_prop("adult_content", $opts{journal_adult_settings}) if LJ::is_enabled("content_flag"); + $u->set_prop("adult_content", $opts{journal_adult_settings}) if LJ::is_enabled( 'adult_content' ); my $remote = LJ::get_remote(); LJ::set_rel($u, $remote, "A"); # maintainer @@ -309,7 +309,6 @@ sub delete_and_purge_completely { if $u->is_community; $dbh->do("DELETE FROM syndicated WHERE userid=?", undef, $u->id) if $u->is_syndicated; - $dbh->do("DELETE FROM content_flag WHERE journalid=? OR reporterid=?", undef, $u->id, $u->id); return 1; } @@ -2080,13 +2079,11 @@ sub should_block_robots { return 1 if $u->prop('opt_blockrobots'); - return 0 unless LJ::is_enabled("content_flag"); + return 0 unless LJ::is_enabled( 'adult_content' ); my $adult_content = $u->adult_content_calculated; - my $admin_flag = $u->admin_content_flag; return 1 if $LJ::CONTENT_FLAGS{$adult_content} && $LJ::CONTENT_FLAGS{$adult_content}->{block_robots}; - return 1 if $LJ::CONTENT_FLAGS{$admin_flag} && $LJ::CONTENT_FLAGS{$admin_flag}->{block_robots}; return 0; } @@ -2578,7 +2575,7 @@ sub can_join_adult_comm { sub can_join_adult_comm { my ($u, %opts) = @_; - return 1 unless LJ::is_enabled('content_flag'); + return 1 unless LJ::is_enabled( 'adult_content' ); my $adultref = $opts{adultref}; my $comm = $opts{comm} or croak "No community passed"; @@ -3210,9 +3207,7 @@ sub trusts_or_has_member { ######################################################################## -### 14. Content Flagging and Adult Content Functions -### FIXME: Determine which are by-user and which are admin flagging -### (and remove admin flagging as an option) +### 14. Adult Content Functions # defined by the user @@ -3226,20 +3221,11 @@ sub adult_content { } -# uses both user- and admin-defined props to figure out the adult content level +# uses user-defined prop to figure out the adult content level sub adult_content_calculated { my $u = shift; - return "explicit" if $u->admin_content_flag eq "explicit_adult"; return $u->adult_content; -} - - -# defined by an admin -sub admin_content_flag { - my $u = shift; - - return $u->prop('admin_content_flag'); } @@ -3247,7 +3233,6 @@ sub adult_content_marker { sub adult_content_marker { my $u = shift; - return "admin" if $u->admin_content_flag eq "explicit_adult"; return "journal"; } @@ -3257,51 +3242,6 @@ sub adult_content_reason { my $u = shift; return $u->prop('adult_content_reason'); -} - - -sub can_admin_content_flagging { - my $u = shift; - - return 0 unless LJ::is_enabled("content_flag"); - return 1 if $LJ::IS_DEV_SERVER; - return LJ::check_priv($u, "siteadmin", "contentflag"); -} - - -sub can_flag_content { - my $u = shift; - my %opts = @_; - - return 0 unless $u->can_see_content_flag_button(%opts); - return 0 if LJ::sysban_check("contentflag", $u->user); - return 0 unless $u->rate_check("ctflag", 1); - return 1; -} - - -sub can_see_content_flag_button { - my $u = shift; - my %opts = @_; - - return 0 unless LJ::is_enabled("content_flag"); - - my $content = $opts{content}; - - # user can't flag any journal they manage nor any entry they posted - # user also can't flag non-public entries - if (LJ::isu($content)) { - return 0 if $u->can_manage($content); - } elsif ($content->isa("LJ::Entry")) { - return 0 if $u->equals($content->poster); - return 0 unless $content->security eq "public"; - } - - # user can't flag anything if their account isn't at least one month old - my $one_month = 60*60*24*30; - return 0 unless time() - $u->timecreate >= $one_month; - - return 1; } @@ -3346,24 +3286,21 @@ sub should_show_in_search_results { my $u = shift; my %opts = @_; - return 1 unless LJ::is_enabled("content_flag") && LJ::is_enabled("safe_search"); + return 1 unless LJ::is_enabled( 'adult_content' ) && LJ::is_enabled( 'safe_search' ); my $adult_content = $u->adult_content_calculated; - my $admin_flag = $u->admin_content_flag; my $for_u = $opts{for}; unless (LJ::isu($for_u)) { - return $adult_content ne "none" || $admin_flag ? 0 : 1; + return $adult_content eq "none" ? 1 : 0; } my $safe_search = $for_u->safe_search; return 1 if $safe_search == 0; my $adult_content_flag_level = $LJ::CONTENT_FLAGS{$adult_content} ? $LJ::CONTENT_FLAGS{$adult_content}->{safe_search_level} : 0; - my $admin_flag_level = $LJ::CONTENT_FLAGS{$admin_flag} ? $LJ::CONTENT_FLAGS{$admin_flag}->{safe_search_level} : 0; return 0 if $adult_content_flag_level && ($safe_search >= $adult_content_flag_level); - return 0 if $admin_flag_level && ($safe_search >= $admin_flag_level); return 1; } @@ -5221,16 +5158,12 @@ sub qct_value_for_ads { sub qct_value_for_ads { my $u = shift; - return 0 unless LJ::is_enabled("content_flag"); + return 0 unless LJ::is_enabled( 'adult_content' ); my $adult_content = $u->adult_content_calculated; - my $admin_flag = $u->admin_content_flag; if ($LJ::CONTENT_FLAGS{$adult_content} && $LJ::CONTENT_FLAGS{$adult_content}->{qct_value_for_ads}) { return $LJ::CONTENT_FLAGS{$adult_content}->{qct_value_for_ads}; - } - if ($LJ::CONTENT_FLAGS{$admin_flag} && $LJ::CONTENT_FLAGS{$admin_flag}->{qct_value_for_ads}) { - return $LJ::CONTENT_FLAGS{$admin_flag}->{qct_value_for_ads}; } return 0; @@ -8322,7 +8255,7 @@ sub make_journal my @needed_props = ("stylesys", "s2_style", "url", "urlname", "opt_nctalklinks", "renamedto", "opt_blockrobots", "opt_usesharedpic", "icbm", "journaltitle", "journalsubtitle", "external_foaf_url", - "adult_content", "admin_content_flag"); + "adult_content"); # S2 is more fully featured than S1, so sometimes we get here and $eff_view # is reply/month/entry/res and that means it *has* to be S2--S1 defaults to a diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/Widget/ContentFlagReport.pm --- a/cgi-bin/LJ/Widget/ContentFlagReport.pm Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,122 +0,0 @@ -package LJ::Widget::ContentFlagReport; - -use strict; -use base qw(LJ::Widget); -use Carp qw(croak); -use LJ::ContentFlag; - -sub need_res { qw( stc/widgets/contentflagreport.css ) } - -sub render_body { - my $class = shift; - my %opts = @_; - my $ret; - - my $remote = LJ::get_remote() or die "<?needlogin?>"; - - if ($opts{flag}) { - my $url = $opts{flag}->url; - - my $itemtype = $opts{itemid} ? "entry" : "journal"; - my $return_text = $itemtype eq "entry" ? $class->ml('widget.contentflagreport.btn.returnentry') : $class->ml('widget.contentflagreport.btn.returnjournal'); - - $ret .= "<p>" . $class->ml('widget.contentflagreport.done') . "</p>"; - $ret .= "<ul><li><a href='$url'>$return_text</a></li>"; - $ret .= "<li><a href='$LJ::SITEROOT/explore/'>" . $class->ml('widget.contentflagreport.explore', { sitenameabbrev => $LJ::SITENAMEABBREV }) . "</a></li></ul>"; - - return $ret; - } else { - my $ditemid = $opts{itemid}; - my $user = $opts{user}; - my $journal = LJ::load_user($user) or return $class->ml('widget.contentflagreport.error.invalidusername'); - - my $url = $journal->journal_base; - if ($ditemid) { - my $entry = LJ::Entry->new($journal, ditemid => $ditemid); - return $class->ml('widget.contentflagreport.error.invalidentry') unless $entry && $entry->valid; - $url = $entry->url; - } - - my $itemtype = $ditemid ? "entry" : "journal"; - my $btn_text = $itemtype eq "entry" ? $class->ml('widget.contentflagreport.btn.returnentry') : $class->ml('widget.contentflagreport.btn.returnjournal'); - - if ($opts{confirm}) { - my $back_url = $itemtype eq "entry" ? "$LJ::SITEROOT/tools/content_flag.bml?user=$user&itemid=$ditemid" : "$LJ::SITEROOT/tools/content_flag.bml?user=$user"; - - $ret .= $class->ml('widget.contentflagreport.confirm', { aopts => "href='$back_url'" }); - - $ret .= $class->start_form; - $ret .= $class->html_hidden( user => $user, itemid => $ditemid ); - $ret .= "<p>" . $class->html_submit($class->ml('widget.contentflagreport.btn.submit')) . " <a href='$url'>$btn_text</a></p>"; - $ret .= $class->end_form; - } else { - my $spam_url = $itemtype eq "entry" ? "$LJ::SITEROOT/tools/content_flag_spam.bml?user=$user&itemid=$ditemid" : "$LJ::SITEROOT/tools/content_flag_spam.bml?user=$user"; - my $confirm_url = $itemtype eq "entry" ? "$LJ::SITEROOT/tools/content_flag.bml?user=$user&itemid=$ditemid&confirm=1" : "$LJ::SITEROOT/tools/content_flag.bml?user=$user&confirm=1"; - - $ret .= "<p>" . $class->ml('widget.contentflagreport.note') . "</p>"; - $ret .= $class->ml('widget.contentflagreport.description', { - sitename => $LJ::SITENAMESHORT, - spamaopts => "href='$spam_url'", - confirmaopts => "href='$confirm_url'", - }); - - $ret .= $class->start_form; - $ret .= $class->html_hidden( url => $url ); - $ret .= "<p>" . $class->html_submit( return => $btn_text ) . "</p>"; - $ret .= $class->end_form; - } - } - - return $ret; -} - -sub handle_post { - my ($class, $post, %opts) = @_; - - my $remote = LJ::get_remote() or die "<?needlogin?>"; - - if ($post->{return}) { - my $url = LJ::CleanHTML::canonical_url($post->{url}); - - die $class->ml('widget.contentflagreport.error.invalidurl') unless $url; - return BML::redirect($url); - } - - my $journal = LJ::load_user($post->{user}) or die $class->ml('widget.contentflagreport.error.invalidusername'); - my %params = ( - catid => LJ::ContentFlag::EXPLICIT_ADULT_CONTENT, - journal => $journal, - itemid => $post->{itemid}, - type => $post->{itemid} ? LJ::ContentFlag::ENTRY : LJ::ContentFlag::JOURNAL, - ); - - my $cats_to_spamreports = LJ::ContentFlag->categories_to_spamreports; - foreach my $cat (@$cats_to_spamreports) { - if ($cat eq $params{catid}) { - if ($params{itemid}) { # entry - return BML::redirect("$LJ::SITEROOT/tools/content_flag_spam.bml?user=$post->{user}&itemid=$params{itemid}"); - } else { # journal - return BML::redirect("$LJ::SITEROOT/tools/content_flag_spam.bml?user=$post->{user}"); - } - } - } - - # create flag - $params{flag} = LJ::ContentFlag->flag(%params, reporter => $remote); - - my $cats_to_abuse = LJ::ContentFlag->categories_to_abuse; - foreach my $cat (keys %$cats_to_abuse) { - if ($cat eq $params{catid}) { - if ($params{itemid}) { - my $entry = LJ::Entry->new($journal, ditemid => $params{itemid}); - return $class->ml('widget.contentflagreport.error.invalidentry') unless $entry && $entry->valid; - $journal = $entry->poster; - } - return BML::redirect("$LJ::SITEROOT/abuse/report.bml?flagid=" . $params{flag}->flagid . "&stage=$cats_to_abuse->{$cat}"); - } - } - - return %params; -} - -1; diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/Widget/ContentFlagSummary.pm --- a/cgi-bin/LJ/Widget/ContentFlagSummary.pm Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,386 +0,0 @@ -package LJ::Widget::ContentFlagSummary; - -use strict; -use base qw(LJ::Widget); -use Carp qw(croak); -use LJ::ContentFlag; - -sub need_res { - return qw( - js/ippu.js - js/lj_ippu.js - js/httpreq.js - stc/contentflag.css - js/ljwidget_ippu.js - js/widget_ippu/contentflagreporters.js - js/widget_ippu/entrysummary.js - ); -} - -sub ajax { 1 } - -sub should_render { - my $remote = LJ::get_remote(); - return $remote && $remote->can_admin_content_flagging ? 1 : 0; -} - - -my %catnames = (%LJ::ContentFlag::CAT_NAMES); -my %statusnames = (%LJ::ContentFlag::STATUS_NAMES); - -my @actions = ( - LJ::ContentFlag::NEW => 'New', - LJ::ContentFlag::CLOSED => 'Bogus Report (No Action)', - '', '', - LJ::ContentFlag::FLAG_EXPLICIT_ADULT => 'Flag > 18 and Over Only', - LJ::ContentFlag::FLAG_HATRED => 'Flag > Hate Speech', - LJ::ContentFlag::FLAG_ILLEGAL => 'Flag > Illegal Activity', - LJ::ContentFlag::FLAG_CHILD_PORN => 'Flag > Nude Images of Minors', - LJ::ContentFlag::FLAG_SELF_HARM => 'Flag > Self Harm', - LJ::ContentFlag::FLAG_SEXUAL => 'Flag > Sexual Content', - LJ::ContentFlag::FLAG_OTHER => 'Flag > Other', - ); - -my %fieldnames = ( - instime => 'Reported', - journalid => 'Reported User', - catid => 'Most Frequent Type', - reporterid => 'Reporters', - status => 'Status', - modtime => 'Touched Time', - itemid => 'Report Type', - action => 'Resolve', - open_request => 'Open Abuse Request?', - _count => 'Freq', - ); - -my %sortopts = ( - count => "Frequency", - instime => "Time", - ); - -# creates the form that allows the user to filter to various states -sub filter_switcher { - my $class = shift; - my %opts = @_; - - my $ret; - $ret .= '<p><form action="">'; - $ret .= "<b>Type</b>: "; - $ret .= LJ::html_select({ name => 'catid', selected => $opts{catid} }, - ( "" => "All Types", %catnames)); - - $ret .= " <b>Status</b>: "; - $ret .= LJ::html_select({ name => 'status', selected => $opts{status} }, %statusnames); - - $ret .= " <b>Sort by</b>: "; - $ret .= LJ::html_select({ name => 'sort', selected => $opts{sort} }, %sortopts); - - $ret .= LJ::html_submit(); - - my $num = LJ::ContentFlag->locked_flags; - $ret .= " <small>($num reports locked)</small>"; - $ret .= '</form></p>'; - - return $ret; -}; - -sub render_body { - my $class = shift; - my %opts = @_; - - my $ret = $class->filter_switcher(%opts); - - my $sort = $opts{sort} || 'count'; - $sort =~ s/\W//g; - my @flags = LJ::ContentFlag->load(status => $opts{status}, catid => $opts{catid}, group => 1, sort => $sort, lock => 1, limit => 25); - - unless (@flags) { - $ret .= "<?standout No matches! :) standout?>"; - return $ret; - } - - $ret .= $class->start_form; - $ret .= "<div>"; - $ret .= $class->html_hidden('status' => $opts{status}, catid => $opts{catid}); - - # format fields for display - my $remote = LJ::get_remote(); - my %fields = ( - instime => sub { - LJ::ago_text(time() - shift()); - }, - modtime => sub { - my $time = shift; - return $time ? LJ::ago_text(time() - $time) : "Never"; - }, - journalid => sub { - LJ::ljuser(LJ::load_userid(shift())); - }, - itemid => sub { - my ($id, $flag) = @_; - my $typeid = $flag->{typeid}; - - my ($popup, $text, $jsclass); - - if ($typeid == LJ::ContentFlag::ENTRY) { - my $entry = $flag->item; - return "Deleted" unless $entry && $entry->valid; - $jsclass = "ctflag_item"; - $text = "Entry [" . ($entry->subject_text || 'no subject') . "]"; - $popup = $entry->visible_to($remote) ? $entry->event_text : "[Private entry]"; - } - - if ($typeid == LJ::ContentFlag::COMMENT) { - my $cmt = $flag->item; - return "Deleted" unless $cmt && $cmt->valid; - $text = "Comment [" . ($cmt->subject_text || 'no subject') . "]"; - $popup = $cmt->visible_to($remote) ? $cmt->body_text : "[Private comment]"; - } - - if ($typeid == LJ::ContentFlag::PROFILE) { - $text = "Profile"; - } - - if ($typeid == LJ::ContentFlag::JOURNAL) { - $text = "Journal"; - } - - my $url = $flag->url; - my $journalid = $flag->journalid; - - return qq { - <div class="standout-border standout-background $jsclass" style="cursor: pointer;" - lj_itemid="$id" lj_journalid="$journalid"> - <a href="$url"><img src="$LJ::IMGPREFIX/link.png" /></a> - $text - </div> - }; - }, - reporterid => sub { - my ($reporter, $flag) = @_; - - my $journalid = $flag->journalid; - my $typeid = $flag->typeid; - my $itemid = $flag->itemid; - my $catid = $flag->catid; - - return "<div class='standout-border standout-background ctflag_reporterlist' style='cursor: pointer;' " . - "lj_itemid='$itemid' lj_catid='$catid' lj_journalid='$journalid' lj_typeid='$typeid'>View reporters and requests...</div>"; - }, - catid => sub { - my ($cat, $flag) = @_; - - my $journalid = $flag->journalid; - my $typeid = $flag->typeid; - my $itemid = $flag->itemid; - - my $catid = LJ::ContentFlag->get_most_common_cat_for_flag( journalid => $journalid, typeid => $typeid, itemid => $itemid ); - return $catnames{$catid} || "??"; - }, - status => sub { - my $stat = shift; - return $statusnames{$stat} || "??"; - }, - action => sub { - my (undef, $flag) = @_; - my $flagid = $flag->flagid; - my $actions = $class->html_select(class => "ctflag_action", - name => "action_$flagid", - id => "action_$flagid", - selected => $flag->status, - lj_itemid => $flagid, - list => [@actions]); - return $actions; - }, - _count => sub { - my (undef, $flag) = @_; - return $flag->count; - }, - open_request => sub { - my (undef, $flag) = @_; - my $flagid = $flag->flagid; - - if (LJ::ContentFlag->requests_exist_for_flag($flag)) { - return "<em>(one or more requests exist)</em>"; - } else { - return $class->html_check( - name => "openreq_$flagid", - id => "openreq_$flagid", - ); - } - }, - ); - - my @fields = qw (_count itemid journalid instime reporterid catid); - my @cols = (@fields, qw(action open_request)); - my $fieldheaders = (join '', (map { "<th>$fieldnames{$_}</th>" } @cols)); - - $ret .= qq { - <table class="alternating-rows ctflag"> - <tr> - $fieldheaders - </tr> - }; - - my $i = 1; - foreach my $flag (@flags) { - my $n = $i++ % 2 + 1; - $ret .= "<tr class='altrow$n'>"; - foreach my $field (@cols) { - my $field_val = (grep { $_ eq $field } @fields) ? $flag->{$field} : ''; - $ret .= "<td>" . $fields{$field}->($field_val, $flag) . '</td>'; - } - $ret .= '</tr>'; - } - - $ret .= '</table>'; - $ret .= '</div>'; - - $ret .= $class->html_hidden('flagids', join(',', map { $_->flagid } @flags)); - $ret .= $class->html_hidden('mode', 'admin'); - $ret .= '<?standout ' . $class->html_submit('Submit Resolutions') . ' standout?>'; - $ret .= $class->end_form; - - return $ret; -} - -sub handle_post { - my ($class, $post, %opts) = @_; - - die "This feature is disabled" - if LJ::conf_test($LJ::DISABLED{content_flag}); - - my $remote = LJ::get_remote() - or die "You must be logged in to use this"; - - my $getopt = sub { - my $field = shift; - my $val = $post->{$field} or die "Required field $field missing"; - return $val; - }; - - my $mode = $getopt->('mode'); - die "Unknown mode: $mode" - unless $mode eq 'flag' || $mode eq 'admin'; - - my $success = 0; - my %ret = (); - - if ($mode eq 'flag') { - my @fields = qw (itemid type cat journalid); - my %opts; - foreach my $field (@fields) { - my $val = $getopt->($field); - } - - $opts{reporter} = $remote; - my $flag = LJ::ContentFlag->create(%opts); - - $success = $flag ? 1 : 0; - } elsif ($mode eq 'admin') { - die "You are not authorized to do this" - unless $remote->can_admin_content_flagging; - - my $flagids = $getopt->('flagids'); - my @flagids = split(',', $flagids); - - foreach my $flagid (@flagids) { - die "invalid flagid" unless $flagid+0; - - my $action = $post->{"action_$flagid"} or next; - - my ($flag) = LJ::ContentFlag->load_by_flagid($flagid) - or die "Could not load flag $flagid"; - - # get the other flags for this item - my @flags = $flag->find_similar_flags(catid => $post->{catid}, status => $post->{status}); - - # set the status of the flags - $_->set_status($action) foreach @flags; - - # mark the journal or entry with the appropriate admin flag (including undef if un-flagging) - my $admin_flag = LJ::ContentFlag->get_admin_flag_from_status($action); - my $u = LJ::load_userid($flag->journalid); - if ($flag->typeid == 3) { # journal - $u->set_prop( admin_content_flag => $admin_flag ); - } elsif ($flag->typeid == 1) { # entry - my $entry = LJ::Entry->new($u, ditemid => $flag->itemid); - $entry->set_prop( admin_content_flag => $admin_flag ); - } - - # open an abuse request if the admin requested one - if ($post->{"openreq_$flagid"}) { - LJ::ContentFlag->move_to_abuse($action, @flags); - } - } - - LJ::ContentFlag->unlock(@flagids); - } -} - -sub js { - - qq[ - - initWidget: function () { - LiveJournal.addClickHandlerToElementsWithClassName(this.contentFlagItemClicked.bindEventListener(this), "ctflag_item"); - LiveJournal.addClickHandlerToElementsWithClassName(this.reporterListClicked.bindEventListener(this), "ctflag_reporterlist"); - }, - reporterListClicked: function (evt) { - var target = evt.target; - if (! target) return true; - var item = target; - - var itemid = item.getAttribute("lj_itemid"); - var journalid = item.getAttribute("lj_journalid"); - var typeid = item.getAttribute("lj_typeid"); - var catid = item.getAttribute("lj_catid"); - - if (! itemid || ! journalid || ! typeid || ! catid) return true; - - var reporterList = new LJWidgetIPPU_ContentFlagReporters({ - title: "Reporters", - nearElement: target - }, { - journalid: journalid, - typeid: typeid, - catid : catid, - itemid: itemid - }); - }, - contentFlagItemClicked: function (evt) { - var target = evt.target; - if (! target) return true; - - if (target.tagName.toLowerCase() == "img") return true; // don't capture events on the link img ' - - var item = target; - var itemid = item.getAttribute("lj_itemid"); - var journalid = item.getAttribute("lj_journalid"); - if (! itemid || ! journalid) return true; - - var reporterList = new LJWidgetIPPU_EntrySummary({ - title: "Entry Summary", - nearElement: target - }, { - journalid: journalid, - ditemid: itemid - }); - - Event.stop(evt); - return false; - }, - onData: function (data) { - - }, - onError: function (err) { - - }, - onRefresh: function (data) { - this.initWidget(); - } - ]; -} - -1; diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/Widget/IPPU/ContentFlagReporters.pm --- a/cgi-bin/LJ/Widget/IPPU/ContentFlagReporters.pm Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -use strict; - -package LJ::Widget::IPPU::ContentFlagReporters; -use base "LJ::Widget::IPPU"; - -sub render_body { - my ($class, %opts) = @_; - - my $remote = LJ::get_remote(); - - return "Unauthorized" unless $remote && $remote->can_admin_content_flagging; - return "invalid params" unless $opts{journalid} && $opts{typeid} && $opts{catid}; - - my $ret = ''; - - my @reporters = LJ::ContentFlag->get_reporters(journalid => $opts{journalid}, - typeid => $opts{typeid}, - itemid => $opts{itemid}); - my $usernames = ''; - - my @userids = map { $_->{reporterid} } @reporters; - my $users = LJ::load_userids(@userids); - - my %support_requests_for_uid; - foreach my $uid (keys %$users) { - foreach my $reporter (@reporters) { - if ($reporter->{reporterid} eq $uid) { - next unless $reporter->{supportid}; - push @{$support_requests_for_uid{$uid}}, $reporter->{supportid}; - } - } - } - - $ret .= $class->start_form(id => 'banreporters_form'); - $ret .= $class->html_hidden("journalids", join(',', keys %$users)); - - $usernames .= '<table class="alternating-rows" width="100%">'; - $usernames .= "<tr><th>Ban?</th><th>User</th><th>Name</th><th>Requests</th></tr>"; - - my $i = 0; - foreach my $u (values %$users) { - my $row = $i++ % 2 == 0 ? 1 : 2; - - $usernames .= "<tr class='altrow$row'>"; - $usernames .= '<td>' . $class->html_check(name => "ban_" . $u->id) . '</td>'; - $usernames .= '<td>' . $u->ljuser_display . '</td>'; - $usernames .= '<td>' . $u->name_html . '</td>'; - if ($support_requests_for_uid{$u->id}) { - $usernames .= "<td>"; - foreach my $spid (@{$support_requests_for_uid{$u->id}}) { - $usernames .= "<a href='$LJ::SITEROOT/support/see_request.bml?id=$spid'>$spid</a> "; - } - $usernames .= "</td>"; - } else { - $usernames .= "<td>(no request)</td>"; - } - } - - $usernames .= '</table>'; - - $ret .= qq { - <div class="su_username_list" style="overflow-y: scroll; max-height: 20em; margin: 4px; border: 1px solid #EEEEEE;"> - $usernames - </div> - }; - - $ret .= '<p>' . $class->html_check(name => "ban", id => 'banreporters', label => 'Ban selected users') . '</p>'; - - $ret .= '<input type="button" name="doban" value="Ban" disabled="1" id="banreporters_do" />'; - $ret .= '<input type="button" name="cancel" value="Cancel" id="banreporters_cancel" />'; - - $ret .= $class->end_form; - - return $ret; -} - -sub handle_post { - my ($class, $post) = @_; - - my $remote = LJ::get_remote(); - die "Unauthorized" unless $remote && $remote->can_admin_content_flagging; - - return unless $post->{ban}; - - my $journalids = $post->{journalids} or return; - my @jids = split(',', $journalids) or return; - - my @to_ban; - - foreach my $journalid (@jids) { - next unless $post->{"ban_$journalid"}; - push @to_ban, $journalid; - } - - my $to_ban_users = LJ::load_userids(@to_ban); - my @banned; - - foreach my $u (values %$to_ban_users) { - push @banned, $u; - LJ::sysban_create( - 'what' => "contentflag", - 'value' => $u->user, - 'bandays' => $LJ::CONTENT_FLAG_BAN_LENGTH || 7, - 'note' => "contentflag ban by " . $remote->user, - ); - } - - return (banned => [map { $_->user } @banned]); -} - -1; diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/LJ/Widget/IPPU/EntrySummary.pm --- a/cgi-bin/LJ/Widget/IPPU/EntrySummary.pm Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -use strict; - -package LJ::Widget::IPPU::EntrySummary; -use base "LJ::Widget::IPPU"; - -sub render_body { - my ($class, %opts) = @_; - - my $remote = LJ::get_remote(); - - my $u = LJ::load_userid($opts{journalid}); - my $ditemid = $opts{ditemid}; - my $jitemid = $opts{jitemid}; - - return "No entry specified" unless $u && ($ditemid xor $jitemid); - - my $entry = LJ::Entry->new($u, jitemid => $jitemid, ditemid => $ditemid); - - return "Invalid entry" unless $entry->valid; - return "You do not have permission to view this entry" unless $entry->visible_to($remote); - - my $poster = $entry->poster; - my $ljuser = $poster->ljuser_display; - my $name = $poster->name_html; - - my $journaltext = ! LJ::u_equals($poster, $entry->journal) ? " in " . $entry->journal->ljuser_display : ''; - - my $time = LJ::ago_text(time() - $entry->logtime_unix); - my $entrytext = LJ::ehtml($entry->event_text); - my $subject = $entry->subject_html; - - my $ret = qq { - <div style="width: 95%; margin-left: auto; margin-right: auto; padding: 3px;"> - <div style="font-weight: bold; font-size: 1.1em;">$subject</div> - <div style="margin: 3px;">$ljuser ($name)$journaltext @ $time</div> - <div> - <textarea readOnly="true" style="width: 95%; height: 10em; margin-left: auto; margin-right: auto;">$entrytext</textarea> - </div> - <div style="padding: 5px;"> - <input type="button" id="entrysummary_cancel" value="Close" /> - </div> - </div> - }; - - return $ret; -} - -1; diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/imageconf.pl --- a/cgi-bin/imageconf.pl Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/imageconf.pl Wed Apr 01 03:50:07 2009 +0000 @@ -138,13 +138,6 @@ use vars qw(%img); 'alt' => 'img.track_thread_active', }; -$img{'flag'} = { - 'src' => '/button-flag.gif', - 'width' => 22, - 'height' => 20, - 'alt' => 'img.flag_btn', -}; - $img{'editcomment'} = { 'src' => '/btn_edit.gif', 'width' => 22, diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/supportlib.pl --- a/cgi-bin/supportlib.pl Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/supportlib.pl Wed Apr 01 03:50:07 2009 +0000 @@ -599,12 +599,6 @@ sub file_request $dbh->do("INSERT INTO supportlog (splid, spid, timelogged, type, faqid, userid, message) ". "VALUES (NULL, $spid, UNIX_TIMESTAMP(), 'req', 0, $qrequserid, $qbody)"); - # set the flag on the support request and the support request on the flag - if ($o->{flagid}) { - LJ::Support::set_prop($spid, "contentflagid", $o->{flagid}); - LJ::ContentFlag->set_supportid($o->{flagid}, $spid); - } - my $body; my $miniauth = mini_auth({ 'authcode' => $authcode }); $url = "$LJ::SITEROOT/support/see_request.bml?id=$spid"; diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/talklib.pl --- a/cgi-bin/talklib.pl Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/talklib.pl Wed Apr 01 03:50:07 2009 +0000 @@ -159,11 +159,6 @@ sub link_bar my $img_key = $remote->has_subscription(journal => $u, event => "JournalNewComment", arg1 => $itemid, require_active => 1) ? "track_active" : "track"; push @linkele, $mlink->("$LJ::SITEROOT/manage/subscriptions/entry.bml?${jargent}itemid=$itemid", $img_key); - } - - if ($remote && $remote->can_see_content_flag_button( content => $entry )) { - my $flag_url = LJ::ContentFlag->adult_flag_url($entry); - push @linkele, $mlink->($flag_url, 'flag'); } diff -r 1138cfcfec8f -r 9fbd871d8aeb cgi-bin/weblib.pl --- a/cgi-bin/weblib.pl Wed Apr 01 03:43:15 2009 +0000 +++ b/cgi-bin/weblib.pl Wed Apr 01 03:50:07 2009 +0000 @@ -1498,7 +1498,7 @@ MOODS $out .= "<span class='inputgroup-right'>"; # Content Flag - if (LJ::is_enabled("content_flag")) { + if ( LJ::is_enabled( 'adult_content' ) ) { my @adult_content_menu = ( "" => BML::ml('entryform.adultcontent.default'), none => BML::ml('entryform.adultcontent.none'), @@ -1519,7 +1519,7 @@ MOODS $out .= "</span>\n"; $out .= "</p>\n"; - if (LJ::is_enabled("content_flag")) { + if ( LJ::is_enabled( 'adult_content' ) ) { $out .= "<p class='pkg'>"; $out .= "<label for='prop_adult_content_reason' class='left options'>" . BML::ml('entryform.adultcontentreason') . "</label>"; $out .= LJ::html_text( @@ -1578,7 +1578,7 @@ PREVIEW $out .= "<em>" . BML::ml('entryform.maintainer') . "</em>\n"; $out .= "</p>\n"; - if (LJ::is_enabled("content_flag")) { + if ( LJ::is_enabled( 'adult_content' ) ) { $out .= "<p class='pkg'>\n"; my %poster_adult_content_menu = ( "" => BML::ml('entryform.adultcontent.default'), @@ -1927,7 +1927,7 @@ sub entry_form_decode $req->{"prop_opt_noemail"} ||= $POST->{'comment_settings'} eq "noemail" ? 1 : 0; $req->{'prop_opt_backdated'} = $POST->{'prop_opt_backdated'} ? 1 : 0; - if (LJ::is_enabled("content_flag")) { + if ( LJ::is_enabled( 'adult_content' ) ) { $req->{prop_adult_content} = $POST->{prop_adult_content}; $req->{prop_adult_content} = "" unless $req->{prop_adult_content} eq "none" || $req->{prop_adult_content} eq "concepts" || $req->{prop_adult_content} eq "explicit"; diff -r 1138cfcfec8f -r 9fbd871d8aeb etc/config.pl --- a/etc/config.pl Wed Apr 01 03:43:15 2009 +0000 +++ b/etc/config.pl Wed Apr 01 03:50:07 2009 +0000 @@ -179,8 +179,8 @@ # turns these from 0 to 1 to disable parts of the site that are # CPU & database intensive or that you simply don't want to use %DISABLED = ( + adult_content => 0, blockwatch => 1, - content_flag => 0, 'community-logins' => 0, directory => 0, eventlogrecord => 1, diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/admin/contentflag.bml --- a/htdocs/admin/contentflag.bml Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -<?page -title=>Content Flag Admin -body<= -<?_code -{ - use strict; - use vars qw(%GET %POST $ret $headextra @errors @warnings); - - my $remote = LJ::get_remote(); - return BML::redirect("$LJ::SITEROOT/support/") - unless $remote && $remote->can_admin_content_flagging; - - LJ::Widget->handle_post(\%POST, qw(ContentFlagSummary)); - - my $widget = LJ::Widget::ContentFlagSummary->new; - $headextra .= $widget->wrapped_js; - - my %opts; - $opts{status} = $POST{status} || $GET{status} || "N"; - $opts{catid} = $POST{catid} || $GET{catid}; - $opts{sort} = $POST{sort} || $GET{sort} || "count"; - - $ret .= $widget->render(%opts); - - return $ret; -} -_code?> -<=body -head=><?_code return $headextra; _code?> -page?> diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/admin/contentflag_home.bml --- a/htdocs/admin/contentflag_home.bml Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -<?page -body<= -<?_code -{ - use strict; - use vars qw(%GET %POST $title $headextra @errors @warnings); - use LJ::ContentFlag; - - $title = 'Content Flag Admin Home'; - - my $remote = LJ::get_remote(); - return BML::redirect("$LJ::SITEROOT/support/") - unless $remote && $remote->can_admin_content_flagging; - - my %flagcounts = LJ::ContentFlag->flag_count_by_category; - - my $total = 0; - $total += $_ foreach values %flagcounts; - my $row = 0; - - my $ret = qq { - <p><b>View Flaggings:</b></p> - - <table class="alternating-rows"> - <tr class="altrow1"> - <td>All Categories</td> - <td>$total</td> - </tr> - }; - - while (my ($catid, $count) = each %flagcounts) { - my $rowname = ++$row % 2 + 1; - my $catname = LJ::ContentFlag->category_names->{$catid}; - - $ret .= qq { - <tr class="altrow$rowname"> - <td><a href="$LJ::SITEROOT/admin/contentflag.bml?catid=$catid">$catname</a></td> - <td>$count</td> - </tr> - }; - } - - $ret .= q { - </table> - }; - - # manual button to clear locked flags in case we want to override the 5-minute lock - $ret .= "<form method='post'>"; - $ret .= LJ::html_submit("Reset Locked Flags?"); - $ret .= "</form>"; - - LJ::MemCache::delete(LJ::ContentFlag->memcache_key) if LJ::did_post(); - - return $ret; -} -_code?> -<=body -title=><?_code return $title; _code?> -head<= -<?_code return $headextra; _code?> -<=head -page?> diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/admin/entryprops.bml --- a/htdocs/admin/entryprops.bml Wed Apr 01 03:43:15 2009 +0000 +++ b/htdocs/admin/entryprops.bml Wed Apr 01 03:50:07 2009 +0000 @@ -49,8 +49,7 @@ body<= $ret .= "(journal wide minsecurity: " . ($entry->journal->prop("newpost_minsecurity") || "public") . ")<br />"; $ret .= "<strong>User Date/Time</strong>: " . $entry->eventtime_mysql . "<br />"; $ret .= "<strong>Server Date/Time</strong>: " . $entry->logtime_mysql . "<br />"; - $ret .= "<strong>Journal Adult Content</strong>: " . ($entry->journal->adult_content || "none") - . " (admin setting: " . ($entry->journal->admin_content_flag || "none") . ")<br />"; + $ret .= "<strong>Journal Adult Content</strong>: " . ( $entry->journal->adult_content || "none" ) . "<br />"; $ret .= "<br />"; diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/allpics.bml --- a/htdocs/allpics.bml Wed Apr 01 03:43:15 2009 +0000 +++ b/htdocs/allpics.bml Wed Apr 01 03:50:07 2009 +0000 @@ -19,7 +19,7 @@ return; } - $u->preload_props("opt_blockrobots", "adult_content", "admin_content_flag") if $u->is_visible; + $u->preload_props("opt_blockrobots", "adult_content") if $u->is_visible; if (!$u->is_visible || $u->should_block_robots) { $head .= LJ::robot_meta_tags(); } diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/community/create.bml --- a/htdocs/community/create.bml Wed Apr 01 03:43:15 2009 +0000 +++ b/htdocs/community/create.bml Wed Apr 01 03:50:07 2009 +0000 @@ -208,7 +208,7 @@ SUBMIT: $ret .= "</div></div></li>"; # adult content options - if (LJ::is_enabled("content_flag")) { + if ( LJ::is_enabled( 'adult_content' ) ) { $ret .= "<li><div class='formitem'><div class='formitemName'>$ML{'/community/settings.bml.label.adultcontentheader'} "; $ret .= LJ::help_icon("adult_content_flag"); $ret .= "</div><div class='formitemDesc'>$ML{'/community/settings.bml.label.adultcontenttext'}</div><div><p>"; diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/community/settings.bml --- a/htdocs/community/settings.bml Wed Apr 01 03:43:15 2009 +0000 +++ b/htdocs/community/settings.bml Wed Apr 01 03:50:07 2009 +0000 @@ -146,7 +146,7 @@ body<= LJ::set_userprop($cu, 'nonmember_posting', $nonmember_posting); LJ::set_userprop($cu, 'moderated', $moderated); - if (LJ::is_enabled("content_flag")) { + if ( LJ::is_enabled( 'adult_content' ) ) { my $adult_content = $POST{'adult_content'}; $adult_content eq "none" unless $adult_content eq "explicit" || $adult_content eq "concepts"; @@ -253,7 +253,7 @@ body<= $ret .= "</div></fieldset>"; # adult content - if (LJ::is_enabled('content_flag')) { + if ( LJ::is_enabled( 'adult_content' ) ) { my $adult_content = $c ? $c->adult_content : "none"; $ret .= "<fieldset id='adult-content'>"; diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/js/widget_ippu/contentflagreporters.js --- a/htdocs/js/widget_ippu/contentflagreporters.js Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -LJWidgetIPPU_ContentFlagReporters = new Class(LJWidgetIPPU, { - init: function (opts, params) { - opts.widgetClass = "IPPU::ContentFlagReporters"; - LJWidgetIPPU_ContentFlagReporters.superClass.init.apply(this, arguments); - }, - - onRefresh: function () { - var banbtn = $('banreporters'); - if (! banbtn ) return; - - DOM.addEventListener(banbtn, 'click', this.banChecked.bindEventListener(this)); - DOM.addEventListener($('banreporters_cancel'), 'click', this.cancel.bindEventListener(this)); - DOM.addEventListener($('banreporters_do'), 'click', this.ban.bindEventListener(this)); - }, - - cancel: function (e) { - this.close(); - }, - - ban: function (e) { - this.postForm($('banreporters_form')); - }, - - banChecked: function (e) { - $('banreporters_do').disabled = ! $('banreporters').checked; - }, - - // post finished - onData: function (data) { - if (! data.res || ! data.res.banned) return; - var banned = data.res.banned; - - LJ_IPPU.showNote("Banned users: " + banned.join(', ')); - this.close(); - } -}); diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/js/widget_ippu/entrysummary.js --- a/htdocs/js/widget_ippu/entrysummary.js Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -LJWidgetIPPU_EntrySummary = new Class(LJWidgetIPPU, { - init: function (opts, params) { - opts.widgetClass = "IPPU::EntrySummary"; - LJWidgetIPPU_ContentFlagReporters.superClass.init.apply(this, arguments); - }, - - onRefresh: function () { - var cancelBtn = $('entrysummary_cancel'); - if (! cancelBtn) return; - - DOM.addEventListener(cancelBtn, 'click', this.cancel.bindEventListener(this)); - }, - - cancel: function (e) { - this.close(); - } -}); diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/misc/adult_concepts.bml --- a/htdocs/misc/adult_concepts.bml Wed Apr 01 03:43:15 2009 +0000 +++ b/htdocs/misc/adult_concepts.bml Wed Apr 01 03:50:07 2009 +0000 @@ -18,7 +18,7 @@ body<= return BML::redirect( $returl ) if $remote && $remote->best_guess_age; if ( $returl ) { - my $redir = LJ::ContentFlag->check_adult_cookie( $returl, \%POST, "concepts" ); + my $redir = DW::Logic::AdultContent->check_adult_cookie( $returl, \%POST, "concepts" ); return BML::redirect( $redir ) if $redir; } @@ -60,7 +60,7 @@ body<= </td> </tr> }; - $ret .= LJ::ContentFlag::interstitial_reason( $journal, $entry ); + $ret .= DW::Logic::AdultContent->interstitial_reason( $journal, $entry ); $ret .= qq { </table> diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/misc/adult_concepts_blocked.bml --- a/htdocs/misc/adult_concepts_blocked.bml Wed Apr 01 03:43:15 2009 +0000 +++ b/htdocs/misc/adult_concepts_blocked.bml Wed Apr 01 03:50:07 2009 +0000 @@ -44,7 +44,7 @@ body<= </td> </tr> }; - $ret .= LJ::ContentFlag::interstitial_reason( $journal, $entry ); + $ret .= DW::Logic::AdultContent->interstitial_reason( $journal, $entry ); $ret .= qq { </table> }; diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/misc/adult_explicit.bml --- a/htdocs/misc/adult_explicit.bml Wed Apr 01 03:43:15 2009 +0000 +++ b/htdocs/misc/adult_explicit.bml Wed Apr 01 03:50:07 2009 +0000 @@ -18,7 +18,7 @@ body<= return BML::redirect($returl) if $remote && $remote->best_guess_age; if ($returl) { - my $redir = LJ::ContentFlag->check_adult_cookie( $returl, \%POST, "explicit" ); + my $redir = DW::Logic::AdultContent->check_adult_cookie( $returl, \%POST, "explicit" ); return BML::redirect( $redir ) if $redir; } @@ -59,7 +59,7 @@ body<= </td> </tr> }; - $ret .= LJ::ContentFlag::interstitial_reason( $journal, $entry ); + $ret .= DW::Logic::AdultContent->interstitial_reason( $journal, $entry ); $ret .= qq { </table> diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/misc/adult_explicit_blocked.bml --- a/htdocs/misc/adult_explicit_blocked.bml Wed Apr 01 03:43:15 2009 +0000 +++ b/htdocs/misc/adult_explicit_blocked.bml Wed Apr 01 03:50:07 2009 +0000 @@ -44,7 +44,7 @@ body<= </td> </tr> }; - $ret .= LJ::ContentFlag::interstitial_reason( $journal, $entry ); + $ret .= DW::Logic::AdultContent->interstitial_reason( $journal, $entry ); $ret .= qq { </table> }; diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/stc/contentflag.css --- a/htdocs/stc/contentflag.css Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -.ctflag_popup { - max-width: 700px; - max-height: 300px; - overflow: auto; -} - -.ctflag_item img { - border: 0; -} - -table.ctflag { - width: 90%; - margin: 8px auto 8px auto; -} \ No newline at end of file diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/stc/widgets/contentflagreport.css --- a/htdocs/stc/widgets/contentflagreport.css Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -.note-header { - color: #f00; - font-weight: bold; -} - -.note-text { - font-style: italic; -} - -.confirm-box { - background-color: #ededed; - padding: 5px; -} diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/talkpost.bml --- a/htdocs/talkpost.bml Wed Apr 01 03:43:15 2009 +0000 +++ b/htdocs/talkpost.bml Wed Apr 01 03:50:07 2009 +0000 @@ -145,7 +145,7 @@ body<= return if LJ::bad_password_redirect(); my @user_props = ("opt_whoscreened"); - push @user_props, qw( opt_blockrobots adult_content admin_content_flag ) if $u->is_visible; + push @user_props, qw( opt_blockrobots adult_content ) if $u->is_visible; $u->preload_props(@user_props); if (!$u->is_visible || $u->should_block_robots || ($entry && $entry->should_block_robots)) { $head = LJ::robot_meta_tags(); diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/talkread.bml --- a/htdocs/talkread.bml Wed Apr 01 03:43:15 2009 +0000 +++ b/htdocs/talkread.bml Wed Apr 01 03:50:07 2009 +0000 @@ -111,7 +111,7 @@ my $old_url = 0; my $entry = LJ::Entry->new($u, ditemid => $ditemid); - $u->preload_props("opt_blockrobots", "adult_content", "admin_content_flag") if $u->is_visible; + $u->preload_props("opt_blockrobots", "adult_content") if $u->is_visible; if (!$u->is_visible || $u->should_block_robots || ($entry && $entry->should_block_robots)) { $$head .= LJ::robot_meta_tags(); } diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/tools/content_flag.bml --- a/htdocs/tools/content_flag.bml Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -<?page -body<= -<?_code -{ - use strict; - use vars qw(%GET %POST $title $headextra @errors @warnings); - - $title = $ML{'.title'}; - - my $remote = LJ::get_remote() - or return "<?needlogin?>"; - - return $ML{'.error.disabled'} - unless LJ::is_enabled("content_flag"); - - my $ditemid = $GET{itemid}; - my $user = $GET{user}; - my $journal = LJ::load_user($user) or return $ML{'.error.invalidusername'}; - my $content = $ditemid ? LJ::Entry->new($journal, ditemid => $ditemid) : $journal; - - return $ML{'.error.cantflag'} - unless $remote->can_flag_content( content => $content ); - - my %opts = (); - return LJ::Widget->handle_post_and_render(\%POST, 'ContentFlagReport', - user => $user, - itemid => $ditemid, - confirm => $GET{confirm} ? 1 : 0, - %opts); -} -_code?> -<=body -title=><?_code return $title; _code?> -head<= -<?_code return $headextra; _code?> -<=head -page?> diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/tools/content_flag_reported.bml --- a/htdocs/tools/content_flag_reported.bml Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -<?page -body<= -<?_code -{ - use strict; - use vars qw(%GET %POST $title $headextra @errors @warnings); - - $title = 'Your report has been filed'; - - my $flag = LJ::ContentFlag->load_by_id($GET{flagid}) or return "Invalid report"; - - my $url = $flag->url; - - return qq { - <p>Thank you for your report. We will process it as soon as possible and take - any appropriate actions, though unfortunately, we can't provide a personal response.</p> - - <p><a href="$url">Return to Journal</a> <a href="$LJ::SITEROOT/site/search.bml">Explore $LJ::SITENAME</a></p> - }; -} -_code?> -<=body -title=><?_code return $title; _code?> -head<= -<?_code return $headextra; _code?> -<=head -page?> diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/tools/content_flag_spam.bml --- a/htdocs/tools/content_flag_spam.bml Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -<?page -body<= -<?_code -{ - use strict; - use vars qw(%GET %POST $title $headextra @errors @warnings); - - $title = "Reporting Spam"; - - my $remote = LJ::get_remote() - or return "<?needlogin?>"; - - return "Content flagging is disabled" - if LJ::conf_test($LJ::DISABLED{content_flag}); - - my $ditemid = $GET{itemid}; - my $user = $GET{user}; - my $journal = LJ::load_user($user) or return "Invalid username"; - my $content = $ditemid ? LJ::Entry->new($journal, ditemid => $ditemid) : $journal; - - return "You are not allowed to flag this." - unless $remote->can_flag_content( content => $content ); - - my $ret; - - if ($ditemid) { # entry - if ($journal->is_comm) { - if ($remote->can_manage($journal)) { - $ret .= BML::ml('.maint_communityspam', { aopts => "href='$LJ::SITEROOT/editjournal.bml?journal=$user&itemid=$ditemid'" }); - } else { - $ret .= $ML{'.nonmaint_communityspam'}; - - my $maintainers = LJ::load_rel_user($journal->id, 'A') || []; - if (@$maintainers) { - my $maints = LJ::load_userids(@$maintainers); - my @maint_list = sort { $a->user cmp $b->user } values %$maints; - - $ret .= "<ul>"; - foreach my $maintu (@maint_list) { - $ret .= "<li>" . $maintu->ljuser_display . "</li>"; - } - $ret .= "</ul>"; - } - } - } else { - $ret .= $ML{'.entryspam'}; - } - } else { # journal - $ret .= $ML{'.journalspam'}; - } - - my $url = $journal->journal_base; - if ($ditemid) { - my $entry = LJ::Entry->new($journal, ditemid => $ditemid); - return "Invalid entry" unless $entry && $entry->valid; - $url = $entry->url; - } - - my $itemtype = $ditemid ? 'entry' : 'journal'; - $ret .= "<p><a href='$url'>Return to " . ucfirst $itemtype . "</a></p>"; - - return $ret; -} -_code?> -<=body -title=><?_code return $title; _code?> -head<= -<?_code return $headextra; _code?> -<=head -page?> diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/tools/content_flag_spam.bml.text --- a/htdocs/tools/content_flag_spam.bml.text Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -;; -*- coding: utf-8 -*- - -.entryspam=Please report this through the spam reports system. - -.journalspam=Please report this through the spam reports system. - -.maint_communityspam=To report this entry as spam, go <a [[aopts]]>here</a> and click "Delete and Mark as Spam". - -.nonmaint_communityspam=Please report this through the spam reports system. diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/tools/memories.bml --- a/htdocs/tools/memories.bml Wed Apr 01 03:43:15 2009 +0000 +++ b/htdocs/tools/memories.bml Wed Apr 01 03:50:07 2009 +0000 @@ -84,7 +84,7 @@ return BML::redirect("/tools/memories.bml?user=$u->{'renamedto'}$authasarg"); } - $u->preload_props("opt_blockrobots", "adult_content", "admin_content_flag") if $u->is_visible; + $u->preload_props("opt_blockrobots", "adult_content") if $u->is_visible; unless ($u->is_visible && ! $u->should_block_robots) { $head = LJ::robot_meta_tags(); } diff -r 1138cfcfec8f -r 9fbd871d8aeb htdocs/view/index.bml --- a/htdocs/view/index.bml Wed Apr 01 03:43:15 2009 +0000 +++ b/htdocs/view/index.bml Wed Apr 01 03:50:07 2009 +0000 @@ -78,7 +78,7 @@ } } - $u->preload_props("opt_blockrobots", "adult_content", "admin_content_flag") if $u->is_visible; + $u->preload_props("opt_blockrobots", "adult_content") if $u->is_visible; if (!$u->is_visible || $u->should_block_robots) { $head .= LJ::robot_meta_tags(); } diff -r 1138cfcfec8f -r 9fbd871d8aeb t/content_flag.t --- a/t/content_flag.t Wed Apr 01 03:43:15 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -# -*-perl-*- - -use strict; -use Test::More 'no_plan'; -use lib "$ENV{LJHOME}/cgi-bin"; -require 'ljlib.pl'; -use LJ::ContentFlag; -use LJ::Test; - -my $u = temp_user(); -my $u2 = temp_user(); -my $u3 = temp_user(); -my $u4 = temp_user(); - -my @flags; - -my $entry = $u->t_post_fake_entry(); -my $flag = LJ::ContentFlag->flag(item => $entry, reporter => $u2, journal => $u, cat => LJ::ContentFlag::CHILD_PORN); -ok($flag, "flagged entry"); -push @flags, $flag; - -ok($flag->flagid, "got flag id"); - -is($flag->status, LJ::ContentFlag::NEW, "flag is new"); -is($flag->catid, LJ::ContentFlag::CHILD_PORN, "flag cat"); -is($flag->modtime, undef, "no modtime"); - -my $time = time(); -$flag->set_status(LJ::ContentFlag::CLOSED); -is($flag->status, LJ::ContentFlag::CLOSED, "status change"); -ok(($flag->modtime - $time) < 2, "modtime"); - -my $flagid = $flag->flagid; - -my ($dbflag) = LJ::ContentFlag->load_by_flagid($flagid); -ok($dbflag, "got flag object loading by flagid"); -is_deeply($dbflag, $flag, "loaded same flag from db"); - -$flag->set_status(LJ::ContentFlag::NEW); - -($dbflag) = LJ::ContentFlag->load_by_flagid($flagid, lock => 1); -ok($dbflag, "load_outstanding"); - -($dbflag) = LJ::ContentFlag->load_by_flagid($flagid, lock => 1); -ok(! $dbflag, "didn't get locked flag"); - -my $flag2 = LJ::ContentFlag->flag(item => $entry, reporter => $u3, journal => $u, cat => LJ::ContentFlag::CHILD_PORN); -push @flags, LJ::ContentFlag->flag(item => $entry, reporter => $u4, journal => $u, cat => LJ::ContentFlag::CHILD_PORN); -push @flags, LJ::ContentFlag->flag(item => $entry, reporter => $u3, journal => $u, cat => LJ::ContentFlag::ILLEGAL_CONTENT); -push @flags, $flag2; - -my @flags = LJ::ContentFlag->load_by_journal($u, group => 1); -is($flags[0]->count, 4, "group by"); - -$flag2->set_field('instime', 10); -($dbflag) = LJ::ContentFlag->load_by_flagid($flag2->flagid, from => 10); -ok(! $dbflag, "time constraint"); - -($dbflag) = LJ::ContentFlag->load_by_flagid($flag2->flagid, from => 9); -ok($dbflag, "time constraint"); - -# test rate limiting -{ - push @flags, LJ::ContentFlag->flag(item => $entry, reporter => $u3, journal => $u, cat => LJ::ContentFlag::ILLEGAL_CONTENT); - push @flags, LJ::ContentFlag->flag(item => $entry, reporter => $u3, journal => $u, cat => LJ::ContentFlag::ILLEGAL_CONTENT); - - ok($u3->can_flag_content, 'not rate limited'); - push @flags, LJ::ContentFlag->flag(item => $entry, reporter => $u3, journal => $u, cat => LJ::ContentFlag::ILLEGAL_CONTENT); - - ok(! $u3->can_flag_content, 'rate limited'); -} - -END { - $_->delete foreach @flags; -}; --------------------------------------------------------------------------------