mirror of
https://github.com/discourse/discourse.git
synced 2026-07-29 15:54:48 -05:00
FEATURE: Add support for secure media (#7888)
This PR introduces a new secure media setting. When enabled, it prevent unathorized access to media uploads (files of type image, video and audio). When the `login_required` setting is enabled, then all media uploads will be protected from unauthorized (anonymous) access. When `login_required`is disabled, only media in private messages will be protected from unauthorized access. A few notes: - the `prevent_anons_from_downloading_files` setting no longer applies to audio and video uploads - the `secure_media` setting can only be enabled if S3 uploads are already enabled and configured - upload records have a new column, `secure`, which is a boolean `true/false` of the upload's secure status - when creating a public post with an upload that has already been uploaded and is marked as secure, the post creator will raise an error - when enabling or disabling the setting on a site with existing uploads, the rake task `uploads:ensure_correct_acl` should be used to update all uploads' secure status and their ACL on S3
This commit is contained in:
committed by
Martin Brennan
parent
56b19ba740
commit
102909edb3
@@ -674,6 +674,50 @@ describe UserNotifications do
|
||||
expect(mail.body.to_s).to match(I18n.t("user_notifications.reached_limit", count: 2))
|
||||
end
|
||||
|
||||
describe "secure media" do
|
||||
let(:video_upload) { Fabricate(:upload, extension: "mov") }
|
||||
let(:user) { Fabricate(:user) }
|
||||
let(:post) { Fabricate(:post) }
|
||||
|
||||
before do
|
||||
SiteSetting.s3_upload_bucket = "some-bucket-on-s3"
|
||||
SiteSetting.s3_access_key_id = "s3-access-key-id"
|
||||
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
|
||||
SiteSetting.s3_cdn_url = "https://s3.cdn.com"
|
||||
SiteSetting.enable_s3_uploads = true
|
||||
SiteSetting.secure_media = true
|
||||
SiteSetting.login_required = true
|
||||
|
||||
video_upload.update!(url: "#{SiteSetting.s3_cdn_url}/#{Discourse.store.get_path_for_upload(video_upload)}")
|
||||
user.email_logs.create!(
|
||||
email_type: 'blah',
|
||||
to_address: user.email,
|
||||
user_id: user.id
|
||||
)
|
||||
end
|
||||
|
||||
it "replaces secure audio/video with placeholder" do
|
||||
reply = Fabricate(:post, topic_id: post.topic_id, raw: "Video: #{video_upload.url}")
|
||||
|
||||
notification = Fabricate(
|
||||
:notification,
|
||||
topic_id: post.topic_id,
|
||||
post_number: reply.post_number,
|
||||
user: post.user,
|
||||
data: { original_username: 'bob' }.to_json
|
||||
)
|
||||
|
||||
mail = UserNotifications.user_replied(
|
||||
user,
|
||||
post: reply,
|
||||
notification_type: notification.notification_type,
|
||||
notification_data_hash: notification.data_hash
|
||||
)
|
||||
|
||||
expect(mail.body.to_s).to match(I18n.t("emails.secure_media_placeholder"))
|
||||
end
|
||||
end
|
||||
|
||||
def expects_build_with(condition)
|
||||
UserNotifications.any_instance.expects(:build_email).with(user.email, condition)
|
||||
mailer = UserNotifications.public_send(
|
||||
|
||||
Reference in New Issue
Block a user