home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / FAQ / discus_admin_1357211388 / source / adm-mod.pl < prev    next >
Text File  |  2009-11-06  |  10KB  |  303 lines

  1. # FILE: adm-mod.pl
  2. # DESCRIPTION: Moderator Manager Interfaces
  3. #-------------------------------------------------------------------------------
  4. # DISCUS COPYRIGHT NOTICE
  5. #
  6. # Discus is copyright (c) 2002 by DiscusWare, LLC, all rights reserved.
  7. # The use of Discus is governed by the Discus License Agreement which is
  8. # available from the Discus WWW site at:
  9. #    http://www.discusware.com/discus/license
  10. #
  11. # Pursuant to the Discus License Agreement, this copyright notice may not be
  12. # removed or altered in any way.
  13. #-------------------------------------------------------------------------------
  14.  
  15. use strict;
  16. use vars qw($GLOBAL_OPTIONS $DCONF $PARAMS);
  17.  
  18. ###
  19. ### MODERATOR_admin
  20. ###
  21. ### Controls Moderator Manager and all of its functions
  22. ###
  23.  
  24. sub MODERATOR_admin {
  25.     my ($FORMref) = @_;
  26.     dreq("template");
  27.     my $result = check_password($FORMref->{username}, undef, { type_required => 'moderator' }, $FORMref->{'COOKIE'});
  28.     bad_login( { bad_username => 1 } ) if scalar(@{ $result }) == 0;
  29.     bad_login( { superuser_required => 1 } ) if $result->[0]->{user} ne $DCONF->{superuser};
  30.     moderator_manager($FORMref, $result) if $FORMref->{'action'} eq "mod_mgr";
  31.     if ($FORMref->{'action'} eq "mod_demote") {
  32.         dreq("promote-PRO");
  33.         promote_moderator_manager_action($FORMref, $result);
  34.     }
  35.     if ($FORMref->{'action'} eq "mod_mgmt") {
  36.         my $sa = $FORMref->{SELECTION_action};
  37.         my $sw = $FORMref->{SELECTION_who};
  38.         my $modsel = mod_act_setup($sa, $sw, $FORMref->{MARK});
  39.         moderator_topic_assign_screen($modsel, $FORMref, $result) if $sa eq "t";
  40.         moderator_group_assign_screen($modsel, $FORMref, $result) if $sa eq "g";
  41.         if ($sa eq "u") {
  42.             dreq("promote-PRO");
  43.             promote_moderator_manager($modsel, $FORMref, $result);
  44.         }
  45.         moderator_manager($FORMref, $result, { count => delete_moderator($modsel), what => 1 }) if $sa eq "d";
  46.         moderator_edit_another_moderator($FORMref, $result, $modsel) if $sa eq "e";
  47.         moderator_mailing_list($FORMref, $result, $modsel) if $sa eq "l";
  48.         error_message("Moderator Management Error", "Error code MM001: Invalid Query", 0, 1);
  49.     }
  50.     if ($FORMref->{'action'} eq "mod_add") {
  51.         my %h = map { $_ => $FORMref->{$_} } ('user', 'pass1', 'email', 'pass2', 'fullname');
  52.         $h{'status'} = 9;
  53.         dreq("fcn-acct");
  54.         my ($success, $failed) = add_account( [ \%h ], { 'database' => 'passwd' });
  55.         error_message("Add moderator failed!", "Check that the username is not already taken.", 0, 1) if scalar(@{$success}) == 0;
  56.         $FORMref->{'mod'} = $h{'user'};
  57.         $FORMref->{'menu'} = 1;
  58.         moderator_manager($FORMref, $result, { what => 3, count => scalar(@{ $success }) });
  59.     }
  60.     if ($FORMref->{action} eq "mod_grp") {
  61.         moderator_group_assign($FORMref, $result);
  62.         my %l = map { $_, 1 } split(/,/, $FORMref->{affect});
  63.         moderator_group_assign_screen(\%l, $FORMref, 2);
  64. #        moderator_manager($FORMref, $result, { what => 4 } );
  65.     }
  66.     if ($FORMref->{action} eq "mod_priv") {
  67.         moderator_topic_assign($FORMref, $result);
  68.         moderator_manager($FORMref, $result, { what => 5 } );
  69.     }
  70.     if ($FORMref->{action} eq "mod_edit_save") {
  71.         dreq("adm-user");
  72.         my $r = user_edit_save_someone_else($FORMref, $result, "passwd");
  73.         moderator_edit_another_moderator($FORMref, $result, undef, undef, {editsave => 1}, $r);
  74.     }
  75.     if ($DCONF->{pro} && $FORMref->{action} eq "mod_notify") {
  76.         dreq("fcn-user-PRO");
  77.         my $emhash = {};
  78.         $emhash->{username} = $FORMref->{affect};
  79.         $emhash->{action} = "set_str";
  80.         $emhash->{new_str} = $FORMref->{group};
  81.         new_registrations_email_moderators_config_write([$emhash]);
  82.         moderator_group_assign_screen({ $FORMref->{affect} => 1 }, $FORMref, 1);
  83.     }
  84. }
  85.  
  86. ###
  87. ### moderator_mailing_list
  88. ###
  89. ### Generates a mailing list of all selected moderators
  90. ###
  91.  
  92. sub moderator_mailing_list {
  93.     my ($FORMref, $result, $w) = @_;
  94.     dreq("authpass");
  95.     my $Z = read_account_file("passwd", $w, { returnformat => "single_array" });
  96.     my %f = map { $_->{email}, 1 } @{$Z};
  97.     my $subst = {};
  98.     my @z = map { { email => $_ } } sort keys %f;
  99.     $subst->{addresses} = \@z;
  100.     screen_out("emlist", $subst);
  101. }
  102.  
  103. ###
  104. ### moderator_edit_another_moderator
  105. ###
  106. ### Edit the profile of a moderator
  107. ###
  108.  
  109. sub moderator_edit_another_moderator {
  110.     my ($FORMref, $result, $w, $subst_in, $stuff, $res) = @_;
  111.     dreq("adm-user");
  112.     my $subst = defined $subst_in ? $subst_in : {};
  113.     $subst = user_edit_someone_else($FORMref, $result, $w, $subst, $stuff, $res, "passwd");
  114.     screen_out("profile", $subst);
  115. }
  116.  
  117. ###
  118. ### delete_moderator
  119. ###
  120. ### Removes one or more moderators, and all of their privileges too
  121. ###
  122.  
  123. sub delete_moderator {
  124.     my ($deletemod) = @_;
  125.     dreq("fcn-acct", "fcn-grp", "fcn-priv");
  126.     my ($success, $failure) = delete_account($deletemod, undef, "passwd");
  127.     write_group_file( [ { group => "*", moderator => join(",", keys(%{ $deletemod })), action => "del_mod" } ] );
  128.     write_privilege_file( [ { topic => "*", moderator => join(",", keys(%{ $deletemod })), action => "del_mod" } ] );
  129.     return scalar(@{ $success });
  130. }
  131.  
  132. ###
  133. ### mod_act_setup
  134. ###
  135. ### Identifies marked moderators and removes superuser (who can't be deleted or
  136. ### otherwise acted upon from this screen)
  137. ###
  138.  
  139. sub mod_act_setup {
  140.     my ($action, $sw, $mark) = @_;
  141.     my %z = $sw eq '*' ? map {$_, 1} split(/,/, $mark) : map { $_, 1 } ($sw);        
  142.     delete $z{$DCONF->{superuser}} if $action ne 'l';
  143.     error_message("Moderator Action Error", "You did not select any moderators!  Remember that you cannot delete or edit the board administrator ($DCONF->{superuser}).", 0, 1) if scalar(keys(%z)) == 0;
  144.     return \%z;
  145. }
  146.  
  147. ###
  148. ### moderator_manager
  149. ###
  150. ### Moderator Manager interface
  151.  
  152. sub moderator_manager {
  153.     my ($FORMref, $result, $stuff) = @_;
  154.     my $subst = {};
  155.     $subst->{stuff} = $stuff;
  156.     my $j = read_account_file("passwd", undef, { returnformat => "single_array" });
  157.     my @j = sort { $a->{user} cmp $b->{user} } @{$j};
  158.     $subst->{'moderators'} = \@j;
  159.     $subst->{'general'}->{'username'} = $result->[0]->{user};
  160.     $subst->{'general'}->{'menu'} = $FORMref->{'menu'};
  161.     $subst->{'general'}->{'url'} = "$PARAMS->{cgiurl}?action=mod_mgr&username=$result->[0]->{user}";
  162.     screen_out("mdrtrmgr", $subst);
  163. }
  164.  
  165. ###
  166. ### moderator_group_assign
  167. ###
  168. ### Assigns groups to selected moderators
  169. ###
  170.  
  171. sub moderator_group_assign {
  172.     my ($FORMref) = @_;
  173.     dreq("fcn-grp");
  174.     my $grpfile = read_group_file();
  175.     my @actions = ();
  176.     my %q = map { $_, 1 } split(/,/, $FORMref->{group});
  177.     foreach my $grp (@{ $grpfile->{group_list} }) {
  178.         if ($q{$grp} == 1) {
  179.             push (@actions, { action => "add_mod", group => $grp, moderator => $FORMref->{'affect'} });
  180.         } else {
  181.             push (@actions, { action => "del_mod", group => $grp, moderator => $FORMref->{'affect'} });
  182.         }
  183.     }
  184.     write_group_file(\@actions);
  185. }
  186.  
  187. ###
  188. ### moderator_group_assign_screen
  189. ###
  190. ### Presents group selection screen for moderators
  191. ###
  192.  
  193. sub moderator_group_assign_screen {
  194.     my ($groupmod, $FORMref, $flag) = @_;
  195.     dreq("fcn-grp");
  196.     my $k = scalar(keys(%{ $groupmod }));
  197.     my $u = $k == 1 ? (keys(%{ $groupmod }))[0] : "";
  198.     my $group_file = read_group_file();
  199.     my @groups = ();
  200.     foreach my $group_name (@{ $group_file->{group_list} }) {
  201.         my $i = {}; my $c = 0;
  202.         $i->{name} = $group_name;
  203.         foreach my $mod (keys(%{ $groupmod })) {
  204.             $c += $group_file->{by_grp}->{$group_name}->{$mod};
  205.         }
  206.         $i->{checked} = ($c >= scalar(keys(%{ $groupmod })) ? 1 : 0);
  207.         push @groups, $i;
  208.     }
  209.     @groups = sort { lc($a->{name}) cmp lc($b->{name}) } @groups;
  210.     my $subst = {};
  211.     $subst->{general}->{mods} = $k;
  212.     $subst->{general}->{moduser} = $u;
  213.     $subst->{general}->{username} = $DCONF->{superuser};
  214.     $subst->{groups} = \@groups;
  215.     $subst->{general}->{affect} = join(",", keys(%{ $groupmod }));
  216.     if ($DCONF->{pro} && $GLOBAL_OPTIONS->{capable} && scalar(keys(%{ $groupmod })) == 1) {
  217.         dreq("selfreg-PRO", "fcn-user-PRO");
  218.         my $x = read_selfreg_file();
  219.         my @grps = ();
  220.         my $hash = new_registrations_email_moderators_config_read(0, $group_file);
  221.         foreach my $group (@groups) {
  222.             my $group_name = $group->{name};
  223.             my $param = $x->{param}->{$group_name}->{param};
  224.             if ($param == 2) {
  225.                 $group->{notify_checked} = 1 if $hash->{$u}->{groups}->{$group_name};
  226.                 $group->{notify_enabled} = 1;
  227.             }
  228.         }
  229.         my @mod = grep { $_->{notify_enabled} == 1 } @groups;
  230.         $subst->{groups2} = \@mod;
  231.         $subst->{general}->{queuemail} = 1 if scalar @mod;
  232.     }
  233.     $subst->{general}->{saved_flag} = $flag;
  234.     screen_out("modgrpas", $subst);
  235. }
  236.  
  237. ###
  238. ### moderator_topic_assign
  239. ###
  240. ### Assigns topics to selected moderators
  241. ###
  242.  
  243. sub moderator_topic_assign {
  244.     my ($FORMref) = @_;
  245.     dreq("fcn-priv");
  246.     my $topics = board_topics();
  247.     my @actions = ();
  248.     my %q = map { $_, 1 } split(/,/, $FORMref->{topic});
  249.     foreach my $tpc (@{ $topics }) {
  250.         next if $tpc->{type} == 2;
  251.         my $grp = $tpc->{number};
  252.         if ($q{$grp} == 1) {
  253.             push @actions, { action => "add_mod", topic => $grp, moderator => $FORMref->{'affect'} };
  254.         } else {
  255.             push @actions, { action => "del_mod", topic => $grp, moderator => $FORMref->{'affect'} };
  256.         }
  257.     }
  258.     write_privilege_file(\@actions);
  259. }
  260.  
  261.  
  262. ###
  263. ### moderator_topic_assign_screen
  264. ###
  265. ### Presents topic selection screen for moderators
  266. ###
  267.  
  268. sub moderator_topic_assign_screen {
  269.     my ($moderators, $FORMref, $result) = @_;
  270.     dreq("fcn-priv");
  271.     my $k = scalar(keys(%{ $moderators }));
  272.     my $u = $k == 1 ? (keys(%{ $moderators }))[0] : "";
  273.     my @corrective_actions = ();
  274.     my $topics = board_topics();
  275.     my $privileges_in = read_privilege_file();
  276.     my @topic_output = ();
  277.     foreach my $topic (@{ $topics }) {
  278.         next if $topic->{type} == 2;
  279.         if (! defined $privileges_in->{by_topic}->{ $topic->{number} }) {
  280.             push (@corrective_actions, { action => 'add_topic', topic => $topic->{number}, moderator => 'admin' });
  281.             $privileges_in->{by_topic}->{ $topic->{number} }->{$DCONF->{superuser}} = 1;
  282.         }
  283.         my $i = {}; my $c = 0;
  284.         $i->{number} = $topic->{number};
  285.         foreach my $mod (keys(%{ $moderators })) {
  286.             $c += $privileges_in->{by_topic}->{$topic->{number}}->{$mod};
  287.         }
  288.         $i->{checked} = ($c >= scalar(keys(%{ $moderators })) ? 1 : 0);
  289.         $i->{name} = $topic->{name};
  290.         push @topic_output, $i;
  291.     }
  292.     write_privilege_file(\@corrective_actions) if scalar(@corrective_actions);
  293.     my $subst = {};
  294.     $subst->{general}->{mods} = $k;
  295.     $subst->{general}->{moduser} = $u;
  296.     $subst->{general}->{username} = $result->[0]->{user};
  297.     $subst->{topics} = \@topic_output;
  298.     $subst->{general}->{affect} = join(",", keys(%{ $moderators }));
  299.     screen_out("modpriv", $subst);
  300. }
  301.  
  302. 1;
  303.