From 3830f41e5fc2cfc16fa3b856de8ad70086a8cf16 Mon Sep 17 00:00:00 2001
From: Sam <sam.saffron@gmail.com>
Date: Tue, 25 Mar 2014 10:37:31 +1100
Subject: [PATCH] BUGFIX: attachments bust under multisite

---
 app/controllers/uploads_controller.rb          | 18 +++++++++++-------
 config/nginx.sample.conf                       | 13 ++++++++-----
 .../rails_multisite/connection_management.rb   | 11 +++++++----
 3 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb
index d2442d21101..e501d4a0e90 100644
--- a/app/controllers/uploads_controller.rb
+++ b/app/controllers/uploads_controller.rb
@@ -30,17 +30,21 @@ class UploadsController < ApplicationController
   end
 
   def show
-    return render nothing: true, status: 404 unless Discourse.store.internal?
+    RailsMultisite::ConnectionManagement.with_connection(params[:site]) do |db|
 
-    id = params[:id].to_i
-    url = request.fullpath
+      return render nothing: true, status: 404 unless Discourse.store.internal?
 
-    # the "url" parameter is here to prevent people from scanning the uploads using the id
-    upload = Upload.where(id: id, url: url).first
+      id = params[:id].to_i
+      url = request.fullpath
 
-    return render nothing: true, status: 404 unless upload
+      # the "url" parameter is here to prevent people from scanning the uploads using the id
+      upload = Upload.where(id: id, url: url).first
 
-    send_file(Discourse.store.path_for(upload), filename: upload.original_filename)
+      return render nothing: true, status: 404 unless upload
+
+      send_file(Discourse.store.path_for(upload), filename: upload.original_filename)
+
+    end
   end
 
 end
diff --git a/config/nginx.sample.conf b/config/nginx.sample.conf
index ec3f0434525..19e645f330d 100644
--- a/config/nginx.sample.conf
+++ b/config/nginx.sample.conf
@@ -42,6 +42,14 @@ server {
   # path to discourse's public directory
   set $public /var/www/discourse/public;
 
+  # prep all possible needed proxy headers
+  # this is critical form multisite
+  proxy_set_header Host $http_host;
+  proxy_set_header X-Real-IP $remote_addr;
+  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+  proxy_set_header X-Forwarded-Proto $thescheme;
+
+
   location / {
     root $public;
 
@@ -98,11 +106,6 @@ server {
   }
 
   location @discourse {
-    proxy_set_header Host $http_host;
-    proxy_set_header X-Real-IP $remote_addr;
-    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-    proxy_set_header X-Forwarded-Proto $thescheme;
-
     proxy_pass http://discourse;
   }
 
diff --git a/vendor/gems/rails_multisite/lib/rails_multisite/connection_management.rb b/vendor/gems/rails_multisite/lib/rails_multisite/connection_management.rb
index cb78c6cc0cb..f22910bc79b 100644
--- a/vendor/gems/rails_multisite/lib/rails_multisite/connection_management.rb
+++ b/vendor/gems/rails_multisite/lib/rails_multisite/connection_management.rb
@@ -35,12 +35,15 @@ module RailsMultisite
       old = current_db
       connected = ActiveRecord::Base.connection_pool.connected?
 
-      establish_connection(:db => db)
+      establish_connection(:db => db) unless connected && db == old
       rval = yield db
-      ActiveRecord::Base.connection_handler.clear_active_connections!
 
-      establish_connection(:db => old)
-      ActiveRecord::Base.connection_handler.clear_active_connections! unless connected
+      unless connected && db == old
+        ActiveRecord::Base.connection_handler.clear_active_connections!
+
+        establish_connection(:db => old)
+        ActiveRecord::Base.connection_handler.clear_active_connections! unless connected
+      end
 
       rval
     end