so arguments can be handled more robustly.
- begin
- trace = Trace.find(params[:id])
+ trace = Trace.find(params[:id])
- if trace.public? or (@user and @user == trace.user)
- send_file(trace.large_picture_name, :filename => "#{trace.id}.gif", :type => 'image/gif', :disposition => 'inline')
- else
- render :nothing, :status => :forbidden
- end
- rescue ActiveRecord::RecordNotFound
- render :nothing => true, :status => :not_found
- rescue
- render :nothing => true, :status => :internal_server_error
+ if trace.public? or (@user and @user == trace.user)
+ send_file(trace.large_picture_name, :filename => "#{trace.id}.gif", :type => 'image/gif', :disposition => 'inline')
+ else
+ render :nothing, :status => :forbidden
+ rescue ActiveRecord::RecordNotFound
+ render :nothing => true, :status => :not_found
- begin
- trace = Trace.find(params[:id])
+ trace = Trace.find(params[:id])
- if trace.public? or (@user and @user == trace.user)
- send_file(trace.icon_picture_name, :filename => "#{trace.id}_icon.gif", :type => 'image/gif', :disposition => 'inline')
- else
- render :nothing, :status => :forbidden
- end
- rescue ActiveRecord::RecordNotFound
- render :nothing => true, :status => :not_found
- rescue
- render :nothing => true, :status => :internal_server_error
+ if trace.public? or (@user and @user == trace.user)
+ send_file(trace.icon_picture_name, :filename => "#{trace.id}_icon.gif", :type => 'image/gif', :disposition => 'inline')
+ else
+ render :nothing, :status => :forbidden
+ rescue ActiveRecord::RecordNotFound
+ render :nothing => true, :status => :not_found
- begin
- trace = Trace.find(params[:id])
+ trace = Trace.find(params[:id])
- if trace.public? or trace.user == @user
- render :text => trace.to_xml.to_s, :content_type => "text/xml"
- else
- render :nothing => true, :status => :forbidden
- end
- rescue ActiveRecord::RecordNotFound
- render :nothing => true, :status => :not_found
- rescue
- render :nothing => true, :status => :internal_server_error
+ if trace.public? or trace.user == @user
+ render :text => trace.to_xml.to_s, :content_type => "text/xml"
+ else
+ render :nothing => true, :status => :forbidden
+ rescue ActiveRecord::RecordNotFound
+ render :nothing => true, :status => :not_found
- render :action => 'data'
+ trace = Trace.find(params[:id])
+
+ if trace.public? or trace.user == @user
+ send_file(trace.trace_name, :filename => "#{trace.id}#{trace.extension_name}", :type => trace.mime_type, :disposition => 'attachment')
+ else
+ render :nothing => true, :status => :forbidden
+ end
+ rescue ActiveRecord::RecordNotFound
+ render :nothing => true, :status => :not_found
- do_create(params[:filename], params[:tags], params[:description], true) do |f|
- f.write(request.raw_post)
- end
+ if request.post?
+ name = params[:file].original_filename.gsub(/[^a-zA-Z0-9.]/, '_') # This makes sure filenames are sane
- if @trace.id
- render :nothing => true
+ do_create(name, params[:tags], params[:description], params[:public]) do |f|
+ f.write(request[:file].read)
+ end
+
+ if @trace.id
+ render :text => @trace.id.to_s, :content_type => "text/plain"
+ elsif @trace.valid?
+ render :nothing => true, :status => :internal_server_error
+ else
+ render :nothing => true, :status => :bad_request
+ end
- render :nothing => true, :status => :internal_server_error
+ render :nothing => true, :status => :method_not_allowed
validates_presence_of :user_id, :name, :timestamp
validates_presence_of :description, :on => :create
validates_presence_of :user_id, :name, :timestamp
validates_presence_of :description, :on => :create
+ validates_format_of :tagstring, :with => /^[^\/;.,?]*$/
# validates_numericality_of :latitude, :longitude
validates_inclusion_of :public, :inserted, :in => [ true, false]
# validates_numericality_of :latitude, :longitude
validates_inclusion_of :public, :inserted, :in => [ true, false]
map.connect "api/#{API_VERSION}/user/details", :controller => 'user', :action => 'api_details'
map.connect "api/#{API_VERSION}/user/gpx_files", :controller => 'user', :action => 'api_gpx_files'
map.connect "api/#{API_VERSION}/user/details", :controller => 'user', :action => 'api_details'
map.connect "api/#{API_VERSION}/user/gpx_files", :controller => 'user', :action => 'api_gpx_files'
- map.connect "api/#{API_VERSION}/gpx/create/:filename/:description/:tags", :controller => 'trace', :action => 'api_create'
+ map.connect "api/#{API_VERSION}/gpx/create", :controller => 'trace', :action => 'api_create'
map.connect "api/#{API_VERSION}/gpx/:id/details", :controller => 'trace', :action => 'api_details'
map.connect "api/#{API_VERSION}/gpx/:id/data", :controller => 'trace', :action => 'api_data'
map.connect "api/#{API_VERSION}/gpx/:id/details", :controller => 'trace', :action => 'api_details'
map.connect "api/#{API_VERSION}/gpx/:id/data", :controller => 'trace', :action => 'api_data'