morpho 0.1.0 → 0.1.1

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.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -1
  3. data/app/api/concerns/morpho/grape/http_responses.rb +41 -0
  4. data/app/api/concerns/morpho/grape/jwt_authentication.rb +77 -0
  5. data/app/api/concerns/morpho/grape/user_activation.rb +13 -0
  6. data/app/api/concerns/morpho/grape/user_password_reset.rb +13 -0
  7. data/app/api/concerns/morpho/grape/user_registration.rb +19 -0
  8. data/app/api/concerns/morpho/grape/user_unlock.rb +13 -0
  9. data/app/api/morpho/api.rb +24 -0
  10. data/app/api/morpho/entities/authentication_token.rb +8 -0
  11. data/app/api/morpho/entities/user.rb +7 -0
  12. data/app/api/morpho/entities/user_sign_in.rb +8 -0
  13. data/app/api/morpho/entities/user_sign_up.rb +9 -0
  14. data/app/api/morpho/resources/activations.rb +29 -0
  15. data/app/api/morpho/resources/passwords.rb +25 -0
  16. data/app/api/morpho/resources/tokens.rb +19 -0
  17. data/app/api/morpho/resources/unlocks.rb +29 -0
  18. data/app/api/morpho/resources/users.rb +19 -0
  19. data/app/assets/images/morpho/morpho.png +0 -0
  20. data/app/assets/images/morpho/morpho.svg +89 -0
  21. data/app/assets/stylesheets/morpho/application.css +74 -1
  22. data/app/controllers/morpho/activations_controller.rb +44 -0
  23. data/app/controllers/morpho/application_controller.rb +9 -0
  24. data/app/controllers/morpho/home_controller.rb +6 -0
  25. data/app/controllers/morpho/passwords_controller.rb +56 -0
  26. data/app/controllers/morpho/sessions_controller.rb +24 -0
  27. data/app/controllers/morpho/unlocks_controller.rb +44 -0
  28. data/app/controllers/morpho/users_controller.rb +25 -0
  29. data/app/mailers/morpho/application_mailer.rb +0 -1
  30. data/app/mailers/morpho/user_mailer.rb +31 -0
  31. data/app/models/morpho/authentication.rb +5 -0
  32. data/app/models/morpho/user.rb +60 -0
  33. data/app/views/layouts/morpho/application.html.erb +6 -4
  34. data/app/views/layouts/morpho/mailer.html.erb +13 -0
  35. data/app/views/layouts/morpho/mailer.text.erb +1 -0
  36. data/app/views/morpho/activations/new.html.erb +16 -0
  37. data/app/views/morpho/home/index.html.erb +4 -0
  38. data/app/views/morpho/passwords/edit.html.erb +18 -0
  39. data/app/views/morpho/passwords/new.html.erb +16 -0
  40. data/app/views/morpho/sessions/new.html.erb +23 -0
  41. data/app/views/morpho/unlocks/new.html.erb +16 -0
  42. data/app/views/morpho/user_mailer/activation_needed_email.html.erb +7 -0
  43. data/app/views/morpho/user_mailer/activation_needed_email.text.erb +7 -0
  44. data/app/views/morpho/user_mailer/activation_success_email.html.erb +7 -0
  45. data/app/views/morpho/user_mailer/activation_success_email.text.erb +7 -0
  46. data/app/views/morpho/user_mailer/reset_password_email.html.erb +7 -0
  47. data/app/views/morpho/user_mailer/reset_password_email.text.erb +7 -0
  48. data/app/views/morpho/user_mailer/unlock_token_email.html.erb +7 -0
  49. data/app/views/morpho/user_mailer/unlock_token_email.text.erb +7 -0
  50. data/app/views/morpho/users/new.html.erb +20 -0
  51. data/config/initializers/flash_rails_messages_skeleton.rb +22 -0
  52. data/config/initializers/simple_form.rb +182 -0
  53. data/config/initializers/sorcery.rb +513 -0
  54. data/config/locales/morpho.en.yml +93 -0
  55. data/config/routes.rb +25 -0
  56. data/db/migrate/20180919162009_sorcery_core.rb +13 -0
  57. data/db/migrate/20180919162055_sorcery_remember_me.rb +8 -0
  58. data/db/migrate/20180919162056_sorcery_reset_password.rb +10 -0
  59. data/db/migrate/20180919162057_sorcery_user_activation.rb +9 -0
  60. data/db/migrate/20180919162058_sorcery_brute_force_protection.rb +9 -0
  61. data/db/migrate/20180919162059_sorcery_activity_logging.rb +10 -0
  62. data/db/migrate/20180919162100_sorcery_external.rb +12 -0
  63. data/lib/generators/morpho/install/install_generator.rb +7 -0
  64. data/lib/generators/morpho/install/templates/config/initializers/morpho.rb +17 -0
  65. data/lib/generators/morpho/install/templates/public/favicon-16x16.png +0 -0
  66. data/lib/generators/morpho/install/templates/public/favicon-32x32.png +0 -0
  67. data/lib/generators/morpho/install/templates/public/favicon.ico +0 -0
  68. data/lib/morpho.rb +15 -2
  69. data/lib/morpho/configuration.rb +24 -0
  70. data/lib/morpho/configurations/api.rb +31 -0
  71. data/lib/morpho/configurations/auth.rb +11 -0
  72. data/lib/morpho/configurations/jwt.rb +17 -0
  73. data/lib/morpho/configurations/mailer.rb +23 -0
  74. data/lib/morpho/engine.rb +33 -0
  75. data/lib/morpho/loader.rb +11 -0
  76. data/lib/morpho/version.rb +1 -1
  77. data/lib/tasks/morpho_tasks.rake +1 -1
  78. data/lib/templates/erb/scaffold/_form.html.erb +15 -0
  79. metadata +223 -2
