Before Filters

Hi all, I am having a slight problem with a before filter. I have a page that calls a before filter to create a set of methods to call my report generator based on if the person has permissions to the report. In development it seems to work fine, but in production I Only have access to one of the reports, It tells me that no action responded to the particular method being called. Being that I can get to the fist report, I know that it is working but failing on the second time through the loop.

code in the controller looks like this;

Hi all, I am having a slight problem with a before filter. I have a page that calls a before filter to create a set of methods to call my report generator based on if the person has permissions to the report. In development it seems to work fine, but in production I Only have access to one of the reports, It tells me that no action responded to the particular method being called. Being that I can get to the fist report, I know that it is working but failing on the second time through the loop.

code in the controller looks like this;

########################################################################################    before_filter :create_report_methods

def create_report_methods      Report.find_all.each do |r|       HomeController.send :define_method, "report_#{r.id}" do         redirect_to("http://onetruth:8080/birt/frameset? __report=#{r.name}.rptdesign")       end unless ReportMembership.find(:first,:conditions => ["report_id = ? and memberable_type = 'TeamMember' and memberable_id = ?", r.id, TeamMember.get_team_member.id]).nil? and ReportMembership.find_by_sql(["select * from report_memberships as rm, team_members as tm, departments as d, department_memberships as dm where rm.memberable_type ='Department' and rm.memberable_id = d.id and d.id = dm.department_id and dm.team_member_id = tm.id and tm.id = ? and report_id = ?",TeamMember.get_team_member.id, r.id]).first.nil?     end end

yuck.

########################################################################################### It works as expected in development, so my question is could another user be going to the site through mongrel and changing the methods I have? Any help is appreciated with this issue of mine. (I will post the log entries once I find them, I am working in production on a test system)

Quite possible. Another difference between development and production is that in development the classes are reloaded on each request. I have to wonder why you need a convoluted design like this, rather than have a single report action that generates the right thing base on the id parameter.

Fred

The thought behind this is for security reasons, if the user has a report method that parameters are passed to, a person could easily get a hold of reports that he should not be able to see. If I query the database, like I am doing here, I still run the risk of someone getting to the report. If I use everything behind the scenes like I currently am and define a method to called each report based on if you have permissions on that report it seems a little more secure than passing a number to a report function. I also don't have to error check to see if the id is an integer and all the other fun stuff that goes along with that.

Anyways my boss liked it better this way. Also I noticed that I have permissions on all reports and I can only get to the first report, not the others that I have permission to. There is one other person that has permission has the same as I do. This is perplexing me a little bit.

White Wizzard

BTW I do know that I need to refactor this code to prevent some CS attacks by taking and moving the finds into the models.. .

WW

The thought behind this is for security reasons, if the user has a report method that parameters are passed to, a person could easily get a hold of reports that he should not be able to see. If I query the database, like I am doing here, I still run the risk of someone getting to the report. If I use everything behind the scenes like I currently am and define a method to called each report based on if you have permissions on that report it seems a little more secure than passing a number to a report function. I also don't have to error check to see if the id is an integer and all the other fun stuff that goes along with that.

You're adding no security, but you are adding rather a lot of
complexity (and of course once you've added the methods for one user
they'll be there for every user. Of course you won't notice that in
development because classes are reloaded, so that a hole waiting to
bite you)

If user has_many :reports (via some join model that models who has
been give access to what) then it's as easy as

report = @logged_in_user.find(params[:id]) if report    report.run else    #oops, you don't have access to that report end

Fred