diff options
| author | fukachan <fukachan> | 2003-06-29 05:48:11 +0000 |
|---|---|---|
| committer | fukachan <fukachan> | 2003-06-29 05:48:11 +0000 |
| commit | c430e5927022c32d3ecdba41226d87599e1985be (patch) | |
| tree | dd0ef6b331b4d255cb308e01785b92ea8aa02b73 /fml/lib/FML/Command | |
| parent | ce5c220db7788bcddc8c3a104641a2b42f236ba9 (diff) | |
| download | fml8-c430e5927022c32d3ecdba41226d87599e1985be.tar.gz fml8-c430e5927022c32d3ecdba41226d87599e1985be.tar.bz2 fml8-c430e5927022c32d3ecdba41226d87599e1985be.zip | |
check the number of request in get commands.
Diffstat (limited to 'fml/lib/FML/Command')
| -rw-r--r-- | fml/lib/FML/Command/SendFile.pm | 34 | ||||
| -rw-r--r-- | fml/lib/FML/Command/User/get.pm | 55 |
2 files changed, 85 insertions, 4 deletions
diff --git a/fml/lib/FML/Command/SendFile.pm b/fml/lib/FML/Command/SendFile.pm index a3b14637..dff193c0 100644 --- a/fml/lib/FML/Command/SendFile.pm +++ b/fml/lib/FML/Command/SendFile.pm @@ -4,7 +4,7 @@ # All rights reserved. This program is free software; you can # redistribute it and/or modify it under the same terms as Perl itself. # -# $FML: SendFile.pm,v 1.26 2003/03/16 13:00:13 fukachan Exp $ +# $FML: SendFile.pm,v 1.27 2003/03/28 10:03:39 fukachan Exp $ # package FML::Command::SendFile; @@ -48,6 +48,32 @@ C<FML::Command::Admin> modules. =cut +# Descriptions: return the number of files specified in $command_args. +# Arguments: OBJ($self) OBJ($curproc) HASH_REF($command_args) +# Side Effects: none +# Return Value: none +sub num_files_in_send_article_args +{ + my ($self, $curproc, $command_args) = @_; + my $command = $command_args->{ command }; + my $count = 0; + + # command buffer = get 1 + # command buffer = get 1,2,3 + # command buffer = get last:3 + my (@files) = split(/\s+/, $command); + shift @files; # remove get + for my $fn (@files) { + my $filelist = $self->_get_valid_article_list($curproc, $fn); + if (defined $filelist) { + $count = $#$filelist + 1; + } + } + + return $count; +} + + # Descriptions: send back articles # Arguments: OBJ($self) OBJ($curproc) HASH_REF($command_args) # Side Effects: none @@ -84,6 +110,12 @@ sub send_article }); } else { + $curproc->reply_message_nl('command.no_such_article', + "no such article $filename", + { + _arg_article => $filename, + } + ); Log("no such file: $filepath"); } } diff --git a/fml/lib/FML/Command/User/get.pm b/fml/lib/FML/Command/User/get.pm index 17b5021b..30a64438 100644 --- a/fml/lib/FML/Command/User/get.pm +++ b/fml/lib/FML/Command/User/get.pm @@ -4,7 +4,7 @@ # All rights reserved. This program is free software; you can # redistribute it and/or modify it under the same terms as Perl itself. # -# $FML: get.pm,v 1.15 2003/02/16 08:49:12 fukachan Exp $ +# $FML: get.pm,v 1.16 2003/03/18 10:42:44 fukachan Exp $ # package FML::Command::User::get; @@ -30,8 +30,6 @@ send back articles. =head1 METHODS -=head2 C<process()> - =cut @@ -62,6 +60,57 @@ sub need_lock { 1;} sub lock_channel { return 'article_spool_modify';} +=head2 check_limit($curproc, $command_args) + +=cut + + +# Descriptions: check the limit specific to this command. +# Arguments: OBJ($self) OBJ($curproc) HASH_REF($command_args) +# Side Effects: none +# Return Value: NUM(1 or 0) +sub check_limit +{ + my ($self, $curproc, $command_args) = @_; + my $config = $curproc->config(); + my $pcb = $curproc->pcb(); + my $total = $pcb->get('command', 'get_command_total_num_request') || 0; + + # 1. check the number of article in one command. + my $limit = $config->{ get_command_request_limit } || 10; + my $nreq = $self->num_files_in_send_article_args($curproc, $command_args); + my $name = $command_args->{ comname }; + my $_args = { _arg_command => $name, }; + + # 1.1 total number of requested articles. + my $total_num_req = $total + $nreq; + $pcb->set('command', 'get_command_total_num_request', $total_num_req); + + if ($total_num_req > $limit) { + $curproc->reply_message_nl('command.exceed_total_request_limit', + 'total requests exceed limit', + $_args); + LogError("get command limit: total=$total_num_req > $limit"); + return $nreq; + } + elsif ($nreq > $limit) { + $curproc->reply_message_nl('command.exceed_request_limit', + 'requests exceed limit', + $_args); + LogError("get command limit: $nreq > $limit"); + return $nreq; + } + else { + return 0; + } +} + + +=head2 process() + +=cut + + # Descriptions: send articles (filename =~ /^\d+/$) by FML::Command::SendFile. # This module is called after # FML::Process::Command::_can_accpet_command() already checks the |
