Skip to content

Commit 33ca930

Browse files
authored
Merge from docusealco/wip
Wip
2 parents a389e8c + 3b396f8 commit 33ca930

File tree

56 files changed

+205
-83
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+205
-83
lines changed

app/controllers/submissions_download_controller.rb

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,29 +27,37 @@ def index
2727

2828
Submissions::EnsureResultGenerated.call(last_submitter)
2929

30-
if last_submitter.completed_at < TTL.ago && !signature_valid && !current_user_submitter?(last_submitter)
31-
Rollbar.info("TTL: #{last_submitter.id}") if defined?(Rollbar)
30+
if !signature_valid && !current_user_submitter?(last_submitter)
31+
return head :not_found unless Submitters::AuthorizedForForm.call(@submitter, current_user, request)
3232

33-
return head :not_found
33+
if last_submitter.completed_at < TTL.ago
34+
Rollbar.info("TTL: #{last_submitter.id}") if defined?(Rollbar)
35+
36+
return head :not_found
37+
end
3438
end
3539

3640
if params[:combined] == 'true'
37-
url = build_combined_url(@submitter)
38-
39-
if url
40-
render json: [url]
41-
else
42-
head :not_found
43-
end
41+
respond_with_combined(last_submitter)
4442
else
4543
render json: build_urls(last_submitter)
4644
end
4745
end
4846

4947
private
5048

49+
def respond_with_combined(submitter)
50+
url = build_combined_url(submitter)
51+
52+
if url
53+
render json: [url]
54+
else
55+
head :not_found
56+
end
57+
end
58+
5159
def current_user_submitter?(submitter)
52-
current_user && current_user.account.submitters.exists?(id: submitter.id)
60+
current_user && current_ability.can?(:read, submitter)
5361
end
5462

5563
def build_urls(submitter)

app/controllers/submit_form_controller.rb

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ class SubmitFormController < ApplicationController
99

1010
before_action :load_submitter, only: %i[show update completed]
1111
before_action :maybe_render_locked_page, only: :show
12-
before_action :maybe_require_link_2fa, only: %i[show update]
12+
before_action :maybe_require_link_2fa, only: %i[show]
1313

1414
CONFIG_KEYS = [].freeze
1515

1616
def show
1717
submission = @submitter.submission
1818

19+
return render :email_2fa unless Submitters::AuthorizedForForm.pass_email_2fa?(@submitter, request)
1920
return redirect_to submit_form_completed_path(@submitter.slug) if @submitter.completed_at?
20-
return render :email_2fa if require_email_2fa?(@submitter)
2121

2222
@form_configs = Submitters::FormConfigs.call(@submitter, CONFIG_KEYS)
2323

@@ -48,7 +48,7 @@ def show
4848
end
4949

5050
def update
51-
if require_email_2fa?(@submitter)
51+
unless Submitters::AuthorizedForForm.call(@submitter, current_user, request)
5252
return render json: { error: I18n.t('verification_required_refresh_the_page_and_pass_2fa') },
5353
status: :unprocessable_content
5454
end
@@ -84,18 +84,17 @@ def update
8484
def completed
8585
raise ActionController::RoutingError, I18n.t('not_found') if @submitter.account.archived_at?
8686

87-
redirect_to submit_form_path(params[:submit_form_slug]) if require_email_2fa?(@submitter)
87+
return if Submitters::AuthorizedForForm.call(@submitter, current_user, request)
88+
89+
redirect_to submit_form_path(params[:submit_form_slug])
8890
end
8991

9092
def success; end
9193

9294
private
9395

9496
def maybe_require_link_2fa
95-
return if @submitter.submission.source != 'link'
96-
return unless @submitter.submission.template&.preferences&.dig('shared_link_2fa') == true
97-
return if cookies.encrypted[:email_2fa_slug] == @submitter.slug
98-
return if @submitter.email == current_user&.email && current_user&.account_id == @submitter.account_id
97+
return if Submitters::AuthorizedForForm.pass_link_2fa?(@submitter, current_user, request)
9998

10099
redirect_to start_form_path(@submitter.submission.template.slug)
101100
end
@@ -117,12 +116,4 @@ def build_attachments_index(submission)
117116
ActiveStorage::Attachment.where(record: submission.submitters, name: :attachments)
118117
.preload(:blob).index_by(&:uuid)
119118
end
120-
121-
def require_email_2fa?(submitter)
122-
return false if submitter.submission.template&.preferences&.dig('require_email_2fa') != true &&
123-
submitter.preferences['require_email_2fa'] != true
124-
return false if cookies.encrypted[:email_2fa_slug] == submitter.slug
125-
126-
true
127-
end
128119
end

app/controllers/submit_form_decline_controller.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ def create
1111
submitter.completed_at? ||
1212
submitter.submission.archived_at? ||
1313
submitter.submission.expired? ||
14-
submitter.submission.template&.archived_at?
14+
submitter.submission.template&.archived_at? ||
15+
!Submitters::AuthorizedForForm.call(submitter, current_user,
16+
request)
1517

1618
ApplicationRecord.transaction do
1719
submitter.update!(declined_at: Time.current)

app/controllers/submit_form_download_controller.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ def index
1717
@submitter.submission.template&.archived_at? ||
1818
AccountConfig.exists?(account_id: @submitter.account_id,
1919
key: AccountConfig::ALLOW_TO_PARTIAL_DOWNLOAD_KEY,
20-
value: false)
20+
value: false) ||
21+
!Submitters::AuthorizedForForm.call(@submitter, current_user, request)
2122

