1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
require 'net/http'
require 'uri'
require 'cgi'
require 'yaml'
require 'rakismet/model'
require 'rakismet/middleware'
require 'rakismet/version'
if defined?(Rails) && Rails::VERSION::STRING > '3.2.0'
  require 'rakismet/railtie.rb'
  $stderr.puts "W: on Rails 3, this vendored version of rakismet should be replaced by a proper dependency"
end
module Rakismet
  Request = Struct.new(:user_ip, :user_agent, :referrer)
  Undefined = Class.new(NameError)
  class << self
    attr_accessor :key, :url, :host, :proxy_host, :proxy_port, :test
    def request
      @request ||= Request.new
    end
    def set_request_vars(env)
      request.user_ip, request.user_agent, request.referrer =
        env['REMOTE_ADDR'], env['HTTP_USER_AGENT'], env['HTTP_REFERER']
    end
    def clear_request
      @request = Request.new
    end
    def headers
      @headers ||= begin
        user_agent = "Rakismet/#{Rakismet::VERSION}"
        user_agent = "Rails/#{Rails.version} | " + user_agent if defined?(Rails)
        { 'User-Agent' => user_agent, 'Content-Type' => 'application/x-www-form-urlencoded' }
      end
    end
    def validate_key
      validate_config
      akismet = URI.parse(verify_url)
      response = Net::HTTP::Proxy(proxy_host, proxy_port).start(akismet.host) do |http|
        data = "key=#{Rakismet.key}&blog=#{Rakismet.url}"
        http.post(akismet.path, data, Rakismet.headers)
      end
      @valid_key = (response.body == 'valid')
    end
    def valid_key?
      @valid_key == true
    end
    def akismet_call(function, args={})
      validate_config
      args.merge!(:blog => Rakismet.url, :is_test => Rakismet.test_mode)
      akismet = URI.parse(call_url(function))
      response = Net::HTTP::Proxy(proxy_host, proxy_port).start(akismet.host) do |http|
        params = args.map do |k,v|
          param = v.class < String ? v.to_str : v.to_s # for ActiveSupport::SafeBuffer and Nil, respectively
          "#{k}=#{CGI.escape(param)}"
        end
        http.post(akismet.path, params.join('&'), Rakismet.headers)
      end
      response.body
    end
    protected
    def verify_url
      "http://#{Rakismet.host}/1.1/verify-key"
    end
    def call_url(function)
      "http://#{Rakismet.key}.#{Rakismet.host}/1.1/#{function}"
    end
    def validate_config
      raise Undefined, "Rakismet.key is not defined"  if Rakismet.key.nil? || Rakismet.key.empty?
      raise Undefined, "Rakismet.url is not defined"  if Rakismet.url.nil? || Rakismet.url.empty?
      raise Undefined, "Rakismet.host is not defined" if Rakismet.host.nil? || Rakismet.host.empty?
    end
    def test_mode
      test ? 1 : 0
    end
  end
end