diff --git a/lib/Lacuna/DB/Result/Empire.pm b/lib/Lacuna/DB/Result/Empire.pm index 36df11c6..131b7afa 100644 --- a/lib/Lacuna/DB/Result/Empire.pm +++ b/lib/Lacuna/DB/Result/Empire.pm @@ -535,14 +535,16 @@ sub get_latest_message_id { } # The number of times a RPC has been made to this empire -has rpc_count => ( - is => 'ro', - lazy => 1, - default => sub { - my $self = shift; - return Lacuna->cache->increment('rpc_count_'.format_date(undef,'%d'), $self->id, 1, 60 * 60 * 30); - } -); +sub rpc_count { + my $self = shift; + Lacuna->cache->get('rpc_count_'.format_date(undef,'%d'), $self->id); +} + +sub inc_rpc_count { + my $self = shift; + Carp::cluck "incrementing RPC"; + return Lacuna->cache->increment('rpc_count_'.format_date(undef,'%d'), $self->id, 1, 60 * 60 * 30); +} # Reseting the RPC count for an empire should be done only under dire # circumstances, or for testing purposes. In that case, this can diff --git a/lib/Lacuna/RPC.pm b/lib/Lacuna/RPC.pm index 79a754ea..bb24978b 100644 --- a/lib/Lacuna/RPC.pm +++ b/lib/Lacuna/RPC.pm @@ -77,39 +77,42 @@ sub get_session { my $empire = $session->current_empire; if (defined $empire) { - my $throttle = Lacuna->config->get('rpc_throttle') || 30; - if (my $delay = Lacuna->cache->get('rpc_block', $opts->{session_id})) { - confess [1010, 'Too fast response, ' . $empire->name . '!']; - } - if ($empire->rpc_rate > $throttle) { - Lacuna->cache->increment('rpc_limit_'.format_date(undef,'%d'), $empire->id, 1, 60 * 60 * 30); - confess [1010, 'Slow down '.$empire->name.'! No more than '.$throttle.' requests per minute.']; - } - my $max = Lacuna->config->get('rpc_limit') || 2500; - if ($empire->rpc_count > $max) { - confess [1010, $empire->name.' has already made the maximum number of requests ('.$max.') you can make for one day.']; - } - my $ipr = real_ip_address($self->plack_request); - if (!$session->ip_address && $ipr) { - $log->debug("Missing IP address, adding $ipr"); - $session->ip_address($ipr); - $session->update; - } - my $ipm = $session->ip_address eq $ipr; - my $i = 1; - my @caller = caller($i); - while (@caller) - { - last if $caller[0] =~ /Lacuna::RPC/; - @caller = caller(++$i); + if (!$session->rpc_counted) { + $session->rpc_counted(1); + my $throttle = Lacuna->config->get('rpc_throttle') || 30; + if (my $delay = Lacuna->cache->get('rpc_block', $opts->{session_id})) { + confess [1010, 'Too fast response, ' . $empire->name . '!']; + } + if ($empire->rpc_rate > $throttle) { + Lacuna->cache->increment('rpc_limit_'.format_date(undef,'%d'), $empire->id, 1, 60 * 60 * 30); + confess [1010, 'Slow down '.$empire->name.'! No more than '.$throttle.' requests per minute.']; + } + my $max = Lacuna->config->get('rpc_limit') || 2500; + if ($empire->inc_rpc_count > $max) { + confess [1010, $empire->name.' has already made the maximum number of requests ('.$max.') you can make for one day.']; + } + my $ipr = real_ip_address($self->plack_request); + if (!$session->ip_address && $ipr) { + $log->debug("Missing IP address, adding $ipr"); + $session->ip_address($ipr); + $session->update; + } + my $ipm = $session->ip_address eq $ipr; + my $i = 1; + my @caller = caller($i); + while (@caller) + { + last if $caller[0] =~ /Lacuna::RPC/; + @caller = caller(++$i); + } + $log->info(sprintf "ACTUAL:ipr=%s,ipe=%s,ipm=%s,ses=%s,sat:%d,rpc=%s", $ipr, $session->ip_address, $ipm, $opts->{session_id}, $session->is_sitter ? 1 : 0, $caller[3]); + #Lacuna->db->resultset('Lacuna::DB::Result::Log::RPC')->new({ + # empire_id => $empire->id, + # empire_name => $empire->name, + # module => ref $self, + # api_key => $empire->current_session->api_key, + #})->insert; } - $log->info(sprintf "ACTUAL:ipr=%s,ipe=%s,ipm=%s,ses=%s,sat:%d,rpc=%s", $ipr, $session->ip_address, $ipm, $opts->{session_id}, $session->is_sitter ? 1 : 0, $caller[3]); - #Lacuna->db->resultset('Lacuna::DB::Result::Log::RPC')->new({ - # empire_id => $empire->id, - # empire_name => $empire->name, - # module => ref $self, - # api_key => $empire->current_session->api_key, - #})->insert; } else { confess [1002, 'Empire does not exist.']; diff --git a/lib/Lacuna/Session.pm b/lib/Lacuna/Session.pm index 9177fbac..1e109802 100644 --- a/lib/Lacuna/Session.pm +++ b/lib/Lacuna/Session.pm @@ -183,5 +183,9 @@ sub start { return $self->extend; } +# this is to double-ensure we don't rpc-count twice, so we don't want +# this saved as part of the overall session in memcached. +has rpc_counted => ( is => 'rw' ); + no Moose; __PACKAGE__->meta->make_immutable;