|  |  |  | @ -40,7 +40,7 @@ module Submitters | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         if field['type'].in?(%w[initials signature image file stamp]) && value.present? | 
			
		
	
		
			
				
					|  |  |  |  |           new_value, new_attachments = | 
			
		
	
		
			
				
					|  |  |  |  |             normalize_attachment_value(value, field['type'], template.account, attachments, for_submitter) | 
			
		
	
		
			
				
					|  |  |  |  |             normalize_attachment_value(value, field, template.account, attachments, for_submitter) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |           attachments.push(*new_attachments) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -109,17 +109,17 @@ module Submitters | 
			
		
	
		
			
				
					|  |  |  |  |             .merge(fields.index_by { |e| e['name'].to_s.downcase }) | 
			
		
	
		
			
				
					|  |  |  |  |     end | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     def normalize_attachment_value(value, type, account, attachments, for_submitter = nil) | 
			
		
	
		
			
				
					|  |  |  |  |     def normalize_attachment_value(value, field, account, attachments, for_submitter = nil) | 
			
		
	
		
			
				
					|  |  |  |  |       if value.is_a?(Array) | 
			
		
	
		
			
				
					|  |  |  |  |         new_attachments = value.map do |v| | 
			
		
	
		
			
				
					|  |  |  |  |           new_attachment = find_or_build_attachment(v, type, account, for_submitter) | 
			
		
	
		
			
				
					|  |  |  |  |           new_attachment = find_or_build_attachment(v, field, account, for_submitter) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |           attachments.find { |a| a.blob_id == new_attachment.blob_id } || new_attachment | 
			
		
	
		
			
				
					|  |  |  |  |         end | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         [new_attachments.map(&:uuid), new_attachments] | 
			
		
	
		
			
				
					|  |  |  |  |       else | 
			
		
	
		
			
				
					|  |  |  |  |         new_attachment = find_or_build_attachment(value, type, account, for_submitter) | 
			
		
	
		
			
				
					|  |  |  |  |         new_attachment = find_or_build_attachment(value, field, account, for_submitter) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         existing_attachment = attachments.find { |a| a.blob_id == new_attachment.blob_id } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -129,7 +129,9 @@ module Submitters | 
			
		
	
		
			
				
					|  |  |  |  |       end | 
			
		
	
		
			
				
					|  |  |  |  |     end | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     def find_or_build_attachment(value, type, account, for_submitter = nil) | 
			
		
	
		
			
				
					|  |  |  |  |     def find_or_build_attachment(value, field, account, for_submitter = nil) | 
			
		
	
		
			
				
					|  |  |  |  |       type = field['type'] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       blob = | 
			
		
	
		
			
				
					|  |  |  |  |         if value.match?(%r{\Ahttps?://}) | 
			
		
	
		
			
				
					|  |  |  |  |           find_or_create_blob_from_url(account, value) | 
			
		
	
	
		
			
				
					|  |  |  | @ -138,6 +140,8 @@ module Submitters | 
			
		
	
		
			
				
					|  |  |  |  |         elsif (data = Base64.decode64(value.sub(BASE64_PREFIX_REGEXP, ''))) && | 
			
		
	
		
			
				
					|  |  |  |  |               Marcel::MimeType.for(data).exclude?('octet-stream') | 
			
		
	
		
			
				
					|  |  |  |  |           find_or_create_blob_from_base64(account, data, type) | 
			
		
	
		
			
				
					|  |  |  |  |         elsif type == 'image' && (value.starts_with?('<html>') || value.starts_with?('<!DOCTYPE')) | 
			
		
	
		
			
				
					|  |  |  |  |           find_or_create_blob_from_html(account, value, field) | 
			
		
	
		
			
				
					|  |  |  |  |         else | 
			
		
	
		
			
				
					|  |  |  |  |           raise InvalidDefaultValue, "Invalid value, url, base64 or text < 60 chars is expected: #{value.first(200)}..." | 
			
		
	
		
			
				
					|  |  |  |  |         end | 
			
		
	
	
		
			
				
					|  |  |  | @ -152,6 +156,10 @@ module Submitters | 
			
		
	
		
			
				
					|  |  |  |  |       attachment | 
			
		
	
		
			
				
					|  |  |  |  |     end | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     def find_or_create_blob_from_html(_account, value, _field) | 
			
		
	
		
			
				
					|  |  |  |  |       raise InvalidDefaultValue, "HTML content is not allowed: #{value.first(200)}..." | 
			
		
	
		
			
				
					|  |  |  |  |     end | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     def find_or_create_blob_from_base64(account, data, type) | 
			
		
	
		
			
				
					|  |  |  |  |       checksum = Digest::MD5.base64digest(data) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |