diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/admin_general_controller.rb | 7 | ||||
-rw-r--r-- | app/controllers/admin_request_controller.rb | 17 | ||||
-rw-r--r-- | app/controllers/application_controller.rb | 12 | ||||
-rw-r--r-- | app/controllers/request_controller.rb | 2 | ||||
-rw-r--r-- | app/models/incoming_message.rb | 3 | ||||
-rw-r--r-- | app/models/info_request.rb | 52 | ||||
-rw-r--r-- | app/models/raw_email.rb | 2 | ||||
-rw-r--r-- | app/models/request_mailer.rb | 5 | ||||
-rw-r--r-- | app/models/user.rb | 3 | ||||
-rw-r--r-- | app/views/admin_request/show_raw_email.rhtml | 5 | ||||
-rw-r--r-- | app/views/public_body/show.rhtml | 4 | ||||
-rw-r--r-- | app/views/request/_describe_state.rhtml | 2 | ||||
-rw-r--r-- | app/views/request/_followup.rhtml | 3 | ||||
-rw-r--r-- | app/views/request/new.rhtml | 2 |
14 files changed, 77 insertions, 42 deletions
diff --git a/app/controllers/admin_general_controller.rb b/app/controllers/admin_general_controller.rb index 5073cdc5b..ae51e0923 100644 --- a/app/controllers/admin_general_controller.rb +++ b/app/controllers/admin_general_controller.rb @@ -8,6 +8,13 @@ class AdminGeneralController < AdminController def index + # ensure we have a trailing slash + current_uri = request.env['REQUEST_URI'] + if params[:suppress_redirect].nil? && !(current_uri =~ /\/$/) + redirect_to admin_general_index_url + "/" + return + end + # Overview counts of things @public_body_count = PublicBody.count diff --git a/app/controllers/admin_request_controller.rb b/app/controllers/admin_request_controller.rb index d5bd4c4d6..b3fb1ce40 100644 --- a/app/controllers/admin_request_controller.rb +++ b/app/controllers/admin_request_controller.rb @@ -177,7 +177,7 @@ class AdminRequestController < AdminController raw_email_data = incoming_message.raw_email.data mail = TMail::Mail.parse(raw_email_data) mail.base64_decode - destination_request.receive(mail, raw_email_data) + destination_request.receive(mail, raw_email_data, true) incoming_message_id = incoming_message.id incoming_message.fully_destroy @@ -275,7 +275,6 @@ class AdminRequestController < AdminController def show_raw_email @raw_email = RawEmail.find(params[:id]) - # For the holding pen, try to guess where it should be ... @holding_pen = false if (@raw_email.incoming_message.info_request == InfoRequest.holding_pen_request && !@raw_email.incoming_message.mail.from_addrs.nil? && @raw_email.incoming_message.mail.from_addrs.size > 0) @@ -294,15 +293,11 @@ class AdminRequestController < AdminController end # 2. Match the email address in the message without matching the hash - @info_requests = [] - addresses = - (@raw_email.incoming_message.mail.to || []) + - (@raw_email.incoming_message.mail.cc || []) + - (@raw_email.incoming_message.mail.envelope_to || []) - addresses.uniq! - for address in addresses - @info_requests += InfoRequest.guess_by_incoming_email(address) - end + @info_requests = InfoRequest.guess_by_incoming_email(@raw_email.incoming_message) + + # 3. Give a reason why it's in the holding pen + last_event = @raw_email.incoming_message.info_request.get_last_event + @rejected_reason = last_event.params[:rejected_reason] end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5f18be2e5..0d8c83d6c 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -42,7 +42,11 @@ class ApplicationController < ActionController::Base end def set_gettext_locale - requested_locale = params[:locale] || session[:locale] || cookies[:locale] || request.env['HTTP_ACCEPT_LANGUAGE'] + if MySociety::Config.get('USE_DEFAULT_BROWSER_LANGUAGE', true) + requested_locale = params[:locale] || session[:locale] || cookies[:locale] || request.env['HTTP_ACCEPT_LANGUAGE'] || I18n.default_locale + else + requested_locale = params[:locale] || session[:locale] || cookies[:locale] || I18n.default_locale + end session[:locale] = FastGettext.set_locale(requested_locale) end @@ -221,7 +225,11 @@ class ApplicationController < ActionController::Base if session[:user_id].nil? return nil else - return User.find(session[:user_id]) + begin + return User.find(session[:user_id]) + rescue ActiveRecord::RecordNotFound + return nil + end end end diff --git a/app/controllers/request_controller.rb b/app/controllers/request_controller.rb index 7b9421464..e446854ab 100644 --- a/app/controllers/request_controller.rb +++ b/app/controllers/request_controller.rb @@ -375,7 +375,7 @@ class RequestController < ApplicationController # Don't give advice on what to do next, as it isn't their request RequestMailer.deliver_old_unclassified_updated(@info_request) if session[:request_game] - flash[:notice] = _('Thank you for updating the status of the request \'<a href="%s">{{info_request_title}}</a>\'. There are some more requests below for you to classify.',:info_request_title=>CGI.escapeHTML(@info_request.title)) % [CGI.escapeHTML(request_url(@info_request))] + flash[:notice] = _('Thank you for updating the status of the request \'<a href="{{url}}">{{info_request_title}}</a>\'. There are some more requests below for you to classify.',:info_request_title=>CGI.escapeHTML(@info_request.title), :url=>CGI.escapeHTML(request_url(@info_request))) redirect_to play_url else flash[:notice] = _('Thank you for updating this request!') diff --git a/app/models/incoming_message.rb b/app/models/incoming_message.rb index 581c73f8b..7d9cfbfa1 100644 --- a/app/models/incoming_message.rb +++ b/app/models/incoming_message.rb @@ -1237,9 +1237,8 @@ class IncomingMessage < ActiveRecord::Base info_request_event.track_things_sent_emails.each { |a| a.destroy } info_request_event.user_info_request_sent_alerts.each { |a| a.destroy } info_request_event.destroy - raw_email = self.raw_email + self.raw_email.destroy_file_representation! self.destroy - self.raw_email.destroy end end diff --git a/app/models/info_request.rb b/app/models/info_request.rb index 209954b16..419546c99 100644 --- a/app/models/info_request.rb +++ b/app/models/info_request.rb @@ -17,7 +17,6 @@ # allow_new_responses_from :string(255) default("anybody"), not null # handle_rejected_responses :string(255) default("bounce"), not null # - # models/info_request.rb: # A Freedom of Information request. # @@ -309,13 +308,20 @@ public # Return list of info requests which *might* be right given email address # e.g. For the id-hash email addresses, don't match the hash. - def InfoRequest.guess_by_incoming_email(incoming_email) - id, hash = InfoRequest._extract_id_hash_from_email(incoming_email) - begin - return [InfoRequest.find(id)] - rescue ActiveRecord::RecordNotFound - return [] + def InfoRequest.guess_by_incoming_email(incoming_message) + guesses = [] + # 1. Try to guess based on the email address(es) + addresses = + (incoming_message.mail.to || []) + + (incoming_message.mail.cc || []) + + (incoming_message.mail.envelope_to || []) + addresses.uniq! + for address in addresses + id, hash = InfoRequest._extract_id_hash_from_email(address) + guesses.push(InfoRequest.find_by_id(id)) + guesses.push(InfoRequest.find_by_idhash(hash)) end + return guesses.select{|x| !x.nil?}.uniq end # Internal function used by find_by_magic_email and guess_by_incoming_email @@ -326,7 +332,7 @@ public # The optional bounce- dates from when we used to have separate emails for the envelope from. # (that was abandoned because councils would send hand written responses to them, not just # bounce messages) - incoming_email =~ /request-(?:bounce-)?(\d+)-([a-z0-9]+)/ + incoming_email =~ /request-(?:bounce-)?([a-z0-9]+)-([a-z0-9]+)/ id = $1.to_i hash = $2 @@ -379,21 +385,24 @@ public end # A new incoming email to this request - def receive(email, raw_email_data, override_stop_new_responses = false) + def receive(email, raw_email_data, override_stop_new_responses = false, rejected_reason = "") if !override_stop_new_responses allow = nil - + reason = nil # See if new responses are prevented for spam reasons if self.allow_new_responses_from == 'nobody' allow = false + reason = _('This request has been set by an administrator to "allow new responses from nobody"') elsif self.allow_new_responses_from == 'anybody' allow = true elsif self.allow_new_responses_from == 'authority_only' if email.from_addrs.nil? || email.from_addrs.size == 0 allow = false + reason = _('Only the authority can reply to this request, but there is no "From" address to check against') else sender_email = email.from_addrs[0].spec sender_domain = PublicBody.extract_domain_from_email(sender_email) + reason = _("Only the authority can reply to this request, and I don't recognise the address this reply was sent from") allow = false # Allow any domain that has already sent reply for row in self.who_can_followup_to @@ -411,7 +420,7 @@ public if self.handle_rejected_responses == 'bounce' RequestMailer.deliver_stopped_responses(self, email, raw_email_data) elsif self.handle_rejected_responses == 'holding_pen' - InfoRequest.holding_pen_request.receive(email, raw_email_data) + InfoRequest.holding_pen_request.receive(email, raw_email_data, false, reason) elsif self.handle_rejected_responses == 'blackhole' # do nothing - just lose the message (Note: a copy will be # in the backup mailbox if the server is configured to send @@ -435,7 +444,11 @@ public raw_email.save! self.awaiting_description = true - self.log_event("response", { :incoming_message_id => incoming_message.id }) + params = { :incoming_message_id => incoming_message.id } + if !rejected_reason.empty? + params[:rejected_reason] = rejected_reason + end + self.log_event("response", params) self.save! end @@ -671,6 +684,7 @@ public end end return nil + end def get_last_response_event for e in self.info_request_events.reverse @@ -831,15 +845,25 @@ public def InfoRequest.magic_email_for_id(prefix_part, id) magic_email = MySociety::Config.get("INCOMING_EMAIL_PREFIX", "") magic_email += prefix_part + id.to_s - magic_email += "-" + Digest::SHA1.hexdigest(id.to_s + MySociety::Config.get("INCOMING_EMAIL_SECRET", 'dummysecret'))[0,8] + magic_email += "-" + InfoRequest.hash_from_id(id) magic_email += "@" + MySociety::Config.get("INCOMING_EMAIL_DOMAIN", "localhost") return magic_email end + before_validation :compute_idhash + + def compute_idhash + self.idhash = InfoRequest.hash_from_id(self.id) + end + + def InfoRequest.hash_from_id(id) + return Digest::SHA1.hexdigest(id.to_s + MySociety::Config.get("INCOMING_EMAIL_SECRET", 'dummysecret'))[0,8] + end + # Called by find_by_incoming_email - and used to be called by separate # function for envelope from address, until we abandoned it. def InfoRequest.find_by_magic_email(id, hash) - expected_hash = Digest::SHA1.hexdigest(id.to_s + MySociety::Config.get("INCOMING_EMAIL_SECRET", 'dummysecret'))[0,8] + expected_hash = InfoRequest.hash_from_id(id) #print "expected: " + expected_hash + "\nhash: " + hash + "\n" if hash != expected_hash return nil diff --git a/app/models/raw_email.rb b/app/models/raw_email.rb index eb36053c1..c6066cbf4 100644 --- a/app/models/raw_email.rb +++ b/app/models/raw_email.rb @@ -20,8 +20,6 @@ class RawEmail < ActiveRecord::Base has_one :incoming_message - before_destroy :destroy_file_representation! - # We keep the old data_text field (which is of type text) for backwards # compatibility. We use the new data_binary field because only it works # properly in recent versions of PostgreSQL (get seg faults escaping diff --git a/app/models/request_mailer.rb b/app/models/request_mailer.rb index e73b153b9..fc317d20d 100644 --- a/app/models/request_mailer.rb +++ b/app/models/request_mailer.rb @@ -205,10 +205,11 @@ class RequestMailer < ApplicationMailer def receive(email, raw_email) # Find which info requests the email is for reply_info_requests = self.requests_matching_email(email) - # Nothing found, so save in holding pen if reply_info_requests.size == 0 - InfoRequest.holding_pen_request.receive(email, raw_email) + reason = _("Could not identify the request from the email address") + request = InfoRequest.holding_pen_request + request.receive(email, raw_email, false, reason) return end diff --git a/app/models/user.rb b/app/models/user.rb index e29ae3101..fddb6b035 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -118,6 +118,9 @@ class User < ActiveRecord::Base if not name.nil? name.strip! end + if self.public_banned? + name = _("{{user_name}} (Banned)", :user_name=>name) + end name end diff --git a/app/views/admin_request/show_raw_email.rhtml b/app/views/admin_request/show_raw_email.rhtml index 10b97f4fd..fa1470e77 100644 --- a/app/views/admin_request/show_raw_email.rhtml +++ b/app/views/admin_request/show_raw_email.rhtml @@ -3,8 +3,9 @@ <h1>Incoming message <%=@raw_email.incoming_message.id.to_s %></h1> <p> - FOI request: <%= link_to request_both_links(@raw_email.incoming_message.info_request) %> + FOI request: <%= request_both_links(@raw_email.incoming_message.info_request) %> <% if @holding_pen %> + <br>This is in the holding pen because: <strong><%= @rejected_reason %></strong> <% if @public_bodies.size > 0 %> <br>Guessed authority: <% for public_body in @public_bodies %> @@ -30,7 +31,7 @@ <h2>Raw email</h2> -<%= link_to "Download", "../download_raw_email/" + @raw_email.id.to_s %> +<p><%= link_to "Download", "../download_raw_email/" + @raw_email.id.to_s %></p> <pre><%=h(@raw_email.data).gsub(/\n/, '<br>') %></pre> diff --git a/app/views/public_body/show.rhtml b/app/views/public_body/show.rhtml index dce7ca4f8..3d325e2b8 100644 --- a/app/views/public_body/show.rhtml +++ b/app/views/public_body/show.rhtml @@ -47,8 +47,8 @@ <%= link_to _("Make a new Environmental Information request"), new_request_to_body_url(:url_name => @public_body.url_name)%> to <%= h(@public_body.name) %> <% else %> - <%= _('<a href="%s">Make a new Freedom of Information request</a> to {{public_body_name}}', - :public_body_name => h(@public_body.name)) % new_request_to_body_url(:url_name => @public_body.url_name)%> + <%= _('<a href="{{url}}">Make a new Freedom of Information request</a> to {{public_body_name}}', + :public_body_name => h(@public_body.name), :url=>new_request_to_body_url(:url_name => @public_body.url_name))%> <% end %> <% elsif @public_body.has_notes? %> <%= @public_body.notes_as_html %> diff --git a/app/views/request/_describe_state.rhtml b/app/views/request/_describe_state.rhtml index 8164637bf..052833a67 100644 --- a/app/views/request/_describe_state.rhtml +++ b/app/views/request/_describe_state.rhtml @@ -107,6 +107,6 @@ <%= _('We don\'t know whether the most recent response to this request contains information or not – - if you are {{user_link}} please <a href="%s">sign in</a> and let everyone know.',:user_link=>user_link(@info_request.user)) % [signin_url(:r => request.request_uri)] %> + if you are {{user_link}} please <a href="{{url}}">sign in</a> and let everyone know.',:user_link=>user_link(@info_request.user), :url=>signin_url(:r => request.request_uri)) %> <% end %> diff --git a/app/views/request/_followup.rhtml b/app/views/request/_followup.rhtml index 78de7decd..a15f2912d 100644 --- a/app/views/request/_followup.rhtml +++ b/app/views/request/_followup.rhtml @@ -13,8 +13,7 @@ <% end %> <% if @info_request.allow_new_responses_from == 'nobody' %> - <p><%= _('Follow ups and new responses to this request have been stopped to prevent spam. Please - <a href="%s">contact us</a> if you are {{user_link}} and need to send a follow up.',:user_link=>user_link(@info_request.user) ) % [help_contact_path] %></p> + <p><%= _('Follow ups and new responses to this request have been stopped to prevent spam. Please <a href="{{url}}">contact us</a> if you are {{user_link}} and need to send a follow up.',:user_link=>user_link(@info_request.user), :url=>help_contact_path) %></p> <% else %> <% if @internal_review %> <p> diff --git a/app/views/request/new.rhtml b/app/views/request/new.rhtml index a97116aa3..b8625a8e6 100644 --- a/app/views/request/new.rhtml +++ b/app/views/request/new.rhtml @@ -38,7 +38,7 @@ <li> <% if @info_request.public_body.info_requests.size > 0 %> - <%= _("Browse <a href='%s'>other requests</a> to '{{public_body_name}}' for examples of how to word your request.", :public_body_name=>h(@info_request.public_body.name)) % [public_body_url(@info_request.public_body)] %> + <%= _("Browse <a href='{{url}}'>other requests</a> to '{{public_body_name}}' for examples of how to word your request.", :public_body_name=>h(@info_request.public_body.name), :url=>public_body_url(@info_request.public_body)) %> <% else %> <%= _('Browse <a href="%s">other requests</a> for examples of how to word your request.') % [request_list_url] %> <% end %> |