From 3326fe906a3d5195e51484c3218f28a98dec9c8b Mon Sep 17 00:00:00 2001 From: Braulio Bhavamitra Date: Thu, 25 Jun 2015 22:50:39 -0300 Subject: [PATCH] Associate user with sessions --- app/models/session.rb | 18 ++++++++++++++++++ app/models/user.rb | 2 ++ config/application.rb | 2 +- config/initializers/session.rb | 4 ++++ db/migrate/20150625234824_add_user_id_to_session.rb | 31 +++++++++++++++++++++++++++++++ db/schema.rb | 4 +++- 6 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 app/models/session.rb create mode 100644 config/initializers/session.rb create mode 100644 db/migrate/20150625234824_add_user_id_to_session.rb diff --git a/app/models/session.rb b/app/models/session.rb new file mode 100644 index 0000000..0cf82a5 --- /dev/null +++ b/app/models/session.rb @@ -0,0 +1,18 @@ +class Session < ActiveRecord::SessionStore::Session + + # removed and redefined on super class + def self.find_by_session_id session_id + super + end + + belongs_to :user + + before_save :copy_to_columns + + protected + + def copy_to_columns + self.user_id = self.data['user'] + end + +end diff --git a/app/models/user.rb b/app/models/user.rb index b25801a..c205438 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -96,6 +96,8 @@ class User < ActiveRecord::Base has_one :person, :dependent => :destroy belongs_to :environment + has_many :sessions, dependent: :destroy + attr_protected :activated_at # Virtual attribute for the unencrypted password diff --git a/config/application.rb b/config/application.rb index 0775e71..1112e63 100644 --- a/config/application.rb +++ b/config/application.rb @@ -126,7 +126,7 @@ module Noosfero # Make sure the secret is at least 30 characters and all random, # no regular words or you'll be exposed to dictionary attacks. config.secret_token = noosfero_session_secret - config.session_store :cookie_store, :key => '_noosfero_session' + config.session_store :active_record_store, key: '_noosfero_session' config.paths['db/migrate'] += Dir.glob "#{Rails.root}/{baseplugins,config/plugins}/*/db/migrate" config.i18n.load_path += Dir.glob "#{Rails.root}/{baseplugins,config/plugins}/*/locales/*.{rb,yml}" diff --git a/config/initializers/session.rb b/config/initializers/session.rb new file mode 100644 index 0000000..5e7548e --- /dev/null +++ b/config/initializers/session.rb @@ -0,0 +1,4 @@ +ActionDispatch::Reloader.to_prepare do + ActiveRecord::SessionStore.session_class = Session +end + diff --git a/db/migrate/20150625234824_add_user_id_to_session.rb b/db/migrate/20150625234824_add_user_id_to_session.rb new file mode 100644 index 0000000..1461347 --- /dev/null +++ b/db/migrate/20150625234824_add_user_id_to_session.rb @@ -0,0 +1,31 @@ +class AddUserIdToSession < ActiveRecord::Migration + + def change + add_column :sessions, :user_id, :integer + add_index :sessions, :user_id + end + + def up + Session.reset_column_information + + # cleanup data: {} + Session.where(data: "BAh7AA==\n").delete_all + # cleanup data with lang key only + Session.where("data ~ 'BAh7BjoJbGFuZyIH.{3,3}=\n'").delete_all + + # very slow migration, only do for the last month + Session.where('updated_at > ?', 1.month.ago).find_each batch_size: 50 do |session| + begin + # this calls Session#copy_to_columns + session.save! + rescue ArgumentError + # old ActionController::Flash::FlashHash from rails 2.3 + session.destroy + end + + # limit limitless allocations + GC.start + end + end + +end diff --git a/db/schema.rb b/db/schema.rb index b2e1c73..3619e6b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20150603182105) do +ActiveRecord::Schema.define(:version => 20150625234824) do create_table "abuse_reports", :force => true do |t| t.integer "reporter_id" @@ -645,10 +645,12 @@ ActiveRecord::Schema.define(:version => 20150603182105) do t.text "data" t.datetime "created_at" t.datetime "updated_at" + t.integer "user_id" end add_index "sessions", ["session_id"], :name => "index_sessions_on_session_id" add_index "sessions", ["updated_at"], :name => "index_sessions_on_updated_at" + add_index "sessions", ["user_id"], :name => "index_sessions_on_user_id" create_table "suggestion_connections", :force => true do |t| t.integer "suggestion_id", :null => false -- libgit2 0.21.2