decidim-verifications 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +101 -0
- data/Rakefile +3 -0
- data/app/commands/decidim/verifications/authorize_user.rb +61 -0
- data/app/commands/decidim/verifications/confirm_user_authorization.rb +49 -0
- data/app/commands/decidim/verifications/perform_authorization_step.rb +48 -0
- data/app/controllers/decidim/verifications/authorizations_controller.rb +91 -0
- data/app/controllers/decidim/verifications/id_documents/admin/confirmations_controller.rb +48 -0
- data/app/controllers/decidim/verifications/id_documents/admin/pending_authorizations_controller.rb +28 -0
- data/app/controllers/decidim/verifications/id_documents/admin/rejections_controller.rb +37 -0
- data/app/controllers/decidim/verifications/id_documents/authorizations_controller.rb +82 -0
- data/app/controllers/decidim/verifications/postal_letter/admin/pending_authorizations_controller.rb +27 -0
- data/app/controllers/decidim/verifications/postal_letter/admin/postages_controller.rb +41 -0
- data/app/controllers/decidim/verifications/postal_letter/authorizations_controller.rb +74 -0
- data/app/forms/decidim/verifications/id_documents/information_form.rb +50 -0
- data/app/forms/decidim/verifications/id_documents/information_rejection_form.rb +15 -0
- data/app/forms/decidim/verifications/id_documents/upload_form.rb +20 -0
- data/app/forms/decidim/verifications/postal_letter/address_form.rb +28 -0
- data/app/forms/decidim/verifications/postal_letter/confirmation_form.rb +19 -0
- data/app/forms/decidim/verifications/postal_letter/postage_form.rb +34 -0
- data/app/presenters/decidim/verifications/id_documents/authorization_presenter.rb +20 -0
- data/app/presenters/decidim/verifications/postal_letter/authorization_presenter.rb +59 -0
- data/app/queries/decidim/verifications/authorizations.rb +41 -0
- data/app/services/decidim/authorization_handler.rb +112 -0
- data/app/services/decidim/dummy_authorization_handler.rb +27 -0
- data/app/uploaders/decidim/verifications/attachment_uploader.rb +16 -0
- data/app/views/decidim/verifications/authorizations/first_login.html.erb +22 -0
- data/app/views/decidim/verifications/authorizations/index.html.erb +78 -0
- data/app/views/decidim/verifications/authorizations/new.html.erb +33 -0
- data/app/views/decidim/verifications/id_documents/admin/confirmations/new.html.erb +26 -0
- data/app/views/decidim/verifications/id_documents/admin/pending_authorizations/index.html.erb +32 -0
- data/app/views/decidim/verifications/id_documents/authorizations/edit.html.erb +53 -0
- data/app/views/decidim/verifications/id_documents/authorizations/new.html.erb +35 -0
- data/app/views/decidim/verifications/postal_letter/admin/pending_authorizations/index.html.erb +50 -0
- data/app/views/decidim/verifications/postal_letter/authorizations/edit.html.erb +37 -0
- data/app/views/decidim/verifications/postal_letter/authorizations/new.html.erb +27 -0
- data/config/locales/ca.yml +126 -0
- data/config/locales/en.yml +126 -0
- data/config/locales/es.yml +126 -0
- data/config/locales/eu.yml +125 -0
- data/config/locales/fi.yml +125 -0
- data/config/locales/fr.yml +125 -0
- data/config/locales/it.yml +125 -0
- data/config/locales/nl.yml +125 -0
- data/config/locales/pl.yml +125 -0
- data/config/locales/pt.yml +125 -0
- data/config/locales/ru.yml +5 -0
- data/config/locales/uk.yml +41 -0
- data/db/migrate/20171030133426_move_authorizations_to_new_api.rb +66 -0
- data/lib/decidim/verifications.rb +26 -0
- data/lib/decidim/verifications/adapter.rb +88 -0
- data/lib/decidim/verifications/dummy.rb +5 -0
- data/lib/decidim/verifications/engine.rb +24 -0
- data/lib/decidim/verifications/id_documents.rb +6 -0
- data/lib/decidim/verifications/id_documents/admin.rb +12 -0
- data/lib/decidim/verifications/id_documents/admin_engine.rb +21 -0
- data/lib/decidim/verifications/id_documents/engine.rb +18 -0
- data/lib/decidim/verifications/id_documents/workflow.rb +6 -0
- data/lib/decidim/verifications/postal_letter.rb +6 -0
- data/lib/decidim/verifications/postal_letter/admin.rb +12 -0
- data/lib/decidim/verifications/postal_letter/admin_engine.rb +21 -0
- data/lib/decidim/verifications/postal_letter/engine.rb +18 -0
- data/lib/decidim/verifications/postal_letter/workflow.rb +6 -0
- data/lib/decidim/verifications/registry.rb +39 -0
- data/lib/decidim/verifications/version.rb +10 -0
- data/lib/decidim/verifications/workflow_manifest.rb +56 -0
- data/lib/decidim/verifications/workflows.rb +58 -0
- metadata +152 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Verifications
|
5
|
+
module IdDocuments
|
6
|
+
module Admin
|
7
|
+
#
|
8
|
+
# Handles rejections for verification by identity document upload.
|
9
|
+
#
|
10
|
+
class RejectionsController < Decidim::Admin::ApplicationController
|
11
|
+
layout "decidim/admin/users"
|
12
|
+
|
13
|
+
before_action :load_pending_authorization
|
14
|
+
|
15
|
+
def create
|
16
|
+
authorize! :update, @pending_authorization
|
17
|
+
|
18
|
+
@form = InformationRejectionForm.from_model(@pending_authorization)
|
19
|
+
|
20
|
+
PerformAuthorizationStep.call(@pending_authorization, @form) do
|
21
|
+
on(:ok) do
|
22
|
+
flash[:notice] = t("rejections.create.success", scope: "decidim.verifications.id_documents.admin")
|
23
|
+
redirect_to root_path
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def load_pending_authorization
|
31
|
+
@pending_authorization = Authorization.find(params[:pending_authorization_id])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Verifications
|
5
|
+
module IdDocuments
|
6
|
+
#
|
7
|
+
# Handles verification by identity document upload
|
8
|
+
#
|
9
|
+
class AuthorizationsController < Decidim::ApplicationController
|
10
|
+
helper_method :authorization
|
11
|
+
|
12
|
+
before_action :load_authorization
|
13
|
+
|
14
|
+
def new
|
15
|
+
authorize! :create, @authorization
|
16
|
+
|
17
|
+
@form = UploadForm.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def create
|
21
|
+
authorize! :create, @authorization
|
22
|
+
|
23
|
+
@form = UploadForm.from_params(params.merge(user: current_user))
|
24
|
+
|
25
|
+
PerformAuthorizationStep.call(@authorization, @form) do
|
26
|
+
on(:ok) do
|
27
|
+
flash[:notice] = t("authorizations.create.success", scope: "decidim.verifications.id_documents")
|
28
|
+
redirect_to decidim_verifications.authorizations_path
|
29
|
+
end
|
30
|
+
|
31
|
+
on(:invalid) do
|
32
|
+
flash[:alert] = t("authorizations.create.error", scope: "decidim.verifications.id_documents")
|
33
|
+
render action: :new
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def edit
|
39
|
+
authorize! :update, @authorization
|
40
|
+
|
41
|
+
@form = UploadForm.from_model(@authorization)
|
42
|
+
end
|
43
|
+
|
44
|
+
def update
|
45
|
+
authorize! :update, @authorization
|
46
|
+
|
47
|
+
@form = UploadForm.from_params(
|
48
|
+
params.merge(
|
49
|
+
user: current_user,
|
50
|
+
verification_attachment: @authorization.verification_attachment
|
51
|
+
)
|
52
|
+
)
|
53
|
+
|
54
|
+
PerformAuthorizationStep.call(@authorization, @form) do
|
55
|
+
on(:ok) do
|
56
|
+
flash[:notice] = t("authorizations.update.success", scope: "decidim.verifications.id_documents")
|
57
|
+
redirect_to decidim_verifications.authorizations_path
|
58
|
+
end
|
59
|
+
|
60
|
+
on(:invalid) do
|
61
|
+
flash[:alert] = t("authorizations.update.error", scope: "decidim.verifications.id_documents")
|
62
|
+
render action: :edit
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def authorization
|
70
|
+
@authorization_presenter ||= AuthorizationPresenter.new(@authorization)
|
71
|
+
end
|
72
|
+
|
73
|
+
def load_authorization
|
74
|
+
@authorization = Decidim::Authorization.find_or_initialize_by(
|
75
|
+
user: current_user,
|
76
|
+
name: "id_documents"
|
77
|
+
)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/app/controllers/decidim/verifications/postal_letter/admin/pending_authorizations_controller.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Verifications
|
5
|
+
module PostalLetter
|
6
|
+
module Admin
|
7
|
+
class PendingAuthorizationsController < Decidim::Admin::ApplicationController
|
8
|
+
layout "decidim/admin/users"
|
9
|
+
|
10
|
+
def index
|
11
|
+
authorize! :index, Authorization
|
12
|
+
|
13
|
+
@pending_authorizations = AuthorizationPresenter.for_collection(
|
14
|
+
pending_authorizations
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def pending_authorizations
|
21
|
+
Authorizations.new(name: "postal_letter", granted: false)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Verifications
|
5
|
+
module PostalLetter
|
6
|
+
module Admin
|
7
|
+
#
|
8
|
+
# Handles postages for verification letters.
|
9
|
+
#
|
10
|
+
class PostagesController < Decidim::Admin::ApplicationController
|
11
|
+
layout "decidim/admin/users"
|
12
|
+
|
13
|
+
before_action :load_pending_authorization
|
14
|
+
|
15
|
+
def create
|
16
|
+
authorize! :update, @pending_authorization
|
17
|
+
|
18
|
+
@form = PostageForm.from_model(@pending_authorization)
|
19
|
+
|
20
|
+
PerformAuthorizationStep.call(@pending_authorization, @form) do
|
21
|
+
on(:ok) do
|
22
|
+
flash[:notice] = t("postages.create.success", scope: "decidim.verifications.postal_letter.admin")
|
23
|
+
redirect_to pending_authorizations_path
|
24
|
+
end
|
25
|
+
|
26
|
+
on(:invalid) do
|
27
|
+
render json: { error: I18n.t("postages.create.error", scope: "decidim.verifications.postal_letter.admin") }, status: 422
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def load_pending_authorization
|
35
|
+
@pending_authorization = Authorization.find(params[:pending_authorization_id])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Verifications
|
5
|
+
module PostalLetter
|
6
|
+
class AuthorizationsController < Decidim::ApplicationController
|
7
|
+
helper_method :authorization
|
8
|
+
|
9
|
+
before_action :load_authorization
|
10
|
+
|
11
|
+
def new
|
12
|
+
authorize! :create, @authorization
|
13
|
+
|
14
|
+
@form = AddressForm.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def create
|
18
|
+
authorize! :create, @authorization
|
19
|
+
|
20
|
+
@form = AddressForm.from_params(params.merge(user: current_user))
|
21
|
+
|
22
|
+
PerformAuthorizationStep.call(@authorization, @form) do
|
23
|
+
on(:ok) do
|
24
|
+
flash[:notice] = t("authorizations.create.success", scope: "decidim.verifications.postal_letter")
|
25
|
+
redirect_to decidim_verifications.authorizations_path
|
26
|
+
end
|
27
|
+
|
28
|
+
on(:invalid) do
|
29
|
+
flash.now[:alert] = t("authorizations.create.error", scope: "decidim.verifications.postal_letter")
|
30
|
+
render :new
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def edit
|
36
|
+
authorize! :update, @authorization
|
37
|
+
|
38
|
+
@form = ConfirmationForm.from_params(params)
|
39
|
+
end
|
40
|
+
|
41
|
+
def update
|
42
|
+
authorize! :update, @authorization
|
43
|
+
|
44
|
+
@form = ConfirmationForm.from_params(params)
|
45
|
+
|
46
|
+
ConfirmUserAuthorization.call(@authorization, @form) do
|
47
|
+
on(:ok) do
|
48
|
+
flash[:notice] = t("authorizations.update.success", scope: "decidim.verifications.postal_letter")
|
49
|
+
redirect_to decidim_verifications.authorizations_path
|
50
|
+
end
|
51
|
+
|
52
|
+
on(:invalid) do
|
53
|
+
flash.now[:alert] = t("authorizations.update.error", scope: "decidim.verifications.postal_letter")
|
54
|
+
render :edit
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def authorization
|
62
|
+
@authorization_presenter ||= AuthorizationPresenter.new(@authorization)
|
63
|
+
end
|
64
|
+
|
65
|
+
def load_authorization
|
66
|
+
@authorization = Decidim::Authorization.find_or_initialize_by(
|
67
|
+
user: current_user,
|
68
|
+
name: "postal_letter"
|
69
|
+
)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Verifications
|
5
|
+
module IdDocuments
|
6
|
+
# A form object to be used as the base for identity document verification
|
7
|
+
class InformationForm < AuthorizationHandler
|
8
|
+
mimic :id_document_information
|
9
|
+
|
10
|
+
DOCUMENT_TYPES = %w(DNI NIE passport).freeze
|
11
|
+
|
12
|
+
attribute :document_number, String
|
13
|
+
attribute :document_type, String
|
14
|
+
|
15
|
+
validates :document_type,
|
16
|
+
inclusion: { in: DOCUMENT_TYPES },
|
17
|
+
presence: true
|
18
|
+
|
19
|
+
validates :document_number,
|
20
|
+
format: { with: /\A[A-Z0-9]*\z/, message: I18n.t("errors.messages.uppercase_only_letters_numbers") },
|
21
|
+
presence: true
|
22
|
+
|
23
|
+
def handler_name
|
24
|
+
"id_documents"
|
25
|
+
end
|
26
|
+
|
27
|
+
def map_model(model)
|
28
|
+
self.document_type = model.verification_metadata["document_type"]
|
29
|
+
self.document_number = model.verification_metadata["document_number"]
|
30
|
+
end
|
31
|
+
|
32
|
+
def verification_metadata
|
33
|
+
{
|
34
|
+
"document_type" => document_type,
|
35
|
+
"document_number" => document_number
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
def document_types_for_select
|
40
|
+
DOCUMENT_TYPES.map do |type|
|
41
|
+
[
|
42
|
+
I18n.t(type.downcase, scope: "decidim.verifications.id_documents"),
|
43
|
+
type
|
44
|
+
]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Verifications
|
5
|
+
module IdDocuments
|
6
|
+
# A form object to be used for reject a verification request by identity
|
7
|
+
# document upload.
|
8
|
+
class InformationRejectionForm < InformationForm
|
9
|
+
def verification_metadata
|
10
|
+
super.merge("rejected" => true)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Verifications
|
5
|
+
module IdDocuments
|
6
|
+
# A form object to be used when public users want to get verified by
|
7
|
+
# uploading their identity documents.
|
8
|
+
class UploadForm < InformationForm
|
9
|
+
mimic :id_document_upload
|
10
|
+
|
11
|
+
attribute :verification_attachment, String
|
12
|
+
|
13
|
+
validates :verification_attachment,
|
14
|
+
file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_attachment_size } },
|
15
|
+
file_content_type: { allow: ["image/jpeg", "image/png"] },
|
16
|
+
presence: true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "securerandom"
|
4
|
+
|
5
|
+
module Decidim
|
6
|
+
module Verifications
|
7
|
+
module PostalLetter
|
8
|
+
# A form object to be used when public users want to get verified by
|
9
|
+
# uploading their identity documents.
|
10
|
+
class AddressForm < AuthorizationHandler
|
11
|
+
attribute :full_address, String
|
12
|
+
|
13
|
+
validates :full_address, presence: true
|
14
|
+
|
15
|
+
def handler_name
|
16
|
+
"postal_letter"
|
17
|
+
end
|
18
|
+
|
19
|
+
def verification_metadata
|
20
|
+
{
|
21
|
+
address: full_address,
|
22
|
+
pending_verification_code: SecureRandom.random_number(1_000_000).to_s
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Verifications
|
5
|
+
module PostalLetter
|
6
|
+
# A form object that just holds a verification code that the user will
|
7
|
+
# have received by postal letter.
|
8
|
+
class ConfirmationForm < AuthorizationHandler
|
9
|
+
attribute :verification_code, String
|
10
|
+
|
11
|
+
validates :verification_code, presence: true
|
12
|
+
|
13
|
+
def verification_metadata
|
14
|
+
{ "verification_code" => verification_code }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Verifications
|
5
|
+
module PostalLetter
|
6
|
+
# A form object to be used when admins want to mark a verification letter
|
7
|
+
# as sent.
|
8
|
+
class PostageForm < AuthorizationHandler
|
9
|
+
attribute :full_address, String
|
10
|
+
attribute :verification_code, String
|
11
|
+
|
12
|
+
validates :full_address, presence: true
|
13
|
+
validates :verification_code, presence: true
|
14
|
+
|
15
|
+
def handler_name
|
16
|
+
"postal_letter"
|
17
|
+
end
|
18
|
+
|
19
|
+
def map_model(model)
|
20
|
+
self.verification_code = model.verification_metadata["pending_verification_code"]
|
21
|
+
self.full_address = model.verification_metadata["address"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def verification_metadata
|
25
|
+
{
|
26
|
+
address: full_address,
|
27
|
+
verification_code: verification_code,
|
28
|
+
letter_sent_at: Time.zone.now
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Verifications
|
5
|
+
module IdDocuments
|
6
|
+
#
|
7
|
+
# Decorator for id document authorizations
|
8
|
+
#
|
9
|
+
class AuthorizationPresenter < SimpleDelegator
|
10
|
+
#
|
11
|
+
# Whether the verification has been rejected or not and thus, whether
|
12
|
+
# the user should be prompted again to reupload documents
|
13
|
+
#
|
14
|
+
def rejected?
|
15
|
+
verification_metadata["rejected"] == true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|