Skip to content

Instantly share code, notes, and snippets.

@kunalchaudhari
Created July 30, 2012 09:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kunalchaudhari/3205867 to your computer and use it in GitHub Desktop.
Save kunalchaudhari/3205867 to your computer and use it in GitHub Desktop.
forem: allow anonymous user to create post/topic
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
layout "general"
helper_method :forem_user
def forem_user
current_user || anonymous_user
end
# creates anonymous user and store user_id in session
def anonymous_user
return @anonymous_user if @anonymous_user
if session[:anonymous_user_id]
@anonymous_user = User.find_by_id(session[:anonymous_user_id])
else
@anonymous_user = User.anonymous!
end
session[:anonymous_user_id] = @anonymous_user ? @anonymous_user.id : nil
@anonymous_user
end
protect_from_forgery
end
# app/decorators/controllers/forem/application_controller_decorator.rb
Forem::ApplicationController.class_eval do
private
def authenticate_forem_user
# there will be always anonymous user so check that also and redirect to sign_in path accordingly
if !forem_user || forem_user.anonymous?
session["user_return_to"] = request.fullpath
flash.alert = t("forem.errors.not_signed_in")
redirect_to Forem.sign_in_path || main_app.sign_in_path
end
end
def forem_admin?
forem_user && !forem_user.anonymous? && forem_user.forem_admin?
end
helper_method :forem_admin?
def forem_admin_or_moderator?(forum)
forem_user && !forem_user.anonymous? && (forem_user.forem_admin? || forum.moderator?(forem_user))
end
helper_method :forem_admin_or_moderator?
end
# app/decorators/controllers/forem/topics_controller_decorator.rb
Forem::TopicsController.class_eval do
before_filter :authenticate_forem_user, :except => [:new, :show, :create]
skip_before_filter :block_spammers
end
# app/models/user.rb
class User < ActiveRecord::Base
has_many :posts, :class_name => "Forem::Post", :dependent => :destroy
has_many :topics, :class_name => "Forem::Topic", :dependent => :destroy
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :name, :username, :country, :gender, :password, :password_confirmation, :remember_me, :persistence_token
def to_s
name
end
# Creates an anonymous user. An anonymous user is basically an auto-generated +User+ account that is created for the guest user
def self.anonymous!
token = User.generate_token(:persistence_token)
User.create(:email => "#{token}@example.net", :password => token, :password_confirmation => token, :persistence_token => token, :username => "#{token}", :gender => "male", :name => "#{token}")
end
def anonymous?
email =~ /@example.net$/
end
# override default permission to support allow_anonymous flag
def can_create_forem_topics?(forum)
self.anonymous? ? forum.allow_anonymous : true
end
private
# Generate a friendly string randomically to be used as token.
def self.friendly_token
SecureRandom.base64(15).tr('+/=', '-_ ').strip.delete("\n")
end
# Generate a token by looping and ensuring does not already exist.
def self.generate_token(column)
loop do
token = friendly_token
break token unless find(:first, :conditions => { column => token })
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment