def valid?(password, hashed_password)
unless /^\{([A-Z][A-Z\d]+)\}/ =~ hashed_password
raise ArgumentError, _("Invalid hashed password: %s") % hashed_password
end
type = $1
hashed_password_without_type = $POSTMATCH
normalized_type = type.downcase
unless respond_to?(normalized_type)
raise ArgumentError, _("Unknown Hash type: %s") % type
end
salt_extractor = "extract_salt_for_#{normalized_type}"
if respond_to?(salt_extractor)
salt = send(salt_extractor, hashed_password_without_type)
if salt.nil?
raise ArgumentError,
_("Can't extract salt from hashed password: %s") % hashed_password
end
generated_password = send(normalized_type, password, salt)
else
generated_password = send(normalized_type, password)
end
hashed_password == generated_password
end