2012-06-17 03:15:46 +02:00
|
|
|
class ApplicationController < ActionController::Base
|
|
|
|
protect_from_forgery
|
2012-07-01 00:43:45 +02:00
|
|
|
before_filter :authenticate_user
|
2012-08-16 23:11:30 +02:00
|
|
|
before_filter :increase_traffic_counter
|
|
|
|
|
2016-10-30 19:10:29 +01:00
|
|
|
TRAFFIC_DECREMENTER = 0.40
|
2012-06-17 03:15:46 +02:00
|
|
|
|
2013-08-05 09:16:33 +02:00
|
|
|
TAG_FILTER_COOKIE = :tag_filters
|
|
|
|
|
2012-07-01 00:43:45 +02:00
|
|
|
def authenticate_user
|
2017-05-20 15:21:07 +02:00
|
|
|
# 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) &&
|
2014-01-13 17:12:17 +01:00
|
|
|
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})"
|
2012-06-17 03:15:46 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
2012-08-16 23:11:30 +02:00
|
|
|
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)
|
2012-08-16 23:11:30 +02:00
|
|
|
|
2016-03-22 20:07:39 +01:00
|
|
|
traffic = traffic_kv.value.to_i
|
|
|
|
|
|
|
|
# don't increase traffic counter for bots or api requests
|
2016-11-03 22:19:39 +01:00
|
|
|
unless agent_is_spider? || [ "json", "rss" ].include?(params[:format])
|
2016-03-22 20:07:39 +01:00
|
|
|
traffic += 100
|
|
|
|
end
|
|
|
|
|
2012-08-16 23:11:30 +02:00
|
|
|
# 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
|
2012-08-16 23:11:30 +02:00
|
|
|
|
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!
|
2012-08-17 20:36:30 +02:00
|
|
|
|
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
|
2012-08-17 20:36:30 +02:00
|
|
|
|
2017-05-16 19:35:07 +02:00
|
|
|
intensity = (@traffic * 7).floor + 50.0
|
|
|
|
color = rand(2000000) == 1 ? "0000%02x" : "%02x0000"
|
|
|
|
@traffic_color = sprintf(color, intensity > 255 ? 255 : intensity)
|
2016-06-19 02:25:57 +02:00
|
|
|
|
2012-08-17 20:36:30 +02:00
|
|
|
true
|
2012-08-16 23:11:30 +02:00
|
|
|
end
|
|
|
|
|
2012-07-01 00:43:45 +02:00
|
|
|
def require_logged_in_user
|
|
|
|
if @user
|
2012-06-17 03:15:46 +02:00
|
|
|
true
|
|
|
|
else
|
2014-08-08 17:16:06 +02:00
|
|
|
if request.get?
|
|
|
|
session[:redirect_to] = request.original_fullpath
|
|
|
|
end
|
|
|
|
|
2012-06-17 03:15:46 +02:00
|
|
|
redirect_to "/login"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-06-26 17:27:04 +02:00
|
|
|
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
|
|
|
|
|
2012-06-17 03:15:46 +02:00
|
|
|
def require_logged_in_user_or_400
|
|
|
|
if @user
|
|
|
|
true
|
|
|
|
else
|
|
|
|
render :text => "not logged in", :status => 400
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
2012-12-17 01:46:38 +01:00
|
|
|
|
2013-08-05 09:16:33 +02:00
|
|
|
@_tags_filtered = nil
|
|
|
|
def tags_filtered_by_cookie
|
2013-12-24 04:20:06 +01:00
|
|
|
@_tags_filtered ||= Tag.where(
|
|
|
|
:tag => cookies[TAG_FILTER_COOKIE].to_s.split(",")
|
|
|
|
)
|
2013-08-05 09:16:33 +02:00
|
|
|
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
|
2016-11-03 22:19:39 +01:00
|
|
|
(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?
|
2013-12-24 04:20:06 +01:00
|
|
|
@user = User.where(:rss_token => params[:token].to_s).first
|
2013-01-14 04:39:52 +01:00
|
|
|
end
|
|
|
|
end
|
2012-06-17 03:15:46 +02:00
|
|
|
end
|