mirror of https://github.com/docusealco/docuseal
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							89 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
	
	
							89 lines
						
					
					
						
							2.8 KiB
						
					
					
				| # frozen_string_literal: true
 | |
| 
 | |
| module Submitters
 | |
|   module MaybeAssignDefaultBrowserSignature
 | |
|     SIGNED_UUID_PURPPOSE = 'signature'
 | |
| 
 | |
|     module_function
 | |
| 
 | |
|     def call(submitter, params, cookies = nil, attachments = [])
 | |
|       attachments = attachments.select { |e| e.record_id == submitter.id && e.record_type == 'Submitter' }
 | |
| 
 | |
|       if (value = params[:signature_src].presence || params[:signature].presence)
 | |
|         find_or_create_signature_from_value(submitter, value, attachments)
 | |
|       elsif params[:signed_signature_uuids].present?
 | |
|         find_storage_signature(submitter, params[:signed_signature_uuids], attachments)
 | |
|       elsif cookies
 | |
|         find_session_signature(submitter, cookies, attachments)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def find_or_create_signature_from_value(submitter, value, attachments)
 | |
|       _, attachment = Submitters::NormalizeValues.normalize_attachment_value(value,
 | |
|                                                                              { 'type' => 'signature' },
 | |
|                                                                              submitter.account,
 | |
|                                                                              attachments,
 | |
|                                                                              submitter)
 | |
| 
 | |
|       attachment.record ||= submitter
 | |
| 
 | |
|       attachment.save!
 | |
| 
 | |
|       attachment
 | |
|     end
 | |
| 
 | |
|     def sign_signature_uuid(uuid)
 | |
|       ApplicationRecord.signed_id_verifier.generate(uuid, purpose: SIGNED_UUID_PURPPOSE)
 | |
|     end
 | |
| 
 | |
|     def verify_signature_uuid(signed_uuid)
 | |
|       ApplicationRecord.signed_id_verifier.verified(signed_uuid, purpose: SIGNED_UUID_PURPPOSE)
 | |
|     end
 | |
| 
 | |
|     def find_storage_signature(submitter, signed_uuids, attachments)
 | |
|       signed_uuid = signed_uuids[submitter.email]
 | |
| 
 | |
|       return if signed_uuid.blank?
 | |
| 
 | |
|       uuid = verify_signature_uuid(signed_uuid)
 | |
| 
 | |
|       return if uuid.blank?
 | |
| 
 | |
|       find_signature_from_uuid(submitter, uuid, attachments)
 | |
|     end
 | |
| 
 | |
|     def find_session_signature(submitter, cookies, attachments)
 | |
|       values =
 | |
|         begin
 | |
|           JSON.parse(cookies.encrypted[:signature_uuids].presence || '{}')
 | |
|         rescue JSON::ParserError
 | |
|           {}
 | |
|         end
 | |
| 
 | |
|       return if values.blank?
 | |
| 
 | |
|       uuid = values[submitter.email]
 | |
| 
 | |
|       return if uuid.blank?
 | |
| 
 | |
|       find_signature_from_uuid(submitter, uuid, attachments)
 | |
|     end
 | |
| 
 | |
|     def find_signature_from_uuid(submitter, uuid, attachments)
 | |
|       signature_attachment = ActiveStorage::Attachment.find_by(uuid:)
 | |
| 
 | |
|       return unless signature_attachment
 | |
| 
 | |
|       return if signature_attachment.record.email != submitter.email
 | |
| 
 | |
|       existing_attachment = attachments.find do |a|
 | |
|         a.blob_id == signature_attachment.blob_id && submitter.id == a.record_id
 | |
|       end
 | |
| 
 | |
|       return existing_attachment if existing_attachment
 | |
| 
 | |
|       submitter.attachments_attachments.create_or_find_by!(blob_id: signature_attachment.blob_id)
 | |
|     end
 | |
|   end
 | |
| end
 |