decidim-ub 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/config/assets.rb ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ base_path = File.expand_path("..", __dir__)
4
+
5
+ Decidim::Webpacker.register_path("#{base_path}/app/packs")
6
+ Decidim::Webpacker.register_entrypoints(
7
+ decidim_ub: "#{base_path}/app/packs/entrypoints/decidim_ub.js"
8
+ )
@@ -0,0 +1,7 @@
1
+ ---
2
+
3
+ base_locale: en
4
+ locales:
5
+ - ca
6
+ - en
7
+ - es
@@ -0,0 +1,31 @@
1
+ ---
2
+ ca:
3
+ decidim:
4
+ authorization_handlers:
5
+ ub_ant:
6
+ explanation: Verifica't com a antic alumne
7
+ name: Antic alumne (ANT)
8
+ ub_est:
9
+ explanation: Verifica't com a alumne
10
+ name: Alumne (EST)
11
+ ub_pas:
12
+ explanation: Verifica't com a personal administratiu/servicis
13
+ name: Personal administratiu/servicis (PTGAS)
14
+ ub_pdi:
15
+ explanation: Verifica't com a professor
16
+ name: Professor (PDI)
17
+ ub_pex:
18
+ explanation: Verifica't com a personal extern
19
+ name: Personal extern (PEX)
20
+ ub:
21
+ errors:
22
+ missing_role: No tens aquest rol
23
+ verifications:
24
+ authorizations:
25
+ first_login:
26
+ actions:
27
+ ub_ant: Verifica't com a antic almumne (ANT)
28
+ ub_est: Verifica't com a alumne (EST)
29
+ ub_pas: Verifica't com a personal administració/serveis (PTGAS)
30
+ ub_pdi: Verifica't com a professor (PDI)
31
+ ub_pex: Verifica't com a personal extern (PEX)
@@ -0,0 +1,31 @@
1
+ ---
2
+ en:
3
+ decidim:
4
+ authorization_handlers:
5
+ ub_ant:
6
+ explanation: Get verified as an old student
7
+ name: Old student (ANT)
8
+ ub_est:
9
+ explanation: Get verified as a student
10
+ name: Student (EST)
11
+ ub_pas:
12
+ explanation: Get verified as an administrative/services personal
13
+ name: Administrative/services personal (PTGAS)
14
+ ub_pdi:
15
+ explanation: Get verified as a teacher
16
+ name: Teacher (PDI)
17
+ ub_pex:
18
+ explanation: Get verified as an external personal
19
+ name: External personal (PEX)
20
+ ub:
21
+ errors:
22
+ missing_role: You don't have this role
23
+ verifications:
24
+ authorizations:
25
+ first_login:
26
+ actions:
27
+ ub_ant: Verify you are an old student (ANT)
28
+ ub_est: Verify you are a student (EST)
29
+ ub_pas: Verify you are an administrative/services personal (PTGAS)
30
+ ub_pdi: Verify you are a teacher (PDI)
31
+ ub_pex: Verify you are an external personal (PEX)
@@ -0,0 +1,31 @@
1
+ ---
2
+ es:
3
+ decidim:
4
+ authorization_handlers:
5
+ ub_ant:
6
+ explanation: Verifícate como antiguo estudiante
7
+ name: Antiguo estudiante (ANT)
8
+ ub_est:
9
+ explanation: Verifícate como estudiante
10
+ name: Estudiante (EST)
11
+ ub_pas:
12
+ explanation: Verifícate como personal administrativo/servicios
13
+ name: Personal administrativo/servicios (PTGAS)
14
+ ub_pdi:
15
+ explanation: Verifícate como profesor
16
+ name: Profesor (PDI)
17
+ ub_pex:
18
+ explanation: Verifícate como personal externo
19
+ name: Personal externo (PEX)
20
+ ub:
21
+ errors:
22
+ missing_role: No tienes este rol
23
+ verifications:
24
+ authorizations:
25
+ first_login:
26
+ actions:
27
+ ub_ant: Verifícate como antiguo estudiante (ANT)
28
+ ub_est: Verifícate como estudiante (EST)
29
+ ub_pas: Verifícate como personal administrativo/servicios (PTGAS)
30
+ ub_pdi: Verifícate como profesor (PDI)
31
+ ub_pex: Verifícate como personal externo (PEX)
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddUbRolesToUsers < ActiveRecord::Migration[6.0]
4
+ def change
5
+ add_column :decidim_users, :ub_roles, :jsonb, default: []
6
+ end
7
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "omniauth/strategies/ub"
4
+
5
+ module Decidim
6
+ module Ub
7
+ # This is the engine that runs on the public interface of ub.
8
+ class Engine < ::Rails::Engine
9
+ isolate_namespace Decidim::Ub
10
+
11
+ config.to_prepare do
12
+ Decidim::OmniauthHelper.include(Decidim::Ub::OmniauthHelperOverride)
13
+ Decidim::User.include(Decidim::Ub::UserOverride)
14
+ end
15
+
16
+ initializer "decidim_ub.omniauth" do
17
+ next unless Decidim::Ub.omniauth && Decidim::Ub.omniauth[:client_id]
18
+
19
+ # Decidim use the secrets configuration to decide whether to show the omniauth provider
20
+ Rails.application.secrets[:omniauth][Decidim::Ub::OMNIAUTH_PROVIDER_NAME.to_sym] = Decidim::Ub.omniauth
21
+
22
+ Rails.application.config.middleware.use OmniAuth::Builder do
23
+ provider Decidim::Ub::OMNIAUTH_PROVIDER_NAME,
24
+ client_id: Decidim::Ub.omniauth[:client_id],
25
+ client_secret: Decidim::Ub.omniauth[:client_secret],
26
+ client_options: {
27
+ site: Decidim::Ub.omniauth[:site],
28
+ authorize_url: Decidim::Ub.omniauth[:authorize_url],
29
+ token_url: Decidim::Ub.omniauth[:token_url]
30
+ }
31
+ end
32
+ end
33
+
34
+ initializer "decidim_ub.webpacker.assets_path" do
35
+ Decidim.register_assets_path File.expand_path("app/packs", root)
36
+ end
37
+
38
+ initializer "decidim_ub.authorizations" do
39
+ Decidim::Ub.authorizations.each do |name|
40
+ Decidim::Verifications.register_workflow(name.to_sym) do |workflow|
41
+ workflow.form = "Decidim::Ub::Verifications::#{name.camelize}"
42
+ end
43
+ end
44
+ end
45
+
46
+ initializer "decidim_ub.user_sync" do
47
+ ActiveSupport::Notifications.subscribe "decidim.user.omniauth_registration" do |_name, data|
48
+ Decidim::Ub::OmniauthUserSyncJob.perform_later(data) if data[:provider] == Decidim::Ub::OMNIAUTH_PROVIDER_NAME
49
+ end
50
+
51
+ ActiveSupport::Notifications.subscribe "decidim.ub.user.updated" do |_name, data|
52
+ Decidim::Ub::AutoVerificationJob.perform_later(data)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/core/test/factories"
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This holds the decidim-meetings version.
5
+ module Ub
6
+ VERSION = "0.1.0"
7
+ DECIDIM_VERSION = "~> 0.28.0"
8
+ COMPAT_DECIDIM_VERSION = [">= 0.28.0", "< 0.29"].freeze
9
+ end
10
+ end
data/lib/decidim/ub.rb ADDED
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/ub/engine"
4
+
5
+ module Decidim
6
+ module Ub
7
+ include ActiveSupport::Configurable
8
+
9
+ OMNIAUTH_PROVIDER_NAME = "ub"
10
+ ROLES = %w(EST PAS PDI PEX ANT).freeze
11
+
12
+ class << self
13
+ def roles_to_auth_name(roles)
14
+ roles.map { |role| "ub_#{role.downcase}" }
15
+ end
16
+ end
17
+
18
+ config_accessor :omniauth do
19
+ {
20
+ enabled: ENV["UB_CLIENT_ID"].present?,
21
+ icon_path: ENV.fetch("UB_ICON", "media/images/ub_logo.svg"),
22
+ client_id: ENV["UB_CLIENT_ID"].presence,
23
+ client_secret: ENV["UB_CLIENT_SECRET"].presence,
24
+ site: ENV["UB_SITE"].presence,
25
+ authorize_url: ENV["UB_AUTHORIZE_URL"].presence,
26
+ token_url: ENV["UB_TOKEN_URL"].presence
27
+ }
28
+ end
29
+
30
+ config_accessor :authorizations do
31
+ roles_to_auth_name(ROLES).freeze
32
+ end
33
+
34
+ class Error < StandardError; end
35
+ end
36
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ Decidim::Ub.configure do |config|
4
+ config.omniauth = {
5
+ client_id: "test-client-id",
6
+ client_secret: "test-client-secret",
7
+ site: "https://test.example.org",
8
+ authorize_url: "/authorize",
9
+ token_url: "/token"
10
+ }
11
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "omniauth-oauth2"
4
+
5
+ module OmniAuth
6
+ module Strategies
7
+ class Ub < OmniAuth::Strategies::OAuth2
8
+ REGEXP_SANITIZER = /[<>?%&^*#@()\[\]=+:;"{}\\|]/
9
+
10
+ option :name, "ub"
11
+ option :token_options, %w(client_id client_secret)
12
+
13
+ uid do
14
+ raw_info.dig("employeenumber", 0)
15
+ end
16
+
17
+ info do
18
+ {
19
+ name: raw_info.dig("cn", 0).gsub(REGEXP_SANITIZER, ""),
20
+ nickname: Decidim::UserBaseEntity.nicknamize(raw_info.dig("uidnet", 0)),
21
+ email: raw_info.dig("mail", 0),
22
+ roles: raw_info["colect2"] || []
23
+ }
24
+ end
25
+
26
+ def callback_url
27
+ full_host + callback_path
28
+ end
29
+
30
+ def raw_info
31
+ @raw_info ||= begin
32
+ connection = Faraday.new(url: options.client_options[:site], ssl: { verify: true }) do |conn|
33
+ conn.headers["Authorization"] = "#{access_token.response.parsed.token_type} #{access_token.token}"
34
+ end
35
+ response = connection.get("/api/adas/oauth2/tokendata")
36
+ raise Error, "Unable to fetch the user information" unless response.success?
37
+
38
+ JSON.parse(response.body).to_h
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "omniauth/strategies/ub"
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: decidim-ub
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Francisco Bolívar
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-07-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: decidim-core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.28.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '0.29'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 0.28.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.29'
33
+ - !ruby/object:Gem::Dependency
34
+ name: decidim-dev
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 0.28.0
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '0.29'
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 0.28.0
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '0.29'
53
+ description: A Decidim module to sync UB users who connect to the platform.
54
+ email:
55
+ - francisco.bolivar@nazaries.com
56
+ executables: []
57
+ extensions: []
58
+ extra_rdoc_files: []
59
+ files:
60
+ - LICENSE-AGPLv3.txt
61
+ - README.md
62
+ - Rakefile
63
+ - app/commands/decidim/ub/sync_user.rb
64
+ - app/controllers/concerns/decidim/devise_authentication_methods.rb
65
+ - app/forms/decidim/ub/verifications/ub.rb
66
+ - app/forms/decidim/ub/verifications/ub_ant.rb
67
+ - app/forms/decidim/ub/verifications/ub_est.rb
68
+ - app/forms/decidim/ub/verifications/ub_pas.rb
69
+ - app/forms/decidim/ub/verifications/ub_pdi.rb
70
+ - app/forms/decidim/ub/verifications/ub_pex.rb
71
+ - app/helpers/decidim/ub/omniauth_helper_override.rb
72
+ - app/jobs/decidim/ub/auto_verification_job.rb
73
+ - app/jobs/decidim/ub/omniauth_user_sync_job.rb
74
+ - app/models/concerns/decidim/ub/user_override.rb
75
+ - app/packs/entrypoints/decidim_ub.js
76
+ - app/packs/images/ub_logo.svg
77
+ - config/assets.rb
78
+ - config/i18n-tasks.yml
79
+ - config/locales/ca.yml
80
+ - config/locales/en.yml
81
+ - config/locales/es.yml
82
+ - db/migrate/20240709154301_add_ub_roles_to_users.rb
83
+ - lib/decidim/ub.rb
84
+ - lib/decidim/ub/engine.rb
85
+ - lib/decidim/ub/test/factories.rb
86
+ - lib/decidim/ub/version.rb
87
+ - lib/generators/decidim/app_templates/test/initializer.rb
88
+ - lib/omniauth/strategies/ub.rb
89
+ - lib/omniauth/ub.rb
90
+ homepage: https://decidim.org
91
+ licenses:
92
+ - AGPL-3.0
93
+ metadata:
94
+ bug_tracker_uri: https://github.com/decidim/decidim/issues
95
+ documentation_uri: https://docs.decidim.org/
96
+ funding_uri: https://opencollective.com/decidim
97
+ homepage_uri: https://decidim.org
98
+ source_code_uri: https://github.com/decidim/decidim
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '3.1'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubygems_version: 3.4.14
115
+ signing_key:
116
+ specification_version: 4
117
+ summary: A decidim ub module
118
+ test_files: []