isaca-rails 0.2.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 +28 -0
- data/Rakefile +102 -0
- data/app/assets/images/isaca/rails/geometric-1920-blue.png +0 -0
- data/app/assets/images/isaca/rails/isaca-logo.png +0 -0
- data/app/assets/javascript/isaca/rails/application.js +13 -0
- data/app/assets/stylesheets/isaca/rails/all.css +46 -0
- data/app/assets/stylesheets/isaca/rails/application.css +15 -0
- data/app/assets/stylesheets/isaca/rails/components/button.css +34 -0
- data/app/assets/stylesheets/isaca/rails/components/container.css +4 -0
- data/app/assets/stylesheets/isaca/rails/components/flash.css +18 -0
- data/app/assets/stylesheets/isaca/rails/components/form-control.css +7 -0
- data/app/assets/stylesheets/isaca/rails/sessions.css +96 -0
- data/app/assets/stylesheets/isaca/rails/user_consent.css +87 -0
- data/app/controllers/isaca/rails/application_controller.rb +5 -0
- data/app/controllers/isaca/rails/platform/administrators_controller.rb +68 -0
- data/app/controllers/isaca/rails/platform/application_controller.rb +10 -0
- data/app/controllers/isaca/rails/platform/claims_controller.rb +34 -0
- data/app/controllers/isaca/rails/sessions_controller.rb +56 -0
- data/app/controllers/isaca/rails/users_consent_controller.rb +24 -0
- data/app/controllers/isaca/rails/welcome_controller.rb +3 -0
- data/app/helpers/isaca/rails/application_helper.rb +48 -0
- data/app/helpers/isaca/rails/claims_helper.rb +13 -0
- data/app/models/session/sign_in/form_object.rb +28 -0
- data/app/models/user_consent/agreement/form_object.rb +33 -0
- data/app/views/isaca/rails/platform/administrators/_administrator.html.erb +6 -0
- data/app/views/isaca/rails/platform/administrators/_claims_form.html.erb +9 -0
- data/app/views/isaca/rails/platform/administrators/edit.html.erb +9 -0
- data/app/views/isaca/rails/platform/administrators/index.html.erb +15 -0
- data/app/views/isaca/rails/platform/administrators/new.html.erb +17 -0
- data/app/views/isaca/rails/platform/administrators/show.html.erb +29 -0
- data/app/views/isaca/rails/sessions/_form.html.erb +15 -0
- data/app/views/isaca/rails/sessions/new.html.erb +28 -0
- data/app/views/isaca/rails/sessions/shared/_links.html.erb +2 -0
- data/app/views/isaca/rails/users_consent/_form.html.erb +50 -0
- data/app/views/isaca/rails/users_consent/show.html.erb +21 -0
- data/app/views/isaca/rails/welcome/index.html.erb +81 -0
- data/app/views/layouts/isaca-rails.html.erb +23 -0
- data/config/application.rb +0 -0
- data/config/locales/isaca-rails.en.yml +25 -0
- data/config/routes.rb +2 -0
- data/lib/generators/isaca/rails/install/USAGE +24 -0
- data/lib/generators/isaca/rails/install/install_generator.rb +148 -0
- data/lib/generators/isaca/rails/install/templates/README +14 -0
- data/lib/generators/isaca/rails/install/templates/add_isaca_claims.rb.erb +10 -0
- data/lib/generators/isaca/rails/install/templates/add_isaca_to_existing_users.rb.erb +17 -0
- data/lib/generators/isaca/rails/install/templates/add_isaca_users.rb.erb +21 -0
- data/lib/generators/isaca/rails/install/templates/claim.rb.erb +13 -0
- data/lib/generators/isaca/rails/install/templates/isaca-rails.rb +4 -0
- data/lib/generators/isaca/rails/install/templates/isaca.rb +5 -0
- data/lib/generators/isaca/rails/install/templates/user.rb.erb +3 -0
- data/lib/isaca/rails/authentication.rb +166 -0
- data/lib/isaca/rails/authorization.rb +51 -0
- data/lib/isaca/rails/controller.rb +14 -0
- data/lib/isaca/rails/engine.rb +7 -0
- data/lib/isaca/rails/user.rb +16 -0
- data/lib/isaca/rails/version.rb +5 -0
- data/lib/isaca/rails.rb +83 -0
- data/lib/tasks/isaca/rails_tasks.rake +4 -0
- metadata +297 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
module Isaca::Rails::ApplicationHelper
|
2
|
+
# Injects the isaca privacy policy and cookie consent notices
|
3
|
+
def isaca_consent_javascript
|
4
|
+
javascript_include_tag 'https://www.isaca.org/info/shared/js/isaca-consent.min.js'
|
5
|
+
end
|
6
|
+
|
7
|
+
# Presents beautiful flash notices if flash notices exist
|
8
|
+
def isaca_flash_messages
|
9
|
+
content_tag :div do
|
10
|
+
flash.collect do |name, message|
|
11
|
+
concat(content_tag :div, message, class: "ir-flash ir-flash-#{name.underscore}")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Presents beautiful error messages for form objects
|
17
|
+
def isaca_form_errors(model)
|
18
|
+
if model.errors.size > 1
|
19
|
+
message = 'The following errors occurred:'
|
20
|
+
else
|
21
|
+
message = 'The following error occurred:'
|
22
|
+
end
|
23
|
+
|
24
|
+
concat(content_tag(:p, message))
|
25
|
+
|
26
|
+
content_tag :div, class: 'ir-flash ir-flash-alert' do
|
27
|
+
error_list = content_tag (:ul) do
|
28
|
+
model.errors.full_messages.collect do |message|
|
29
|
+
concat(content_tag :li, message)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
concat(error_list)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Provides a link to reset user credentials
|
38
|
+
def link_to_forgot_isaca_credentials
|
39
|
+
link_to 'Forgot password and/or username?',
|
40
|
+
'https://www.isaca.org/ecommerce/Pages/Forgot-Password.aspx', target: :blank
|
41
|
+
end
|
42
|
+
|
43
|
+
# Provides a link to create an ISACA account
|
44
|
+
def link_to_create_isaca_account
|
45
|
+
link_to 'Create ISACA account',
|
46
|
+
'https://www.isaca.org/ecommerce/Pages/CreateAccountLite.aspx?pf=1', target: :blank
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Isaca
|
2
|
+
module Rails
|
3
|
+
module ClaimsHelper
|
4
|
+
def claim_checkbox(form, administrator, privilege)
|
5
|
+
content_tag(:div, class: 'form-group') do
|
6
|
+
concat form.check_box(privilege, {checked: user_has_privilege?(administrator, privilege),
|
7
|
+
id: "claims_#{privilege}_#{administrator.id}"})
|
8
|
+
concat form.label(privilege, privilege, value: administrator.id)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Session
|
2
|
+
module SignIn
|
3
|
+
# Class used as to easily integrate a session form with some basic validation
|
4
|
+
class FormObject
|
5
|
+
include ActiveModel::Model
|
6
|
+
|
7
|
+
attr_accessor :username, :password
|
8
|
+
validates_presence_of :username, :password
|
9
|
+
|
10
|
+
# This method will attempt to generate a session with the ISACA SSO service
|
11
|
+
#
|
12
|
+
# @raise [ISACA::ConnectionError] Occurs when a connection could not be established. This could be due to IP whitelisting or an invalid endpoint URL
|
13
|
+
#
|
14
|
+
# @return [Isaca::Model::AuthenticateUser]
|
15
|
+
def sign_in
|
16
|
+
Isaca::Request::AuthenticateUser.get(username, password) if valid?
|
17
|
+
end
|
18
|
+
|
19
|
+
# Defining this method allows us to use some ActiveModel patterns. For example, forms will be identified
|
20
|
+
# as sign_in instead of session_sign_in_form_object.
|
21
|
+
#
|
22
|
+
# @return [ActiveModel::Name]
|
23
|
+
def self.model_name
|
24
|
+
ActiveModel::Name.new(self, nil, 'SignIn')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module UserConsent
|
2
|
+
module Agreement
|
3
|
+
# Form object used for handling user consent
|
4
|
+
class FormObject
|
5
|
+
include ActiveModel::Model
|
6
|
+
|
7
|
+
attr_accessor :privacy_policy, :marketing_policy
|
8
|
+
validates_acceptance_of :privacy_policy, allow_nil: false
|
9
|
+
validates_presence_of :marketing_policy
|
10
|
+
|
11
|
+
|
12
|
+
# Method used to report user consent of the privacy policy and marketing
|
13
|
+
#
|
14
|
+
# @param options [Hash] Optional. If not provided, marketing consent will default to NO [0].
|
15
|
+
#
|
16
|
+
# == Options
|
17
|
+
# [marketing] Consent for marketing. Acceptable values are 0 [for NO] and 1 [for YES].
|
18
|
+
#
|
19
|
+
# @return [Boolean] Whether or not the consent was successfully reported to ISACA
|
20
|
+
def report_consent(imis_id, options={})
|
21
|
+
Isaca::Request::ReportConsent.get(imis_id, options).success? if valid?
|
22
|
+
end
|
23
|
+
|
24
|
+
# Defining this method allows us to use some ActiveModel patterns. For example, forms will be identified
|
25
|
+
# as sign_in instead of session_sign_in_form_object.
|
26
|
+
#
|
27
|
+
# @return [ActiveModel::Name]
|
28
|
+
def self.model_name
|
29
|
+
ActiveModel::Name.new(self, nil, 'Agreement')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<li>
|
2
|
+
<%= administrator.first_name %> <%= administrator.last_name %>
|
3
|
+
<%= link_to 'Show', administrator_path(administrator) %> |
|
4
|
+
<%= link_to 'Edit Claims', edit_administrator_path(administrator) %> |
|
5
|
+
<%= link_to 'Remove Administrator Privileges', administrator_path(administrator), method: :delete, data: {confirm: t('isaca.rails.administrators.delete_confirmation')} %>
|
6
|
+
</li>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<%= form_for :claims, url: administrator_claims_path(@administrator) do |f| %>
|
2
|
+
<% ::Claim.privileges.keys.collect(&:to_sym).each do |privilege| %>
|
3
|
+
<%= claim_checkbox(f, @administrator, privilege) %>
|
4
|
+
<% end %>
|
5
|
+
|
6
|
+
<div class="form-group">
|
7
|
+
<%= f.submit %>
|
8
|
+
</div>
|
9
|
+
<% end %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="ir-container">
|
2
|
+
<%= image_tag 'isaca/rails/isaca-logo.png', height: 50 %>
|
3
|
+
<h1><%= @administrator.first_name %> <%= @administrator.last_name %></h1>
|
4
|
+
|
5
|
+
<div class="ir-container">
|
6
|
+
<h2>Edit Administrator Claims</h2>
|
7
|
+
<%= render 'isaca/rails/platform/administrators/claims_form' %>
|
8
|
+
</div>
|
9
|
+
</div>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<div class="ir-container">
|
2
|
+
<%= image_tag 'isaca/rails/isaca-logo.png', height: 50 %>
|
3
|
+
<h1><%= Rails.application.class.parent_name %> Administrators</h1>
|
4
|
+
|
5
|
+
<div class="ir-container">
|
6
|
+
<%= link_to 'Add an Administrator', new_administrator_path %>
|
7
|
+
<% if @administrators.any? %>
|
8
|
+
<ul>
|
9
|
+
<%= render partial: 'isaca/rails/platform/administrators/administrator', collection: @administrators %>
|
10
|
+
</ul>
|
11
|
+
<% else %>
|
12
|
+
<p>No administrators exist for this application.</p>
|
13
|
+
<% end %>
|
14
|
+
</div>
|
15
|
+
</div>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<div class="ir-container">
|
2
|
+
<%= image_tag 'isaca/rails/isaca-logo.png', height: 50 %>
|
3
|
+
<h1><%= Rails.application.class.parent_name %> Administrators</h1>
|
4
|
+
|
5
|
+
<div class="ir-container">
|
6
|
+
<h2>Create Administrator</h2>
|
7
|
+
|
8
|
+
<%= form_for :administrator, url: administrators_path do |f| %>
|
9
|
+
<div class="form-group">
|
10
|
+
<%= f.label :email %>
|
11
|
+
<%= f.text_field :email, autofocus: true %>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<%= f.submit 'Create Administrator' %>
|
15
|
+
<% end %>
|
16
|
+
</div>
|
17
|
+
</div>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<div class="ir-container">
|
2
|
+
<h1><%= @administrator.first_name %> <%= @administrator.last_name %></h1>
|
3
|
+
<p>
|
4
|
+
<strong>Actions: </strong>
|
5
|
+
<%= link_to 'List All Administrators', administrators_path %> |
|
6
|
+
<% if user_has_privilege?(current_isaca_user, :write_claims) %>
|
7
|
+
<%= link_to 'Edit Claims', edit_administrator_path(@administrator) %> |
|
8
|
+
<% end %>
|
9
|
+
<%= link_to 'Remove Administrator Privileges', administrator_path(@administrator), method: :delete, data: {confirm: t('isaca.rails.administrators.delete_confirmation')} %>
|
10
|
+
</p>
|
11
|
+
<p><strong>IMIS ID:</strong> <%= @administrator.imis_id %></p>
|
12
|
+
|
13
|
+
<p>
|
14
|
+
<strong>Claims:</strong>
|
15
|
+
<% if user_has_privilege?(current_isaca_user, :read_claims) %>
|
16
|
+
<% if @administrator.claims.any? %>
|
17
|
+
<ul>
|
18
|
+
<% @administrator.claims.each do |claim| %>
|
19
|
+
<li><%= claim.privilege %></li>
|
20
|
+
<% end %>
|
21
|
+
</ul>
|
22
|
+
<% else %>
|
23
|
+
No claims exist for this administrator.
|
24
|
+
<% end %>
|
25
|
+
<% else %>
|
26
|
+
You do not have the necessary privileges to view an administrator's claims.
|
27
|
+
<% end %>
|
28
|
+
</p>
|
29
|
+
</div>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<%= form_for @form_object, url: session_path do |f| %>
|
2
|
+
<%= isaca_form_errors(@form_object) if @form_object.errors.any? %>
|
3
|
+
|
4
|
+
<div class="form-group">
|
5
|
+
<%= f.label :username %>
|
6
|
+
<%= f.text_field :username, autofocus: true, class: 'ir-form-control' %>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="form-group">
|
10
|
+
<%= f.label :password %>
|
11
|
+
<%= f.password_field :password, class: 'ir-form-control' %>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<%= f.submit 'Sign In', class: 'ir-btn ir-btn-lg ir-btn-primary ir-form-control' %>
|
15
|
+
<% end %>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<% content_for :title, 'Sign In' %>
|
2
|
+
|
3
|
+
<div class="ir-login-container">
|
4
|
+
<main>
|
5
|
+
<div class="ir-brand">
|
6
|
+
<a href="/">
|
7
|
+
<%= image_tag 'isaca/rails/isaca-logo.png' %>
|
8
|
+
</a>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="ir-form-body">
|
12
|
+
<%= isaca_flash_messages %>
|
13
|
+
|
14
|
+
<% if user_signed_in? %>
|
15
|
+
<p>You are signed in as <%= current_isaca_user.first_name %> <%= current_isaca_user.last_name %>.</p>
|
16
|
+
|
17
|
+
<%= link_to t('isaca.rails.sessions.sign_out'), sign_out_path, method: :delete, data: {confirm: t('isaca.rails.sessions.sign_out_confirmation')} %>
|
18
|
+
<% else %>
|
19
|
+
<%= render 'isaca/rails/sessions/form' %>
|
20
|
+
|
21
|
+
<ul class="ir-shared-links">
|
22
|
+
<%= render 'isaca/rails/sessions/shared/links' %>
|
23
|
+
</ul>
|
24
|
+
<% end %>
|
25
|
+
</div>
|
26
|
+
</main>
|
27
|
+
<aside></aside>
|
28
|
+
</div>
|
@@ -0,0 +1,50 @@
|
|
1
|
+
<%= form_for @form_object, url: user_consent_path do |f| %>
|
2
|
+
<%= isaca_form_errors(@form_object) if @form_object.errors.any? %>
|
3
|
+
|
4
|
+
<div class="form-group" style="margin-bottom: 20px;">
|
5
|
+
<label for="agreements_privacy">
|
6
|
+
<%= f.check_box :privacy_policy %>
|
7
|
+
|
8
|
+
ISACA has changed their privacy notice, to access the revised notice and terms,
|
9
|
+
<a href="https://www.isaca.org/pages/Privacy.aspx" target="_blank">click here</a>.
|
10
|
+
|
11
|
+
By continuing to use the site you agree to the revised terms.
|
12
|
+
</label>
|
13
|
+
</div>
|
14
|
+
|
15
|
+
<div class="form-group">
|
16
|
+
<label for="agreements_marketing">
|
17
|
+
<% if Isaca::Request::ExplicitCountries.get.includes_country?(current_isaca_user.country) %>
|
18
|
+
<%= f.check_box :marketing_policy %>
|
19
|
+
<% else %>
|
20
|
+
<%= f.check_box :marketing_policy, checked: true %>
|
21
|
+
<% end %>
|
22
|
+
|
23
|
+
Yes! I would like to receive by post, e-mail and/or telephone marketing information from ISACA
|
24
|
+
and their affiliates about ISACA and their affiliates and their products and services, and other
|
25
|
+
information in which ISACA and their affiliates think I may be interested.
|
26
|
+
</label>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<p>
|
30
|
+
By pressing submit, I understand and agree that the information I have provided will be used as described
|
31
|
+
in the ISACA Privacy Policy. By pressing submit, I further agree to the website Terms, and confirm that
|
32
|
+
the information I have provided is my own.
|
33
|
+
</p>
|
34
|
+
|
35
|
+
<%= f.submit 'Save Preferences', class: 'ir-btn ir-btn-primary ir-btn-lg ir-form-control', disabled: true %>
|
36
|
+
<% end %>
|
37
|
+
|
38
|
+
<script type="text/javascript" charset="utf-8">
|
39
|
+
const form = document.getElementById('new_agreement');
|
40
|
+
const submit = form.getElementsByTagName('input')[6];
|
41
|
+
|
42
|
+
if (submit) {
|
43
|
+
submit.disabled = true;
|
44
|
+
}
|
45
|
+
|
46
|
+
const privacyCheckBox = document.getElementById('agreement_privacy_policy');
|
47
|
+
privacyCheckBox.addEventListener('change', (event) => {
|
48
|
+
submit.disabled = !event.target.checked;
|
49
|
+
});
|
50
|
+
</script>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<% content_for :title, 'Consent' %>
|
2
|
+
|
3
|
+
<div class="ir-consent-container">
|
4
|
+
<aside></aside>
|
5
|
+
<main>
|
6
|
+
<div class="ir-brand">
|
7
|
+
<a href="/">
|
8
|
+
<%= image_tag 'isaca/rails/isaca-logo.png' %>
|
9
|
+
</a>
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<div class="ir-form-body">
|
13
|
+
<%= isaca_flash_messages %>
|
14
|
+
|
15
|
+
<h3>Hi <%= current_isaca_user.first_name %>, </h3>
|
16
|
+
|
17
|
+
<p>WE HAVE UPDATED OUR PRIVACY AND COMMUNICATION PREFERENCES</p>
|
18
|
+
<%= render 'isaca/rails/users_consent/form' %>
|
19
|
+
</div>
|
20
|
+
</main>
|
21
|
+
</div>
|