2223
last_completed_submitter = @submitter.submission.submitters
2324
.where.not(id: @submitter.id)

app/controllers/submit_form_draw_signature_controller.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ def show
1212

1313
return redirect_to submit_form_completed_path(@submitter.slug) if @submitter.completed_at?
1414

15-
if @submitter.submission.template&.archived_at? || @submitter.submission.archived_at?
15+
if @submitter.submission.template&.archived_at? || @submitter.submission.archived_at? ||
16+
!Submitters::AuthorizedForForm.call(@submitter, current_user, request)
1617
return redirect_to submit_form_path(@submitter.slug)
1718
end
1819

app/controllers/submit_form_invite_controller.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ def can_invite?(submitter)
4545
!submitter.completed_at? &&
4646
!submitter.submission.archived_at? &&
4747
!submitter.submission.expired? &&
48-
!submitter.submission.template&.archived_at?
48+
!submitter.submission.template&.archived_at? &&
49+
Submitters::AuthorizedForForm.call(submitter, current_user, request)
4950
end
5051

5152
def filter_invite_submitters(submitter, key = 'invite_by_uuid')

app/controllers/submit_form_values_controller.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ class SubmitFormValuesController < ApplicationController
77
def index
88
submitter = Submitter.find_by!(slug: params[:submit_form_slug])
99

10-
return render json: {} if submitter.completed_at? || submitter.declined_at?
11-
return render json: {} if submitter.submission.template&.archived_at? ||
10+
return render json: {} if submitter.completed_at? ||
11+
submitter.declined_at? ||
12+
submitter.submission.template&.archived_at? ||
1213
submitter.submission.archived_at? ||
13-
submitter.submission.expired?
14+
submitter.submission.expired? ||
15+
!Submitters::AuthorizedForForm.call(submitter, current_user, request)
1416

1517
value = submitter.values[params['field_uuid']]
1618
attachment = submitter.attachments.where(created_at: params[:after]..).find_by(uuid: value) if value.present?

app/controllers/templates_uploads_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def save_template!(template, url_params)
5656
def create_file_params_from_url
5757
tempfile = Tempfile.new
5858
tempfile.binmode
59-
tempfile.write(DownloadUtils.call(params[:url]).body)
59+
tempfile.write(DownloadUtils.call(params[:url], validate: true).body)
6060
tempfile.rewind
6161

6262
filename = URI.decode_www_form_component(params[:filename]) if params[:filename].present?

app/javascript/submission_form/completed.vue

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,11 @@ export default {
161161
required: false,
162162
default: false
163163
},
164+
fetchOptions: {
165+
type: Object,
166+
required: false,
167+
default: () => ({})
168+
},
164169
completedButton: {
165170
type: Object,
166171
required: false,
@@ -214,7 +219,10 @@ export default {
214219
download () {
215220
this.isDownloading = true
216221
217-
fetch(this.baseUrl + `/submitters/${this.submitterSlug}/download`).then(async (response) => {
222+
fetch(this.baseUrl + `/submitters/${this.submitterSlug}/download`, {
223+
method: 'GET',
224+
...this.fetchOptions
225+
}).then(async (response) => {
218226
if (response.ok) {
219227
const urls = await response.json()
220228
const isMobileSafariIos = 'ontouchstart' in window && navigator.maxTouchPoints > 0 && /AppleWebKit/i.test(navigator.userAgent)

app/javascript/submission_form/form.vue

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,7 @@
530530
v-else-if="isInvite"
531531
:submitters="inviteSubmitters"
532532
:optional-submitters="optionalInviteSubmitters"
533+
:fetch-options="fetchOptions"
533534
:submitter-slug="submitterSlug"
534535
:authenticity-token="authenticityToken"
535536
:url="baseUrl + submitPath + '/invite'"
@@ -543,6 +544,7 @@
543544
:has-signature-fields="stepFields.some((fields) => fields.some((f) => ['signature', 'initials'].includes(f.type)))"
544545
:has-multiple-documents="hasMultipleDocuments"
545546
:completed-button="completedRedirectUrl ? {} : completedButton"
547+
:fetch-options="fetchOptions"
546548
:completed-message="completedRedirectUrl ? {} : completedMessage"
547549
:with-send-copy-button="withSendCopyButton && !completedRedirectUrl"
548550
:with-download-button="withDownloadButton && !completedRedirectUrl && !dryRun"
@@ -678,6 +680,11 @@ export default {
678680
required: false,
679681
default: () => []
680682
},
683+
fetchOptions: {
684+
type: Object,
685+
required: false,
686+
default: () => ({})
687+
},
681688
optionalInviteSubmitters: {
682689
type: Array,
683690
required: false,
@@ -1467,7 +1474,8 @@ export default {
14671474
} else {
14681475
return fetch(this.baseUrl + this.submitPath, {
14691476
method: 'POST',
1470-
body: formData || new FormData(this.$refs.form)
1477+
body: formData || new FormData(this.$refs.form),
1478+
...this.fetchOptions
14711479
}).then((response) => {
14721480
if (response.status === 200) {
14731481
currentFieldUuids.forEach((fieldUuid) => {

0 commit comments

Comments
 (0)