Created
July 30, 2012 09:35
-
-
Save kunalchaudhari/3205867 to your computer and use it in GitHub Desktop.
forem: allow anonymous user to create post/topic
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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