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 | |
| 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')
| -rw-r--r-- | fml/etc/default_config.cf.ja.in | 13 | ||||
| -rw-r--r-- | fml/etc/src/config.cf.ja/command.cf | 13 | ||||
| -rw-r--r-- | fml/lib/FML/Command.pm | 7 | ||||
| -rw-r--r-- | fml/lib/FML/Command/SendFile.pm | 34 | ||||
| -rw-r--r-- | fml/lib/FML/Command/User/get.pm | 55 |
5 files changed, 117 insertions, 5 deletions
diff --git a/fml/etc/default_config.cf.ja.in b/fml/etc/default_config.cf.ja.in index 8158008b..5729ad74 100644 --- a/fml/etc/default_config.cf.ja.in +++ b/fml/etc/default_config.cf.ja.in @@ -1196,6 +1196,19 @@ outgoing_command_mail_header_size_limit = $default_mail_header_size_limit outgoing_command_mail_body_size_limit = $default_mail_body_size_limit +=head2 特定のコマンドの制限 + + +# Descriptions: get コマンドで指定できる記事数の上限。 +# 一つの get コマンドの上限であり、かつ、 +# 複数の get コマンドのリクエスト記事数を全部足し合わせた値が +# この値を越えていないか?もチェックされる。 +# History: $MGET_SEND_BACK_FILES_LIMIT +# Value: NUM +# Examples: 100 +get_command_request_limit = 100 + + =head2 フィルタ diff --git a/fml/etc/src/config.cf.ja/command.cf b/fml/etc/src/config.cf.ja/command.cf index ba9f2837..a2bb782c 100644 --- a/fml/etc/src/config.cf.ja/command.cf +++ b/fml/etc/src/config.cf.ja/command.cf @@ -43,6 +43,19 @@ outgoing_command_mail_header_size_limit = $default_mail_header_size_limit outgoing_command_mail_body_size_limit = $default_mail_body_size_limit +=head2 特定のコマンドの制限 + + +# Descriptions: get コマンドで指定できる記事数の上限。 +# 一つの get コマンドの上限であり、かつ、 +# 複数の get コマンドのリクエスト記事数を全部足し合わせた値が +# この値を越えていないか?もチェックされる。 +# History: $MGET_SEND_BACK_FILES_LIMIT +# Value: NUM +# Examples: 100 +get_command_request_limit = 100 + + =head2 フィルタ diff --git a/fml/lib/FML/Command.pm b/fml/lib/FML/Command.pm index b2fd14a5..2b7eb27e 100644 --- a/fml/lib/FML/Command.pm +++ b/fml/lib/FML/Command.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: Command.pm,v 1.37 2003/03/16 10:47:22 fukachan Exp $ +# $FML: Command.pm,v 1.38 2003/03/18 10:42:40 fukachan Exp $ # # XXX @@ -193,6 +193,11 @@ sub AUTOLOAD $command->auth($curproc, $command_args); } + if ($command->can('check_limit')) { + my $n = $command->check_limit($curproc, $command_args); + if ($n) { croak("exceed limit");} + } + # this command needs lock (currently giant lock) ? if ($command->can('need_lock')) { $need_lock = $command->need_lock($mode); 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 |
