mirror of
https://github.com/discourse/discourse.git
synced 2024-11-27 16:43:40 +08:00
c21df2286c
What problem I am trying to solve? When an encrypted message is crafted and the image is added - discourse needs a hard refresh to display that image. What is happening? Everything starts here - when the upload is finished we add serialized object to the cache https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/components/composer-editor.js#L748:L757 Then, `discourse-encrypt` is trying to get an image from the cache and use `short_path` property https://github.com/discourse/discourse-encrypt/blob/master/assets/javascripts/discourse/initializers/hook-decrypt-post.js.es6#L142:L143 Why is it working after a hard refresh? After refresh, we populate cache once again using that function: https://github.com/discourse/discourse/blob/master/app/assets/javascripts/pretty-text/upload-short-url.js#L11:L17 And lookup_urls method from backend is returning `short_path` https://github.com/discourse/discourse/blob/master/app/controllers/uploads_controller.rb#L55:L64 TL;DR We should expose short path in upload serializer. I ensured that this serializer is used only when attachments are uploaded so it should not affect performance.
57 lines
1.8 KiB
Ruby
57 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
|
|
RSpec.describe UploadSerializer do
|
|
fab!(:upload) { Fabricate(:upload) }
|
|
let(:subject) { UploadSerializer.new(upload, root: false) }
|
|
|
|
it 'should render without errors' do
|
|
json_data = JSON.load(subject.to_json)
|
|
|
|
expect(json_data['id']).to eql upload.id
|
|
expect(json_data['width']).to eql upload.width
|
|
expect(json_data['height']).to eql upload.height
|
|
expect(json_data['thumbnail_width']).to eql upload.thumbnail_width
|
|
expect(json_data['thumbnail_height']).to eql upload.thumbnail_height
|
|
expect(json_data['short_path']).to eql upload.short_path
|
|
end
|
|
|
|
context "when the upload is secure" do
|
|
fab!(:upload) { Fabricate(:secure_upload) }
|
|
|
|
context "when secure media is disabled" do
|
|
it "just returns the normal URL, otherwise S3 errors are encountered" do
|
|
json_data = JSON.load(subject.to_json)
|
|
expect(json_data['url']).to eq(upload.url)
|
|
end
|
|
end
|
|
|
|
context "when secure media is enabled" do
|
|
before do
|
|
enable_s3_uploads
|
|
SiteSetting.secure_media = true
|
|
end
|
|
|
|
it "returns the cooked URL based on the upload URL" do
|
|
UrlHelper.expects(:cook_url).with(upload.url, secure: true)
|
|
subject.to_json
|
|
end
|
|
end
|
|
end
|
|
|
|
def enable_s3_uploads
|
|
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
|
|
SiteSetting.s3_access_key_id = "s3-access-key-id"
|
|
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
|
|
SiteSetting.s3_region = 'us-west-1'
|
|
SiteSetting.enable_s3_uploads = true
|
|
|
|
store = FileStore::S3Store.new
|
|
s3_helper = store.instance_variable_get(:@s3_helper)
|
|
client = Aws::S3::Client.new(stub_responses: true)
|
|
s3_helper.stubs(:s3_client).returns(client)
|
|
Discourse.stubs(:store).returns(store)
|
|
end
|
|
end
|