diff --git a/Gemfile b/Gemfile index f868b241b48..d66fa0a29c0 100644 --- a/Gemfile +++ b/Gemfile @@ -26,7 +26,6 @@ gem 'fast_xs' gem 'fast_xor', git: 'https://github.com/CodeMonkeySteve/fast_xor.git' gem 'fastimage' gem 'fog', require: false -gem 'has_ip_address' gem 'hiredis' gem 'email_reply_parser', git: 'https://github.com/lawrencepit/email_reply_parser.git' diff --git a/Gemfile.lock b/Gemfile.lock index a3fc2482510..15203c20dcc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -212,7 +212,6 @@ GEM guard (>= 1.1) spork (>= 0.8.4) handlebars-source (1.0.0.rc4) - has_ip_address (0.0.1) hashie (2.0.4) highline (1.6.18) hike (1.2.2) @@ -489,7 +488,6 @@ DEPENDENCIES guard-rspec guard-spork handlebars-source (= 1.0.0.rc4) - has_ip_address highline hiredis image_optim diff --git a/app/models/topic_link_click.rb b/app/models/topic_link_click.rb index 5604505258f..174122b6ccb 100644 --- a/app/models/topic_link_click.rb +++ b/app/models/topic_link_click.rb @@ -5,10 +5,8 @@ class TopicLinkClick < ActiveRecord::Base belongs_to :topic_link, counter_cache: :clicks belongs_to :user - has_ip_address :ip - validates_presence_of :topic_link_id - validates_presence_of :ip + validates_presence_of :ip_address # Create a click from a URL and post_id def self.create_from(args={}) @@ -28,7 +26,7 @@ class TopicLinkClick < ActiveRecord::Base rate_key = "link-clicks:#{link.id}:#{args[:user_id] || args[:ip]}" if $redis.setnx(rate_key, "1") $redis.expire(rate_key, 1.day.to_i) - create!(topic_link_id: link.id, user_id: args[:user_id], ip: args[:ip]) + create!(topic_link_id: link.id, user_id: args[:user_id], ip_address: args[:ip]) end args[:url] @@ -43,9 +41,9 @@ end # id :integer not null, primary key # topic_link_id :integer not null # user_id :integer -# ip :integer not null # created_at :datetime not null # updated_at :datetime not null +# ip_address :string not null # # Indexes # diff --git a/app/models/view.rb b/app/models/view.rb index d7e29c2f23f..efe6423e548 100644 --- a/app/models/view.rb +++ b/app/models/view.rb @@ -3,7 +3,7 @@ require 'ipaddr' class View < ActiveRecord::Base belongs_to :parent, polymorphic: true belongs_to :user - validates_presence_of :parent_type, :parent_id, :ip, :viewed_at + validates_presence_of :parent_type, :parent_id, :ip_address, :viewed_at # TODO: This could happen asyncronously def self.create_for(parent, ip, user=nil) @@ -20,7 +20,7 @@ class View < ActiveRecord::Base $redis.expire(redis_key, 1.day.to_i) View.transaction do - View.create(parent: parent, ip: IPAddr.new(ip).to_i, viewed_at: Date.today, user: user) + View.create(parent: parent, ip_address: ip, viewed_at: Date.today, user: user) # Update the views count in the parent, if it exists. if parent.respond_to?(:views) @@ -37,9 +37,9 @@ end # # parent_id :integer not null # parent_type :string(50) not null -# ip :integer not null # viewed_at :date not null # user_id :integer +# ip_address :string not null # # Indexes # diff --git a/db/migrate/20130624203206_change_ip_to_inet_in_topic_link_clicks.rb b/db/migrate/20130624203206_change_ip_to_inet_in_topic_link_clicks.rb new file mode 100644 index 00000000000..a0c3924bfdb --- /dev/null +++ b/db/migrate/20130624203206_change_ip_to_inet_in_topic_link_clicks.rb @@ -0,0 +1,21 @@ +require 'ipaddr' + +class ChangeIpToInetInTopicLinkClicks < ActiveRecord::Migration + def up + add_column :topic_link_clicks, :ip_address, :inet + + execute "UPDATE topic_link_clicks SET ip_address = inet( + (ip >> 24 & 255) || '.' || + (ip >> 16 & 255) || '.' || + (ip >> 8 & 255) || '.' || + (ip >> 0 & 255) + );" + + change_column :topic_link_clicks, :ip_address, :inet, { :null => false } + remove_column :topic_link_clicks, :ip + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20130625022454_change_ip_to_inet_in_views.rb b/db/migrate/20130625022454_change_ip_to_inet_in_views.rb new file mode 100644 index 00000000000..30a0e8390bc --- /dev/null +++ b/db/migrate/20130625022454_change_ip_to_inet_in_views.rb @@ -0,0 +1,22 @@ +require 'ipaddr' + +class ChangeIpToInetInViews < ActiveRecord::Migration + def up + table = :views + add_column table, :ip_address, :inet + + execute "UPDATE views SET ip_address = inet( + (ip >> 24 & 255) || '.' || + (ip >> 16 & 255) || '.' || + (ip >> 8 & 255) || '.' || + (ip >> 0 & 255) + );" + + change_column table, :ip_address, :inet, { :null => false } + remove_column table, :ip + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/docs/SOFTWARE.md b/docs/SOFTWARE.md index ba1a139ac14..54f26c0c6d9 100644 --- a/docs/SOFTWARE.md +++ b/docs/SOFTWARE.md @@ -27,7 +27,6 @@ The following Ruby Gems are used in Discourse: * [omniauth-facebook](https://github.com/mkdynamic/omniauth-facebook) * [omniauth-twitter](https://github.com/arunagw/omniauth-twitter) * [omniauth-github](https://github.com/intridea/omniauth-github) -* [has_ip_address](https://rubygems.org/gems/has_ip_address) * [vestal_versions](https://rubygems.org/gems/vestal_versions) * [uglifier](https://rubygems.org/gems/uglifier) * [nokogiri](https://rubygems.org/gems/nokogiri) diff --git a/spec/models/topic_link_click_spec.rb b/spec/models/topic_link_click_spec.rb index fce47cb5978..1580de1ac57 100644 --- a/spec/models/topic_link_click_spec.rb +++ b/spec/models/topic_link_click_spec.rb @@ -26,7 +26,7 @@ describe TopicLinkClick do context 'create' do before do - TopicLinkClick.create(topic_link: @topic_link, ip: '192.168.1.1') + TopicLinkClick.create(topic_link: @topic_link, ip_address: '192.168.1.1') end it 'creates the forum topic link click' do @@ -39,7 +39,7 @@ describe TopicLinkClick do end it 'serializes and deserializes the IP' do - TopicLinkClick.first.ip.to_s.should == '192.168.1.1' + TopicLinkClick.first.ip_address.to_s.should == '192.168.1.1' end end diff --git a/spec/models/topic_link_spec.rb b/spec/models/topic_link_spec.rb index 820d45b5977..29d7422a29a 100644 --- a/spec/models/topic_link_spec.rb +++ b/spec/models/topic_link_spec.rb @@ -236,7 +236,7 @@ describe TopicLink do it 'has the correct results' do TopicLink.extract_from(post) topic_link = post.topic.topic_links.first - TopicLinkClick.create(topic_link: topic_link, ip: '192.168.1.1') + TopicLinkClick.create(topic_link: topic_link, ip_address: '192.168.1.1') counts_for[post.id].should be_present counts_for[post.id].find {|l| l[:url] == 'http://google.com'}[:clicks].should == 0 diff --git a/spec/models/view_spec.rb b/spec/models/view_spec.rb index 6a2ac8d9f15..b4e0052db01 100644 --- a/spec/models/view_spec.rb +++ b/spec/models/view_spec.rb @@ -6,7 +6,7 @@ describe View do it { should belong_to :user } it { should validate_presence_of :parent_type } it { should validate_presence_of :parent_id } - it { should validate_presence_of :ip } + it { should validate_presence_of :ip_address } it { should validate_presence_of :viewed_at }