@@ -0,0 +1 @@
1
+ <%= yield %>
@@ -0,0 +1,16 @@
1
+ <div class="activation-form">
2
+ <%= simple_form_for :user, url: send_activation_path do |f| %>
3
+ <%= f.input :email, required: true, placeholder: 'johndoe@example.com', input_html: { class: 'u-full-width' } %>
4
+
5
+ <%= f.submit t('morpho.labels.activations.send_instructions'), class: 'button-primary u-full-width' %>
6
+
7
+ <ul class="unstyled">
8
+ <li>
9
+ <%= link_to t('morpho.labels.activations.sign_in'), sign_in_path %>
10
+ </li>
11
+ <li>
12
+ <%= link_to t('morpho.labels.activations.sign_up'), sign_up_path %>
13
+ </li>
14
+ </ul>
15
+ <% end %>
16
+ </div>
@@ -0,0 +1,4 @@
1
+ <% if logged_in? %>
2
+ <h3>Hello <strong><%= current_user.email %></strong>, welcome to this website!</h3>
3
+ <p>If you want to sign out, click <strong><%= link_to 'here', sign_out_path, method: :delete %></strong>.</p>
4
+ <% end %>
@@ -0,0 +1,18 @@
1
+ <div class="sign-up-form">
2
+ <%= simple_form_for user, url: change_password_path(token: params[:token]), method: :put do |f| %>
3
+ <%= f.input :password, required: true, placeholder: '************', input_html: { class: 'u-full-width' } %>
4
+
5
+ <%= f.input :password_confirmation, required: true, placeholder: '************', input_html: { class: 'u-full-width' } %>
6
+
7
+ <%= f.submit t('morpho.labels.passwords.change_password'), class: 'button-primary u-full-width' %>
8
+
9
+ <ul class="unstyled">
10
+ <li>
11
+ <%= link_to t('morpho.labels.passwords.sign_in'), sign_in_path %>
12
+ </li>
13
+ <li>
14
+ <%= link_to t('morpho.labels.passwords.sign_up'), sign_up_path %>
15
+ </li>
16
+ </ul>
17
+ <% end %>
18
+ </div>
@@ -0,0 +1,16 @@
1
+ <div class="reset-password-form">
2
+ <%= simple_form_for :user, url: send_reset_password_path do |f| %>
3
+ <%= f.input :email, required: true, placeholder: 'johndoe@example.com', input_html: { class: 'u-full-width' } %>
4
+
5
+ <%= f.submit t('morpho.labels.passwords.send_instructions'), class: 'button-primary u-full-width' %>
6
+
7
+ <ul class="unstyled">
8
+ <li>
9
+ <%= link_to t('morpho.labels.passwords.sign_in'), sign_in_path %>
10
+ </li>
11
+ <li>
12
+ <%= link_to t('morpho.labels.passwords.sign_up'), sign_up_path %>
13
+ </li>
14
+ </ul>
15
+ <% end %>
16
+ </div>
@@ -0,0 +1,23 @@
1
+ <div class="sign-in-form">
2
+ <%= simple_form_for :session, url: sign_in_path do |f| %>
3
+ <%= f.input :email, required: true, placeholder: 'johndoe@example.com', input_html: { class: 'u-full-width' } %>
4
+
5
+ <%= f.input :password, required: true, placeholder: '************', input_html: { class: 'u-full-width' } %>
6
+
7
+ <%= f.input :remember_me, as: :boolean %>
8
+
9
+ <%= f.submit t('morpho.labels.sessions.sign_in'), class: 'button-primary u-full-width' %>
10
+
11
+ <ul class="unstyled">
12
+ <li>
13
+ <%= link_to t('morpho.labels.sessions.sign_up'), sign_up_path %>
14
+ </li>
15
+ <li>
16
+ <%= link_to t('morpho.labels.sessions.password_reset'), new_reset_password_path %>
17
+ </li>
18
+ <li>
19
+ <%= link_to t('morpho.labels.sessions.unlock'), new_unlock_path %>
20
+ </li>
21
+ </ul>
22
+ <% end %>
23
+ </div>
@@ -0,0 +1,16 @@
1
+ <div class="unlock-form">
2
+ <%= simple_form_for :user, url: send_unlock_path do |f| %>
3
+ <%= f.input :email, required: true, placeholder: 'johndoe@example.com', input_html: { class: 'u-full-width' } %>
4
+
5
+ <%= f.submit t('morpho.labels.unlocks.send_instructions'), class: 'button-primary u-full-width' %>
6
+
7
+ <ul class="unstyled">
8
+ <li>
9
+ <%= link_to t('morpho.labels.unlocks.sign_in'), sign_in_path %>
10
+ </li>
11
+ <li>
12
+ <%= link_to t('morpho.labels.unlocks.sign_up'), sign_up_path %>
13
+ </li>
14
+ </ul>
15
+ <% end %>
16
+ </div>
@@ -0,0 +1,7 @@
1
+ <p>Welcome <%= @user.email %>,</p>
2
+
3
+ <p>You have successfully signed up, you're just a step behind to finish.</p>
4
+
5
+ <p>To verify your user email address and activate your user account, just follow this <a href=" <%= @url %>">link</a>.</p>
6
+
7
+ <p>Thanks for joining and have a great day!</p>
@@ -0,0 +1,7 @@
1
+ Welcome <%= @user.email %>,
2
+
3
+ You have successfully signed up, you're just a step behind to finish.
4
+
5
+ To verify your user email address and activate your user account, just follow this link: <%= @url %>.
6
+
7
+ Thanks for joining and have a great day!
@@ -0,0 +1,7 @@
1
+ <p>Congratulations, <%= @user.email %>!</p>
2
+
3
+ <p>You have successfully activated your user account.</p>
4
+
5
+ <p>To login to the site, just follow this link: <%= @url %>.</p>
6
+
7
+ <p>Thanks for joining and have a great day!</p>
@@ -0,0 +1,7 @@
1
+ Congratulations, <%= @user.email %>!
2
+
3
+ You have successfully activated your user account.
4
+
5
+ To login to the site, just follow this link: <%= @url %>.
6
+
7
+ Thanks for joining and have a great day!
@@ -0,0 +1,7 @@
1
+ <p>Hello <%= @user.email %>,</p>
2
+
3
+ <p>You have requested to reset your password.</p>
4
+
5
+ <p>To choose a new password, just follow this <a href=" <%= @url %>">link</a>.</p>
6
+
7
+ <p>Have a great day!</p>
@@ -0,0 +1,7 @@
1
+ Hello <%= @user.email %>,
2
+
3
+ You have requested to reset your password.
4
+
5
+ To choose a new password, just follow this link: <%= @url %>.
6
+
7
+ Have a great day!
@@ -0,0 +1,7 @@
1
+ <p>Hello <%= @user.email %>,</p>
2
+
3
+ <p>Your account has been locked due to failed login attempts activity.</p>
4
+
5
+ <p>To unlock your account now, just follow this <a href=" <%= @url %>">link</a>. Anyway it will be automatically unlocked in an hour.</p>
6
+
7
+ <p>Have a great day!</p>
@@ -0,0 +1,7 @@
1
+ Hello <%= @user.email %>,
2
+
3
+ Your account has been locked due to failed login attempts activity.
4
+
5
+ To unlock your account now, just follow this link: <%= @url %>. Anyway it will be automatically unlocked in an hour.
6
+
7
+ Have a great day!
@@ -0,0 +1,20 @@
1
+ <div class="sign-up-form">
2
+ <%= simple_form_for user, url: sign_up_path do |f| %>
3
+ <%= f.input :email, required: true, placeholder: 'johndoe@example.com', input_html: { class: 'u-full-width' } %>
4
+
5
+ <%= f.input :password, required: true, placeholder: '************', input_html: { class: 'u-full-width' } %>
6
+
7
+ <%= f.input :password_confirmation, required: true, placeholder: '************', input_html: { class: 'u-full-width' } %>
8
+
9
+ <%= f.submit t('morpho.labels.users.sign_up'), class: 'button-primary u-full-width' %>
10
+
11
+ <ul class="unstyled">
12
+ <li>
13
+ <%= link_to t('morpho.labels.users.sign_in'), sign_in_path %>
14
+ </li>
15
+ <li>
16
+ <%= link_to t('morpho.labels.users.activation'), new_activation_path %>
17
+ </li>
18
+ </ul>
19
+ <% end %>
20
+ </div>
@@ -0,0 +1,22 @@
1
+ module FlashRailsMessages
2
+ class Base
3
+ def alert_element(type, message)
4
+ content_tag :div, class: alert_classes(type) do
5
+ message.html_safe
6
+ end
7
+ end
8
+
9
+ def default_alert_class
10
+ 'alert'
11
+ end
12
+
13
+ def alert_type_classes
14
+ {
15
+ success: 'alert-success',
16
+ notice: 'alert-info',
17
+ alert: 'alert-warning',
18
+ error: 'alert-error',
19
+ }
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,182 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Uncomment this and change the path if necessary to include your own
4
+ # components.
5
+ # See https://github.com/plataformatec/simple_form#custom-components to know
6
+ # more about custom components.
7
+ # Dir[Rails.root.join('lib/components/**/*.rb')].each { |f| require f }
8
+ #
9
+ # Use this setup block to configure all options available in SimpleForm.
10
+ SimpleForm.setup do |config|
11
+ # Wrappers are used by the form builder to generate a
12
+ # complete input. You can remove any component from the
13
+ # wrapper, change the order or even add your own to the
14
+ # stack. The options given below are used to wrap the
15
+ # whole input.
16
+ config.wrappers :default, class: :input,
17
+ hint_class: :field_with_hint, error_class: :field_with_errors, valid_class: :field_without_errors do |b|
18
+ ## Extensions enabled by default
19
+ # Any of these extensions can be disabled for a
20
+ # given input by passing: `f.input EXTENSION_NAME => false`.
21
+ # You can make any of these extensions optional by
22
+ # renaming `b.use` to `b.optional`.
23
+
24
+ # Determines whether to use HTML5 (:email, :url, ...)
25
+ # and required attributes
26
+ b.use :html5
27
+
28
+ # Calculates placeholders automatically from I18n
29
+ # You can also pass a string as f.input placeholder: "Placeholder"
30
+ b.use :placeholder
31
+
32
+ ## Optional extensions
33
+ # They are disabled unless you pass `f.input EXTENSION_NAME => true`
34
+ # to the input. If so, they will retrieve the values from the model
35
+ # if any exists. If you want to enable any of those
36
+ # extensions by default, you can change `b.optional` to `b.use`.
37
+
38
+ # Calculates maxlength from length validations for string inputs
39
+ # and/or database column lengths
40
+ b.optional :maxlength
41
+
42
+ # Calculate minlength from length validations for string inputs
43
+ b.optional :minlength
44
+
45
+ # Calculates pattern from format validations for string inputs
46
+ b.optional :pattern
47
+
48
+ # Calculates min and max from length validations for numeric inputs
49
+ b.optional :min_max
50
+
51
+ # Calculates readonly automatically from readonly attributes
52
+ b.optional :readonly
53
+
54
+ ## Inputs
55
+ # b.use :input, class: 'input', error_class: 'is-invalid', valid_class: 'is-valid'
56
+ b.use :label_input
57
+ b.use :hint, wrap_with: { tag: :span, class: :hint }
58
+ b.use :error, wrap_with: { tag: :span, class: :error }
59
+
60
+ ## full_messages_for
61
+ # If you want to display the full error message for the attribute, you can
62
+ # use the component :full_error, like:
63
+ #
64
+ # b.use :full_error, wrap_with: { tag: :span, class: :error }
65
+ end
66
+
67
+ # The default wrapper to be used by the FormBuilder.
68
+ config.default_wrapper = :default
69
+
70
+ # Define the way to render check boxes / radio buttons with labels.
71
+ # Defaults to :nested for bootstrap config.
72
+ # inline: input + label
73
+ # nested: label > input
74
+ config.boolean_style = :inline
75
+
76
+ # Default class for buttons
77
+ config.button_class = 'btn'
78
+
79
+ # Method used to tidy up errors. Specify any Rails Array method.
80
+ # :first lists the first message for each field.
81
+ # Use :to_sentence to list all errors for each field.
82
+ # config.error_method = :first
83
+
84
+ # Default tag used for error notification helper.
85
+ config.error_notification_tag = :div
86
+
87
+ # CSS class to add for error notification helper.
88
+ config.error_notification_class = 'error_notification'
89
+
90
+ # ID to add for error notification helper.
91
+ # config.error_notification_id = nil
92
+
93
+ # Series of attempts to detect a default label method for collection.
94
+ # config.collection_label_methods = [ :to_label, :name, :title, :to_s ]
95
+
96
+ # Series of attempts to detect a default value method for collection.
97
+ # config.collection_value_methods = [ :id, :to_s ]
98
+
99
+ # You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none.
100
+ # config.collection_wrapper_tag = nil
101
+
102
+ # You can define the class to use on all collection wrappers. Defaulting to none.
103
+ # config.collection_wrapper_class = nil
104
+
105
+ # You can wrap each item in a collection of radio/check boxes with a tag,
106
+ # defaulting to :span.
107
+ # config.item_wrapper_tag = :span
108
+
109
+ # You can define a class to use in all item wrappers. Defaulting to none.
110
+ # config.item_wrapper_class = nil
111
+
112
+ # How the label text should be generated altogether with the required text.
113
+ # config.label_text = lambda { |label, required, explicit_label| "#{required} #{label}" }
114
+
115
+ # You can define the class to use on all labels. Default is nil.
116
+ # config.label_class = nil
117
+
118
+ # You can define the default class to be used on forms. Can be overriden
119
+ # with `html: { :class }`. Defaulting to none.
120
+ # config.default_form_class = nil
121
+
122
+ # You can define which elements should obtain additional classes
123
+ # config.generate_additional_classes_for = [:wrapper, :label, :input]
124
+
125
+ # Whether attributes are required by default (or not). Default is true.
126
+ # config.required_by_default = true
127
+
128
+ # Tell browsers whether to use the native HTML5 validations (novalidate form option).
129
+ # These validations are enabled in SimpleForm's internal config but disabled by default
130
+ # in this configuration, which is recommended due to some quirks from different browsers.
131
+ # To stop SimpleForm from generating the novalidate option, enabling the HTML5 validations,
132
+ # change this configuration to true.
133
+ config.browser_validations = false
134
+
135
+ # Collection of methods to detect if a file type was given.
136
+ # config.file_methods = [ :mounted_as, :file?, :public_filename, :attached? ]
137
+
138
+ # Custom mappings for input types. This should be a hash containing a regexp
139
+ # to match as key, and the input type that will be used when the field name
140
+ # matches the regexp as value.
141
+ # config.input_mappings = { /count/ => :integer }
142
+
143
+ # Custom wrappers for input types. This should be a hash containing an input
144
+ # type as key and the wrapper that will be used for all inputs with specified type.
145
+ # config.wrapper_mappings = { string: :prepend }
146
+
147
+ # Namespaces where SimpleForm should look for custom input classes that
148
+ # override default inputs.
149
+ # config.custom_inputs_namespaces << "CustomInputs"
150
+
151
+ # Default priority for time_zone inputs.
152
+ # config.time_zone_priority = nil
153
+
154
+ # Default priority for country inputs.
155
+ # config.country_priority = nil
156
+
157
+ # When false, do not use translations for labels.
158
+ # config.translate_labels = true
159
+
160
+ # Automatically discover new inputs in Rails' autoload path.
161
+ # config.inputs_discovery = true
162
+
163
+ # Cache SimpleForm inputs discovery
164
+ # config.cache_discovery = !Rails.env.development?
165
+
166
+ # Default class for inputs
167
+ # config.input_class = nil
168
+
169
+ # Define the default class of the input wrapper of the boolean input.
170
+ config.boolean_label_class = 'checkbox'
171
+
172
+ # Defines if the default input wrapper class should be included in radio
173
+ # collection wrappers.
174
+ # config.include_default_input_wrapper_class = true
175
+
176
+ # Defines which i18n scope will be used in Simple Form.
177
+ # config.i18n_scope = 'simple_form'
178
+
179
+ # Defines validation classes to the input_field. By default it's nil.
180
+ # config.input_field_valid_class = 'is-valid'
181
+ # config.input_field_error_class = 'is-invalid'
182
+ end
@@ -0,0 +1,513 @@
1
+ # The first thing you need to configure is which modules you need in your app.
2
+ # The default is nothing which will include only core features (password encryption, login/logout).
3
+ # Available submodules are: :user_activation, :http_basic_auth, :remember_me,
4
+ # :reset_password, :session_timeout, :brute_force_protection, :activity_logging, :external
5
+ Rails.application.config.sorcery.submodules = [:remember_me, :reset_password, :user_activation, :session_timeout, :brute_force_protection, :activity_logging, :external]
6
+
7
+ # Here you can configure each submodule's features.
8
+ Rails.application.config.sorcery.configure do |config|
9
+ # -- core --
10
+ # What controller action to call for non-authenticated users. You can also
11
+ # override the 'not_authenticated' method of course.
12
+ # Default: `:not_authenticated`
13
+ #
14
+ # config.not_authenticated_action =
15
+
16
+ # When a non logged in user tries to enter a page that requires login, save
17
+ # the URL he wanted to reach, and send him there after login, using 'redirect_back_or_to'.
18
+ # Default: `true`
19
+ #
20
+ # config.save_return_to_url =
21
+
22
+ # Set domain option for cookies; Useful for remember_me submodule.
23
+ # Default: `nil`
24
+ #
25
+ # config.cookie_domain =
26
+
27
+ # Allow the remember_me cookie to be set through AJAX
28
+ # Default: `true`
29
+ #
30
+ # config.remember_me_httponly =
31
+
32
+ # Set token randomness. (e.g. user activation tokens)
33
+ # The length of the result string is about 4/3 of `token_randomness`.
34
+ # Default: `15`
35
+ #
36
+ # config.token_randomness =
37
+
38
+ # -- session timeout --
39
+ # How long in seconds to keep the session alive.
40
+ # Default: `3600`
41
+ #
42
+ # config.session_timeout =
43
+
44
+ # Use the last action as the beginning of session timeout.
45
+ # Default: `false`
46
+ #
47
+ # config.session_timeout_from_last_action =
48
+
49
+ # -- http_basic_auth --
50
+ # What realm to display for which controller name. For example {"My App" => "Application"}
51
+ # Default: `{"application" => "Application"}`
52
+ #
53
+ # config.controller_to_realm_map =
54
+
55
+ # -- activity logging --
56
+ # will register the time of last user login, every login.
57
+ # Default: `true`
58
+ #
59
+ # config.register_login_time =
60
+
61
+ # will register the time of last user logout, every logout.
62
+ # Default: `true`
63
+ #
64
+ # config.register_logout_time =
65
+
66
+ # will register the time of last user action, every action.
67
+ # Default: `true`
68
+ #
69
+ # config.register_last_activity_time =
70
+
71
+ # -- external --
72
+ # What providers are supported by this app, i.e. [:twitter, :facebook, :github, :linkedin, :xing, :google, :liveid, :salesforce, :slack] .
73
+ # Default: `[]`
74
+ #
75
+ # config.external_providers =
76
+
77
+ # You can change it by your local ca_file. i.e. '/etc/pki/tls/certs/ca-bundle.crt'
78
+ # Path to ca_file. By default use a internal ca-bundle.crt.
79
+ # Default: `'path/to/ca_file'`
80
+ #
81
+ # config.ca_file =
82
+
83
+ # For information about LinkedIn API:
84
+ # - user info fields go to https://developer.linkedin.com/documents/profile-fields
85
+ # - access permissions go to https://developer.linkedin.com/documents/authentication#granting
86
+ #
87
+ # config.linkedin.key = ""
88
+ # config.linkedin.secret = ""
89
+ # config.linkedin.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=linkedin"
90
+ # config.linkedin.user_info_fields = ['first-name', 'last-name']
91
+ # config.linkedin.user_info_mapping = {first_name: "firstName", last_name: "lastName"}
92
+ # config.linkedin.access_permissions = ['r_basicprofile']
93
+ #
94
+ #
95
+ # For information about XING API:
96
+ # - user info fields go to https://dev.xing.com/docs/get/users/me
97
+ #
98
+ # config.xing.key = ""
99
+ # config.xing.secret = ""
100
+ # config.xing.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=xing"
101
+ # config.xing.user_info_mapping = {first_name: "first_name", last_name: "last_name"}
102
+ #
103
+ #
104
+ # Twitter will not accept any requests nor redirect uri containing localhost,
105
+ # make sure you use 0.0.0.0:3000 to access your app in development
106
+ #
107
+ # config.twitter.key = ""
108
+ # config.twitter.secret = ""
109
+ # config.twitter.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=twitter"
110
+ # config.twitter.user_info_mapping = {:email => "screen_name"}
111
+ #
112
+ # config.facebook.key = ""
113
+ # config.facebook.secret = ""
114
+ # config.facebook.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=facebook"
115
+ # config.facebook.user_info_path = "me?fields=email"
116
+ # config.facebook.user_info_mapping = {:email => "email"}
117
+ # config.facebook.access_permissions = ["email", "publish_actions"]
118
+ # config.facebook.display = "page"
119
+ # config.facebook.api_version = "v2.3"
120
+ # config.facebook.parse = :json
121
+ #
122
+ # config.github.key = ""
123
+ # config.github.secret = ""
124
+ # config.github.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=github"
125
+ # config.github.user_info_mapping = {:email => "name"}
126
+ # config.github.scope = ""
127
+ #
128
+ # config.paypal.key = ""
129
+ # config.paypal.secret = ""
130
+ # config.paypal.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=paypal"
131
+ # config.paypal.user_info_mapping = {:email => "email"}
132
+ #
133
+ # config.wechat.key = ""
134
+ # config.wechat.secret = ""
135
+ # config.wechat.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=wechat"
136
+ #
137
+ # config.google.key = ""
138
+ # config.google.secret = ""
139
+ # config.google.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=google"
140
+ # config.google.user_info_mapping = {:email => "email", :username => "name"}
141
+ # config.google.scope = "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"
142
+ #
143
+ # For Microsoft Graph, the key will be your App ID, and the secret will be your app password/public key.
144
+ # The callback URL "can't contain a query string or invalid special characters", see: https://docs.microsoft.com/en-us/azure/active-directory/active-directory-v2-limitations#restrictions-on-redirect-uris
145
+ # More information at https://graph.microsoft.io/en-us/docs
146
+ #
147
+ # config.microsoft.key = ""
148
+ # config.microsoft.secret = ""
149
+ # config.microsoft.callback_url = "http://0.0.0.0:3000/oauth/callback/microsoft"
150
+ # config.microsoft.user_info_mapping = {:email => "userPrincipalName", :username => "displayName"}
151
+ # config.microsoft.scope = "openid email https://graph.microsoft.com/User.Read"
152
+ #
153
+ # config.vk.key = ""
154
+ # config.vk.secret = ""
155
+ # config.vk.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=vk"
156
+ # config.vk.user_info_mapping = {:login => "domain", :name => "full_name"}
157
+ # config.vk.api_version = "5.71"
158
+ #
159
+ # config.slack.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=slack"
160
+ # config.slack.key = ''
161
+ # config.slack.secret = ''
162
+ # config.slack.user_info_mapping = {email: 'email'}
163
+ #
164
+ # To use liveid in development mode you have to replace mydomain.com with
165
+ # a valid domain even in development. To use a valid domain in development
166
+ # simply add your domain in your /etc/hosts file in front of 127.0.0.1
167
+ #
168
+ # config.liveid.key = ""
169
+ # config.liveid.secret = ""
170
+ # config.liveid.callback_url = "http://mydomain.com:3000/oauth/callback?provider=liveid"
171
+ # config.liveid.user_info_mapping = {:username => "name"}
172
+
173
+ # For information about JIRA API:
174
+ # https://developer.atlassian.com/display/JIRADEV/JIRA+REST+API+Example+-+OAuth+authentication
175
+ # to obtain the consumer key and the public key you can use the jira-ruby gem https://github.com/sumoheavy/jira-ruby
176
+ # or run openssl req -x509 -nodes -newkey rsa:1024 -sha1 -keyout rsakey.pem -out rsacert.pem to obtain the public key
177
+ # Make sure you have configured the application link properly
178
+
179
+ # config.jira.key = "1234567"
180
+ # config.jira.secret = "jiraTest"
181
+ # config.jira.site = "http://localhost:2990/jira/plugins/servlet/oauth"
182
+ # config.jira.signature_method = "RSA-SHA1"
183
+ # config.jira.private_key_file = "rsakey.pem"
184
+
185
+ # For information about Salesforce API:
186
+ # https://developer.salesforce.com/signup &
187
+ # https://www.salesforce.com/us/developer/docs/api_rest/
188
+ # Salesforce callback_url must be https. You can run the following to generate self-signed ssl cert
189
+ # openssl req -new -newkey rsa:2048 -sha1 -days 365 -nodes -x509 -keyout server.key -out server.crt
190
+ # Make sure you have configured the application link properly
191
+ # config.salesforce.key = '123123'
192
+ # config.salesforce.secret = 'acb123'
193
+ # config.salesforce.callback_url = "https://127.0.0.1:9292/oauth/callback?provider=salesforce"
194
+ # config.salesforce.scope = "full"
195
+ # config.salesforce.user_info_mapping = {:email => "email"}
196
+
197
+ # --- user config ---
198
+ config.user_config do |user|
199
+ # -- core --
200
+ # specify username attributes, for example: [:username, :email].
201
+ # Default: `[:email]`
202
+ #
203
+ # user.username_attribute_names =
204
+
205
+ # change *virtual* password attribute, the one which is used until an encrypted one is generated.
206
+ # Default: `:password`
207
+ #
208
+ # user.password_attribute_name =
209
+
210
+ # downcase the username before trying to authenticate, default is false
211
+ # Default: `false`
212
+ #
213
+ # user.downcase_username_before_authenticating =
214
+
215
+ # change default email attribute.
216
+ # Default: `:email`
217
+ #
218
+ # user.email_attribute_name =
219
+
220
+ # change default crypted_password attribute.
221
+ # Default: `:crypted_password`
222
+ #
223
+ # user.crypted_password_attribute_name =
224
+
225
+ # what pattern to use to join the password with the salt
226
+ # Default: `""`
227
+ #
228
+ # user.salt_join_token =
229
+
230
+ # change default salt attribute.
231
+ # Default: `:salt`
232
+ #
233
+ # user.salt_attribute_name =
234
+
235
+ # how many times to apply encryption to the password.
236
+ # Default: 1 in test env, `nil` otherwise
237
+ #
238
+ user.stretches = 1 if Rails.env.test?
239
+
240
+ # encryption key used to encrypt reversible encryptions such as AES256.
241
+ # WARNING: If used for users' passwords, changing this key will leave passwords undecryptable!
242
+ # Default: `nil`
243
+ #
244
+ # user.encryption_key =
245
+
246
+ # use an external encryption class.
247
+ # Default: `nil`
248
+ #
249
+ # user.custom_encryption_provider =
250
+
251
+ # encryption algorithm name. See 'encryption_algorithm=' for available options.
252
+ # Default: `:bcrypt`
253
+ #
254
+ # user.encryption_algorithm =
255
+
256
+ # make this configuration inheritable for subclasses. Useful for ActiveRecord's STI.
257
+ # Default: `false`
258
+ #
259
+ # user.subclasses_inherit_config =
260
+
261
+ # -- remember_me --
262
+ # How long in seconds the session length will be
263
+ # Default: `604800`
264
+ #
265
+ # user.remember_me_for =
266
+
267
+ # when true sorcery will persist a single remember me token for all
268
+ # logins/logouts (supporting remembering on multiple browsers simultaneously).
269
+ # Default: false
270
+ #
271
+ # user.remember_me_token_persist_globally =
272
+
273
+ # -- user_activation --
274
+ # the attribute name to hold activation state (active/pending).
275
+ # Default: `:activation_state`
276
+ #
277
+ # user.activation_state_attribute_name =
278
+
279
+ # the attribute name to hold activation code (sent by email).
280
+ # Default: `:activation_token`
281
+ #
282
+ # user.activation_token_attribute_name =
283
+
284
+ # the attribute name to hold activation code expiration date.
285
+ # Default: `:activation_token_expires_at`
286
+ #
287
+ # user.activation_token_expires_at_attribute_name =
288
+
289
+ # how many seconds before the activation code expires. nil for never expires.
290
+ # Default: `nil`
291
+ #
292
+ # user.activation_token_expiration_period =
293
+
294
+ # your mailer class. Required.
295
+ # Default: `nil`
296
+ #
297
+ user.user_activation_mailer = Morpho::UserMailer
298
+
299
+ # when true sorcery will not automatically
300
+ # email activation details and allow you to
301
+ # manually handle how and when email is sent.
302
+ # Default: `false`
303
+ #
304
+ # user.activation_mailer_disabled =
305
+
306
+ # method to send email related
307
+ # options: `:deliver_later`, `:deliver_now`, `:deliver`
308
+ # Default: :deliver (Rails version < 4.2) or :deliver_now (Rails version 4.2+)
309
+ #
310
+ # user.email_delivery_method =
311
+
312
+ # activation needed email method on your mailer class.
313
+ # Default: `:activation_needed_email`
314
+ #
315
+ # user.activation_needed_email_method_name =
316
+
317
+ # activation success email method on your mailer class.
318
+ # Default: `:activation_success_email`
319
+ #
320
+ # user.activation_success_email_method_name =
321
+
322
+ # do you want to prevent or allow users that did not activate by email to login?
323
+ # Default: `true`
324
+ #
325
+ # user.prevent_non_active_users_to_login =
326
+
327
+ # -- reset_password --
328
+ # reset password code attribute name.
329
+ # Default: `:reset_password_token`
330
+ #
331
+ # user.reset_password_token_attribute_name =
332
+
333
+ # expires at attribute name.
334
+ # Default: `:reset_password_token_expires_at`
335
+ #
336
+ # user.reset_password_token_expires_at_attribute_name =
337
+
338
+ # when was email sent, used for hammering protection.
339
+ # Default: `:reset_password_email_sent_at`
340
+ #
341
+ # user.reset_password_email_sent_at_attribute_name =
342
+
343
+ # mailer class. Needed.
344
+ # Default: `nil`
345
+ #
346
+ user.reset_password_mailer = Morpho::UserMailer
347
+
348
+ # reset password email method on your mailer class.
349
+ # Default: `:reset_password_email`
350
+ #
351
+ # user.reset_password_email_method_name =
352
+
353
+ # when true sorcery will not automatically
354
+ # email password reset details and allow you to
355
+ # manually handle how and when email is sent
356
+ # Default: `false`
357
+ #
358
+ # user.reset_password_mailer_disabled =
359
+
360
+ # how many seconds before the reset request expires. nil for never expires.
361
+ # Default: `nil`
362
+ #
363
+ # user.reset_password_expiration_period =
364
+
365
+ # hammering protection, how long in seconds to wait before allowing another email to be sent.
366
+ # Default: `5 * 60`
367
+ #
368
+ # user.reset_password_time_between_emails =
369
+
370
+ # access counter to a reset password page attribute name
371
+ # Default: `:access_count_to_reset_password_page`
372
+ #
373
+ # user.reset_password_page_access_count_attribute_name =
374
+
375
+ # -- magic_login --
376
+ # magic login code attribute name.
377
+ # Default: `:magic_login_token`
378
+ #
379
+ # user.magic_login_token_attribute_name =
380
+
381
+
382
+ # expires at attribute name.
383
+ # Default: `:magic_login_token_expires_at`
384
+ #
385
+ # user.magic_login_token_expires_at_attribute_name =
386
+
387
+
388
+ # when was email sent, used for hammering protection.
389
+ # Default: `:magic_login_email_sent_at`
390
+ #
391
+ # user.magic_login_email_sent_at_attribute_name =
392
+
393
+
394
+ # mailer class. Needed.
395
+ # Default: `nil`
396
+ #
397
+ # user.magic_login_mailer_class =
398
+
399
+
400
+ # magic login email method on your mailer class.
401
+ # Default: `:magic_login_email`
402
+ #
403
+ # user.magic_login_email_method_name =
404
+
405
+
406
+ # when true sorcery will not automatically
407
+ # email magic login details and allow you to
408
+ # manually handle how and when email is sent
409
+ # Default: `true`
410
+ #
411
+ # user.magic_login_mailer_disabled =
412
+
413
+
414
+ # how many seconds before the request expires. nil for never expires.
415
+ # Default: `nil`
416
+ #
417
+ # user.magic_login_expiration_period =
418
+
419
+
420
+ # hammering protection, how long in seconds to wait before allowing another email to be sent.
421
+ # Default: `5 * 60`
422
+ #
423
+ # user.magic_login_time_between_emails =
424
+
425
+ # -- brute_force_protection --
426
+ # Failed logins attribute name.
427
+ # Default: `:failed_logins_count`
428
+ #
429
+ # user.failed_logins_count_attribute_name =
430
+
431
+ # This field indicates whether user is banned and when it will be active again.
432
+ # Default: `:lock_expires_at`
433
+ #
434
+ # user.lock_expires_at_attribute_name =
435
+
436
+ # How many failed logins allowed.
437
+ # Default: `50`
438
+ #
439
+ user.consecutive_login_retries_amount_limit = Morpho.config.auth.failed_login_attempts_limit
440
+
441
+ # How long the user should be banned. in seconds. 0 for permanent.
442
+ # Default: `60 * 60`
443
+ #
444
+ # user.login_lock_time_period =
445
+
446
+ # Unlock token attribute name
447
+ # Default: `:unlock_token`
448
+ #
449
+ # user.unlock_token_attribute_name =
450
+
451
+ # Unlock token mailer method
452
+ # Default: `:send_unlock_token_email`
453
+ #
454
+ user.unlock_token_email_method_name = :unlock_token_email
455
+
456
+ # when true sorcery will not automatically
457
+ # send email with unlock token
458
+ # Default: `false`
459
+ #
460
+ # user.unlock_token_mailer_disabled = true
461
+
462
+ # Unlock token mailer class
463
+ # Default: `nil`
464
+ #
465
+ user.unlock_token_mailer = Morpho::UserMailer
466
+
467
+ # -- activity logging --
468
+ # Last login attribute name.
469
+ # Default: `:last_login_at`
470
+ #
471
+ # user.last_login_at_attribute_name =
472
+
473
+ # Last logout attribute name.
474
+ # Default: `:last_logout_at`
475
+ #
476
+ # user.last_logout_at_attribute_name =
477
+
478
+ # Last activity attribute name.
479
+ # Default: `:last_activity_at`
480
+ #
481
+ # user.last_activity_at_attribute_name =
482
+
483
+ # How long since last activity is the user defined logged out?
484
+ # Default: `10 * 60`
485
+ #
486
+ # user.activity_timeout =
487
+
488
+ # -- external --
489
+ # Class which holds the various external provider data for this user.
490
+ # Default: `nil`
491
+ #
492
+ user.authentications_class = Morpho::Authentication
493
+
494
+ # User's identifier in authentications class.
495
+ # Default: `:user_id`
496
+ #
497
+ # user.authentications_user_id_attribute_name =
498
+
499
+ # Provider's identifier in authentications class.
500
+ # Default: `:provider`
501
+ #
502
+ # user.provider_attribute_name =
503
+
504
+ # User's external unique identifier in authentications class.
505
+ # Default: `:uid`
506
+ #
507
+ # user.provider_uid_attribute_name =
508
+ end
509
+
510
+ # This line must come after the 'user config' block.
511
+ # Define which model authenticates with sorcery.
512
+ config.user_class = Morpho::User
513
+ end