Sha256: 54f8c7c87453cf76e670b201583cc701ce52cbf6fe7951ee1d868e58756525be

Contents?: true

Size: 1.37 KB

Versions: 1

Compression:

Stored size: 1.37 KB

Contents

# frozen_string_literal: true

module Mail
  module Jdec
    module ContentDispositionElementPatch
      def initialize(string)
        if Jdec.enabled?
          # Remove extra trailing semicolon
          string = string.gsub(/;+$/, '')
          # Handles filename=test
          string = string.gsub(/filename\s*=\s*([^"]+?)\s*(;|$)/im) { %Q|filename="#{$1}"#{$2}| }
          # Handles filename=""test""
          string = string.gsub(/filename\s*=\s*"+([^"]+?)"+\s*(;|$)/im) { %Q|filename="#{$1}"#{$2}| }
          # Escape tspecial chars in RFC2231 filename
          string = string.gsub(/filename\*(\d*)(\*?)\s*=\s*(\S+?)'(\S*)'(\S+)(;|$)/i) { %Q|filename*#{$1}#{$2}=#{$3}'#{$4}'#{Escaper.escape($5)}#{$6}| }
          string = string.gsub(/filename\*(\d*)(\*?)\s*=\s*(\S+)(;|$)/i) { %Q|filename*#{$1}#{$2}=#{Escaper.escape($3)}#{$4}| }
        end

        super
      rescue Mail::Field::ParseError => e
        if Jdec.enabled?
          @disposition_type = 'attachment'
          @parameters = ['filename' => Jdec::Decoder.force_utf8(string)]
        else
          raise e
        end
      end
    end

    module Escaper
      def self.escape(str)
        require 'cgi'
        str.gsub(/[#{Regexp.escape(%Q|()<>@,;:\\"/[]?=|)}]/) do |c|
          CGI.escape(c)
        end
      end
    end
  end
end

Mail::ContentDispositionElement.prepend Mail::Jdec::ContentDispositionElementPatch

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mail-jdec-1.2.0 lib/mail/jdec/elements/content_disposition_element_patch.rb