Strengthen the tokens used in email reply addresses

This commit is contained in:
Tom Hughes 2023-11-07 10:31:57 +00:00
parent 4b78b0267d
commit 675b89ddb7
4 changed files with 19 additions and 23 deletions

View file

@ -81,7 +81,7 @@ class UserMailer < ApplicationMailer
attach_user_avatar(message.sender)
mail :from => from_address(message.sender.display_name, "m", message.id, message.digest),
mail :from => from_address(message.sender.display_name, "m", message.id, message.notification_token),
:to => message.recipient.email,
:subject => t(".subject", :message_title => message.title)
end
@ -102,7 +102,7 @@ class UserMailer < ApplicationMailer
set_references("diary", comment.diary_entry)
mail :from => from_address(comment.user.display_name, "c", comment.id, comment.digest, recipient.id),
mail :from => from_address(comment.user.display_name, "c", comment.id, comment.notification_token(recipient.id), recipient.id),
:to => recipient.email,
:subject => t(".subject", :user => comment.user.display_name)
end
@ -225,12 +225,12 @@ class UserMailer < ApplicationMailer
I18n.with_locale(Locale.available.preferred(recipient.preferred_languages), &block)
end
def from_address(name, type, id, digest, user_id = nil)
def from_address(name, type, id, token, user_id = nil)
if Settings.key?(:messages_domain) && domain = Settings.messages_domain
if user_id
"#{name} <#{type}-#{id}-#{user_id}-#{digest[0, 6]}@#{domain}>"
"#{name} <#{type}-#{id}-#{user_id}-#{token}@#{domain}>"
else
"#{name} <#{type}-#{id}-#{digest[0, 6]}@#{domain}>"
"#{name} <#{type}-#{id}-#{token}@#{domain}>"
end
else
Settings.email_from

View file

@ -37,13 +37,12 @@ class DiaryComment < ApplicationRecord
RichText.new(self[:body_format], self[:body])
end
def digest
md5 = Digest::MD5.new
md5 << diary_entry_id.to_s
md5 << user_id.to_s
md5 << created_at.xmlschema
md5 << body
md5.hexdigest
def notification_token(subscriber)
sha256 = Digest::SHA256.new
sha256 << Rails.application.key_generator.generate_key("openstreetmap/diary_comment")
sha256 << id.to_s
sha256 << subscriber.to_s
sha256.base64digest[0, 8]
end
private

View file

@ -59,13 +59,10 @@ class Message < ApplicationRecord
RichText.new(self[:body_format], self[:body])
end
def digest
md5 = Digest::MD5.new
md5 << from_user_id.to_s
md5 << to_user_id.to_s
md5 << sent_on.xmlschema
md5 << title
md5 << body
md5.hexdigest
def notification_token
sha256 = Digest::SHA256.new
sha256 << Rails.application.key_generator.generate_key("openstreetmap/message")
sha256 << id.to_s
sha256.base64digest[0, 8]
end
end

View file

@ -4,14 +4,14 @@ require File.join(File.dirname(__FILE__), "..", "config", "environment")
if recipient = ARGV[0].match(/^c-(\d+)-(\d+)-(.*)$/)
comment = DiaryComment.find(recipient[1])
digest = comment.digest
expected_token = comment.notification_token(recipient[2])
date = comment.created_at
from = comment.diary_entry.subscribers.find(recipient[2])
to = comment.user
token = recipient[3]
elsif recipient = ARGV[0].match(/^m-(\d+)-(.*)$/)
message = Message.find(recipient[1])
digest = message.digest
expected_token = message.notification_token
date = message.sent_on
from = message.recipient
to = message.sender
@ -20,7 +20,7 @@ else
exit 0
end
exit 0 unless ActiveSupport::SecurityUtils.secure_compare(token, digest[0, 6])
exit 0 unless ActiveSupport::SecurityUtils.secure_compare(token, expected_token)
exit 0 unless from.active?
exit 0 if date < 1.month.ago