summaryrefslogtreecommitdiff
path: root/fml
diff options
context:
space:
mode:
authorfukachan <fukachan>2003-06-29 05:48:11 +0000
committerfukachan <fukachan>2003-06-29 05:48:11 +0000
commitc430e5927022c32d3ecdba41226d87599e1985be (patch)
treedd0ef6b331b4d255cb308e01785b92ea8aa02b73 /fml
parentce5c220db7788bcddc8c3a104641a2b42f236ba9 (diff)
downloadfml8-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.in13
-rw-r--r--fml/etc/src/config.cf.ja/command.cf13
-rw-r--r--fml/lib/FML/Command.pm7
-rw-r--r--fml/lib/FML/Command/SendFile.pm34
-rw-r--r--fml/lib/FML/Command/User/get.pm55
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