journalduhacker/app/controllers/application_controller.rb

118 lines
2.8 KiB
Ruby
Raw Permalink Normal View History

class ApplicationController < ActionController::Base
protect_from_forgery
2012-07-01 00:43:45 +02:00
before_filter :authenticate_user
before_filter :increase_traffic_counter
2016-10-30 19:10:29 +01:00
TRAFFIC_DECREMENTER = 0.40
TAG_FILTER_COOKIE = :tag_filters
2012-07-01 00:43:45 +02:00
def authenticate_user
# eagerly evaluate, in case this triggers an IpSpoofAttackError
request.remote_ip
2014-01-12 20:27:52 +01:00
if session[:u] &&
2014-01-12 22:09:32 +01:00
(user = User.where(:session_token => session[:u].to_s).first) &&
user.is_active?
2014-01-12 22:09:32 +01:00
@user = user
2014-01-12 20:27:52 +01:00
Rails.logger.info " Logged in as user #{@user.id} (#{@user.username})"
end
true
end
def increase_traffic_counter
@traffic = 1.0
Keystore.transaction do
2014-01-09 06:01:54 +01:00
now_i = Time.now.to_i
date_kv = Keystore.find_or_create_key_for_update("traffic:date", now_i)
traffic_kv = Keystore.find_or_create_key_for_update("traffic:hits", 0)
2016-03-22 20:07:39 +01:00
traffic = traffic_kv.value.to_i
# don't increase traffic counter for bots or api requests
unless agent_is_spider? || [ "json", "rss" ].include?(params[:format])
2016-03-22 20:07:39 +01:00
traffic += 100
end
# every second, decrement traffic by some amount
2014-01-09 06:01:54 +01:00
traffic -= (100.0 * (now_i - date_kv.value) * TRAFFIC_DECREMENTER).to_i
2016-03-22 20:07:39 +01:00
2015-06-19 20:25:02 +02:00
# clamp to 100, 1000
traffic = [ [ 100, traffic ].max, 10000 ].min
2014-01-09 06:01:54 +01:00
@traffic = traffic * 0.01
traffic_kv.value = traffic
traffic_kv.save!
date_kv.value = now_i
date_kv.save!
2016-03-22 20:07:39 +01:00
Rails.logger.info " Traffic level: #{@traffic.to_i}"
2015-06-19 20:25:02 +02:00
end
2017-05-16 19:35:07 +02:00
intensity = (@traffic * 7).floor + 50.0
2017-05-23 14:18:03 +02:00
if (blue = (rand(2000000) == 1)) && @user
Rails.logger.info " User #{@user.id} (#{@user.username}) saw blue logo"
end
color = (blue ? "0000%02x" : "%02x0000")
2017-05-16 19:35:07 +02:00
@traffic_color = sprintf(color, intensity > 255 ? 255 : intensity)
2016-06-19 02:25:57 +02:00
true
end
2012-07-01 00:43:45 +02:00
def require_logged_in_user
if @user
true
else
if request.get?
session[:redirect_to] = request.original_fullpath
end
redirect_to "/login"
end
end
def require_logged_in_moderator
require_logged_in_user
if @user
if @user.is_moderator?
true
else
flash[:error] = "You are not authorized to access that resource."
return redirect_to "/"
end
end
end
def require_logged_in_user_or_400
if @user
true
else
render :text => "not logged in", :status => 400
return false
end
end
@_tags_filtered = nil
def tags_filtered_by_cookie
@_tags_filtered ||= Tag.where(
:tag => cookies[TAG_FILTER_COOKIE].to_s.split(",")
)
end
2016-03-22 20:07:39 +01:00
def agent_is_spider?
2014-06-12 02:34:41 +02:00
ua = request.env["HTTP_USER_AGENT"].to_s
(ua == "" || ua.match(/(Google|bing|Slack|Twitter)bot|Slurp|crawler|Feedly|FeedParser|RSS/))
2016-03-22 20:07:39 +01:00
end
2013-01-14 04:39:52 +01:00
def find_user_from_rss_token
if !@user && request[:format] == "rss" && params[:token].to_s.present?
@user = User.where(:rss_token => params[:token].to_s).first
2013-01-14 04:39:52 +01:00
end
end
end