Sunday, August 21, 2011

[Rails] Re: Opening a folder for file selection

Thanks 7stud! Your code works and I integrated it with my version.
The only changes I made were to redo RAILS_ROOT to use: dir_path =
Rails.root.join("public","resumes")
and to make the send_file more "Windowsy" in this way:
send_file("#{dir_path}\\#{fname}", :filename => fname)

I appreciate your taking the time!
Barney

On Aug 18, 10:49 pm, 7stud -- <li...@ruby-forum.com> wrote:
> Okay.  But I am a beginner too, so I don't know if this is the best way.
> I'm assuming the path to yourfolderis:
>
> /public/files_to_read
>
> class PagesController < ApplicationController
>   def home
>     @title = "Home"
>   end
>
>   def get_files
>     dir_path = 'public/files_to_read'
>
>     Dir.chdir(dir_path) do
>       @fnames = Dir.glob("*")
>     end
>
>   end
>
>   def download
>     dir_path = 'public/files_to_read'
>     fname = params[:fname]
>
>     Dir.chdir(dir_path) do
>       allowed_fnames = Dir.glob("*")
>
>       if allowed_fnames.include?(fname)
>         send_file("#{RAILS_ROOT}/#{dir_path}/#{fname}",
>                   :filename => fname)
>       else
>         @title = 'Home'
>         render 'home'
>       end
>
>     end
>
>   end
>
> end
>
> ===
>
> Test2App::Application.routes.draw do
>   root :to => "pages#home"
>
>   get 'pages/get_files'
>   get 'pages/download'
>
> ===
>
> <h1>Pages#home</h1>
> <p>Find me in app/views/pages/home.html.erb</p>
>
> <%= link_to "Read afile", {:controller => 'pages', :action =>
> 'get_files'} %>
>
> ===
>
> <h1>Pages#get_files</h1>
> <div>Find me in app/views/pages/get_files.html.erb</div>
>
> <h3>Click thefileyou want to download:</h3>
>
> <% @fnames.each do |fname| %>
>   <div><%= link_to fname, :controller => 'pages', :action => 'download',
> :fname => fname %></div>
> <% end %>
>
> ===
>
> <!DOCTYPE html>
> <html>
> <head>
>   <title><%= @title %></title>
>   <%= csrf_meta_tag %>
> </head>
> <body>
>
> <%= yield %>
>
> </body>
> </html>
>
> ===
>
> http://localhost:3000=> home.html.erb
> click on Readfilelink => get_file.html.erb
> click on a filename link => computer downloads thefile
>
> The reason for the code:
>
>   if allowed_names.include?( )
>
> is to prevent a hacker from going to the page of links, and then instead
> of clicking on a link, entering:
>
> http://localhost:3000/pages/download?fname=/path/to/secrets.txt
>
> If you don't check the fname that the server receives, a hacker can
> download anyfilethey want.
>
> --
> Posted viahttp://www.ruby-forum.com/.

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home


Real Estate