aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/controllers/admin_general_controller.rb7
-rw-r--r--app/controllers/admin_request_controller.rb17
-rw-r--r--app/controllers/application_controller.rb12
-rw-r--r--app/controllers/request_controller.rb2
-rw-r--r--app/models/incoming_message.rb3
-rw-r--r--app/models/info_request.rb52
-rw-r--r--app/models/raw_email.rb2
-rw-r--r--app/models/request_mailer.rb5
-rw-r--r--app/models/user.rb3
-rw-r--r--app/views/admin_request/show_raw_email.rhtml5
-rw-r--r--app/views/public_body/show.rhtml4
-rw-r--r--app/views/request/_describe_state.rhtml2
-rw-r--r--app/views/request/_followup.rhtml3
-rw-r--r--app/views/request/new.rhtml2
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
&ndash;
- 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 %>