hello-rails 0.0.0 → 0.5.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.
- checksums.yaml +4 -4
- data/MIT-LICENSE +20 -0
- data/README.md +97 -0
- data/Rakefile +23 -0
- data/app/controllers/hello/application_controller.rb +27 -0
- data/app/controllers/hello/authentication/sessions_controller.rb +81 -0
- data/app/controllers/hello/authentication/sign_in_controller.rb +39 -0
- data/app/controllers/hello/authentication/sudo_mode_controller.rb +40 -0
- data/app/controllers/hello/concerns/authentication/sign_in.rb +44 -0
- data/app/controllers/hello/concerns/management/forgot_password.rb +45 -0
- data/app/controllers/hello/concerns/management/reset_password.rb +33 -0
- data/app/controllers/hello/concerns/registration/sign_up.rb +64 -0
- data/app/controllers/hello/internationalization/locale_controller.rb +28 -0
- data/app/controllers/hello/management/accesses_controller.rb +29 -0
- data/app/controllers/hello/management/confirm_emails_controller.rb +41 -0
- data/app/controllers/hello/management/emails_controller.rb +67 -0
- data/app/controllers/hello/management/forgot_password_controller.rb +41 -0
- data/app/controllers/hello/management/passwords_controller.rb +57 -0
- data/app/controllers/hello/management/profiles_controller.rb +71 -0
- data/app/controllers/hello/management/reset_password_controller.rb +53 -0
- data/app/controllers/hello/registration/sign_up_controller.rb +63 -0
- data/app/helpers/hello/application_helper.rb +5 -0
- data/app/mailers/hello/mailer.rb +26 -0
- data/app/models/access.rb +2 -0
- data/app/models/credential.rb +2 -0
- data/app/models/email_credential.rb +2 -0
- data/app/models/password_credential.rb +2 -0
- data/app/models/user.rb +2 -0
- data/app/views/hello/authentication/_sign_in.html.erb +64 -0
- data/app/views/hello/authentication/new_session.html.erb +4 -0
- data/app/views/hello/authentication/sessions.html.erb +36 -0
- data/app/views/hello/authentication/sign_in.html.erb +3 -0
- data/app/views/hello/authentication/sudo_mode.html.erb +37 -0
- data/app/views/hello/internationalization/locales.html.erb +7 -0
- data/app/views/hello/mailer/confirm_email.html.erb +12 -0
- data/app/views/hello/mailer/forgot_password.html.erb +12 -0
- data/app/views/hello/mailer/welcome.html.erb +11 -0
- data/app/views/hello/management/accesses.html.erb +47 -0
- data/app/views/hello/management/cancel.html.erb +14 -0
- data/app/views/hello/management/email_credentials/expired_confirmation_token.html.erb +1 -0
- data/app/views/hello/management/email_credentials/index.html.erb +84 -0
- data/app/views/hello/management/password_credentials/_forgot_form.html.erb +17 -0
- data/app/views/hello/management/password_credentials/_reset_form.html.erb +39 -0
- data/app/views/hello/management/password_credentials/forgot.html.erb +10 -0
- data/app/views/hello/management/password_credentials/forgot_success.html.erb +26 -0
- data/app/views/hello/management/password_credentials/reset.html.erb +3 -0
- data/app/views/hello/management/password_credentials/show.html.erb +25 -0
- data/app/views/hello/management/user.html.erb +73 -0
- data/app/views/hello/registration/_sign_up.html.erb +86 -0
- data/app/views/hello/registration/sign_up.html.erb +3 -0
- data/app/views/hello/registration/sign_up_widget.html.erb +3 -0
- data/app/views/hello/shared/_errors.html.erb +11 -0
- data/app/views/hello/shared/_flash.html.erb +8 -0
- data/app/views/hello/shared/_nav_pills.html.erb +15 -0
- data/app/views/hello/shared/_session_expiration.html.erb +15 -0
- data/app/views/hello/shared/_settings.html.erb +41 -0
- data/config/locales/hello.en.yml +69 -0
- data/config/locales/hello.es.yml +71 -0
- data/config/locales/hello.fr.yml +71 -0
- data/config/locales/hello.pl.yml +71 -0
- data/config/locales/hello.pt-BR.yml +71 -0
- data/config/locales/hello.zh-CN.yml +71 -0
- data/config/locales/hello.zh-TW.yml +71 -0
- data/config/routes.rb +74 -0
- data/db/migrate/1_create_credentials.rb +17 -0
- data/db/migrate/2_create_accesses.rb +15 -0
- data/db/migrate/3_create_users.rb +23 -0
- data/lib/generators/hello/concerns/USAGE +8 -0
- data/lib/generators/hello/concerns/concerns_generator.rb +10 -0
- data/lib/generators/hello/from_devise/USAGE +8 -0
- data/lib/generators/hello/from_devise/from_devise_generator.rb +13 -0
- data/lib/generators/hello/from_devise/templates/from_devise.migration.rb +39 -0
- data/lib/generators/hello/install/USAGE +8 -0
- data/lib/generators/hello/install/install_generator.rb +94 -0
- data/lib/generators/hello/install/templates/application.html.erb +35 -0
- data/lib/generators/hello/install/templates/hello_helper.rb +16 -0
- data/lib/generators/hello/install/templates/initializer.rb +24 -0
- data/lib/generators/hello/install/templates/models/concerns/user/authorization.rb +21 -0
- data/lib/generators/hello/install/templates/models/user.rb +9 -0
- data/lib/generators/hello/install/templates/onboarding/index.html.erb +5 -0
- data/lib/generators/hello/install/templates/onboarding/onboarding_controller.rb +33 -0
- data/lib/generators/hello/install/templates/root/index.html.erb +7 -0
- data/lib/generators/hello/install/templates/root/root_controller.rb +6 -0
- data/lib/generators/hello/install/templates/users/controllers/users_controller.rb +71 -0
- data/lib/generators/hello/install/templates/users/views/users/index.html.erb +29 -0
- data/lib/generators/hello/install/templates/users/views/users/list.html.erb +35 -0
- data/lib/generators/hello/install/templates/users/views/users/new.html.erb +60 -0
- data/lib/generators/hello/install/templates/users/views/users/show.html.erb +74 -0
- data/lib/generators/hello/locales/USAGE +12 -0
- data/lib/generators/hello/locales/locales_generator.rb +64 -0
- data/lib/generators/hello/views/USAGE +8 -0
- data/lib/generators/hello/views/views_generator.rb +9 -0
- data/lib/hello-rails.rb +1 -0
- data/lib/hello.rb +36 -0
- data/lib/hello/CHANGES.md +26 -0
- data/lib/hello/business.rb +47 -0
- data/lib/hello/business/authentication/sign_in.rb +92 -0
- data/lib/hello/business/authentication/sign_out.rb +8 -0
- data/lib/hello/business/authentication/sudo_mode_authentication.rb +25 -0
- data/lib/hello/business/authentication/sudo_mode_expiration.rb +17 -0
- data/lib/hello/business/base.rb +33 -0
- data/lib/hello/business/internationalization/update_locale.rb +33 -0
- data/lib/hello/business/management/add_email.rb +19 -0
- data/lib/hello/business/management/cancel_account.rb +22 -0
- data/lib/hello/business/management/confirm_email.rb +36 -0
- data/lib/hello/business/management/forgot_password.rb +47 -0
- data/lib/hello/business/management/remove_email.rb +19 -0
- data/lib/hello/business/management/reset_password.rb +34 -0
- data/lib/hello/business/management/send_confirmation_email.rb +40 -0
- data/lib/hello/business/management/unlink_access.rb +8 -0
- data/lib/hello/business/management/update_profile.rb +44 -0
- data/lib/hello/business/registration/sign_up.rb +159 -0
- data/lib/hello/configuration.rb +12 -0
- data/lib/hello/encryptors.rb +6 -0
- data/lib/hello/encryptors/complex.rb +25 -0
- data/lib/hello/encryptors/simple.rb +27 -0
- data/lib/hello/engine.rb +23 -0
- data/lib/hello/errors.rb +12 -0
- data/lib/hello/locales.rb +238 -0
- data/lib/hello/middleware.rb +13 -0
- data/lib/hello/rails_active_record.rb +10 -0
- data/lib/hello/rails_active_record/access.rb +65 -0
- data/lib/hello/rails_active_record/credential.rb +51 -0
- data/lib/hello/rails_active_record/email_credential.rb +60 -0
- data/lib/hello/rails_active_record/password_credential.rb +70 -0
- data/lib/hello/rails_active_record/user.rb +99 -0
- data/lib/hello/rails_controller.rb +124 -0
- data/lib/hello/rails_controller/restrict_by_role.rb +79 -0
- data/lib/hello/rails_helper.rb +35 -0
- data/lib/hello/request_manager.rb +14 -0
- data/lib/hello/request_manager/abstract.rb +77 -0
- data/lib/hello/request_manager/factory.rb +32 -0
- data/lib/hello/request_manager/stateful.rb +53 -0
- data/lib/hello/request_manager/stateful/finder.rb +58 -0
- data/lib/hello/request_manager/stateful/session_wrapper.rb +37 -0
- data/lib/hello/request_manager/stateless.rb +35 -0
- data/lib/hello/time_zones.rb +7 -0
- data/lib/hello/utils.rb +11 -0
- data/lib/hello/utils/device_name.rb +34 -0
- data/lib/hello/version.rb +4 -0
- data/lib/tasks/hello_tasks.rake +4 -0
- data/spec/bdd/hello/authentication/authorization/authorization_role_restriction_spec.rb +291 -0
- data/spec/bdd/hello/authentication/authorization/authorization_router_constraints_spec.rb +41 -0
- data/spec/bdd/hello/authentication/authorization/authorization_sensitive_restriction_spec.rb +84 -0
- data/spec/bdd/hello/authentication/authorization/bdd.yml +1 -0
- data/spec/bdd/hello/authentication/bdd.yml +1 -0
- data/spec/bdd/hello/authentication/classic_sign_in_spec.rb +264 -0
- data/spec/bdd/hello/authentication/manage_sessions_spec.rb +292 -0
- data/spec/bdd/hello/authentication/sign_out_spec.rb +159 -0
- data/spec/bdd/hello/bdd.yml +1 -0
- data/spec/bdd/hello/internalionalization/anyone_can_change_their_locale/bdd.yml +1 -0
- data/spec/bdd/hello/internalionalization/anyone_can_change_their_locale/change_locale_on_the_locale_page_spec.rb +90 -0
- data/spec/bdd/hello/internalionalization/anyone_can_change_their_locale/change_locale_on_the_profile_page_spec.rb +64 -0
- data/spec/bdd/hello/internalionalization/anyone_can_change_their_locale/change_locale_on_the_sign_in_form_spec.rb +31 -0
- data/spec/bdd/hello/internalionalization/anyone_can_change_their_locale/change_locale_on_the_sign_up_form_spec.rb +34 -0
- data/spec/bdd/hello/internalionalization/anyone_can_change_their_timezone/bdd.yml +1 -0
- data/spec/bdd/hello/internalionalization/anyone_can_change_their_timezone/change_timezone_on_the_profile_page_spec.rb +14 -0
- data/spec/bdd/hello/internalionalization/anyone_can_change_their_timezone/change_timezone_on_the_sign_in_form_spec.rb +14 -0
- data/spec/bdd/hello/internalionalization/anyone_can_change_their_timezone/change_timezone_on_the_sign_up_form_spec.rb +14 -0
- data/spec/bdd/hello/internalionalization/bdd.yml +1 -0
- data/spec/bdd/hello/management/bdd.yml +1 -0
- data/spec/bdd/hello/management/cancel_account_spec.rb +128 -0
- data/spec/bdd/hello/management/manage_email_credentials/bdd.yml +1 -0
- data/spec/bdd/hello/management/manage_email_credentials/manage_email_credentials_emails_api_spec.rb +7 -0
- data/spec/bdd/hello/management/manage_email_credentials/manage_email_credentials_emails_page_spec.rb +252 -0
- data/spec/bdd/hello/management/manage_password_credentials/bdd.yml +1 -0
- data/spec/bdd/hello/management/manage_password_credentials/manage_password_forgot_password_spec.rb +68 -0
- data/spec/bdd/hello/management/manage_password_credentials/manage_password_page_spec.rb +60 -0
- data/spec/bdd/hello/management/manage_password_credentials/manage_password_reset_password_spec.rb +145 -0
- data/spec/bdd/hello/management/manage_profile/bdd.yml +1 -0
- data/spec/bdd/hello/management/manage_profile/manage_profile_api_spec.rb +7 -0
- data/spec/bdd/hello/management/manage_profile/manage_profile_page_spec.rb +65 -0
- data/spec/bdd/hello/management/manage_social_credentials/bdd.yml +1 -0
- data/spec/bdd/hello/management/manage_social_credentials/manage_social_credentials_pending_spec.rb +7 -0
- data/spec/bdd/hello/management/unlink_sessions_spec.rb +59 -0
- data/spec/bdd/hello/other/bdd.yml +1 -0
- data/spec/bdd/hello/other/create_user_spec.rb +70 -0
- data/spec/bdd/hello/other/impersonate_user_spec.rb +58 -0
- data/spec/bdd/hello/other/list_users_spec.rb +86 -0
- data/spec/bdd/hello/registration/bdd.yml +1 -0
- data/spec/bdd/hello/registration/classic_sign_up_spec.rb +228 -0
- data/spec/bdd/hello/registration/onboarding_process_spec.rb +101 -0
- data/spec/bdd/hello/support.rb +62 -0
- data/spec/business/hello/authentication/sign_in_spec.rb +72 -0
- data/spec/business/hello/registration/sign_up_spec.rb +258 -0
- data/spec/controllers/authentication_spec.rb +97 -0
- data/spec/controllers/localization_spec.rb +65 -0
- data/spec/controllers/request_can_carry_an_access_token_spec.rb +223 -0
- data/spec/fixtures/hello/password_mailer/confirmation +3 -0
- data/spec/fixtures/hello/password_mailer/forgot +3 -0
- data/spec/fixtures/hello/password_mailer/sign_up +3 -0
- data/spec/mailers/hello/mailer_spec.rb +53 -0
- data/spec/models/access_spec.rb +19 -0
- data/spec/models/credential_spec.rb +9 -0
- data/spec/models/email_credential_spec.rb +163 -0
- data/spec/models/hello/sign_up_model_spec.rb +64 -0
- data/spec/models/password_credential_spec.rb +75 -0
- data/spec/models/user_spec.rb +93 -0
- data/spec/others/configuration_spec.rb +25 -0
- data/spec/others/encryptors/complex_spec.rb +26 -0
- data/spec/others/encryptors/simple_spec.rb +21 -0
- data/spec/others/helper_spec.rb +10 -0
- data/spec/others/localization_consistency_spec.rb +73 -0
- data/spec/requests/forgot_password_spec.rb +36 -0
- data/spec/requests/reset_password_spec.rb +7 -0
- data/spec/requests/security/user_spec.rb +19 -0
- data/spec/routing/hello/accesses_routing_spec.rb +17 -0
- data/spec/routing/hello/emails_routing_spec.rb +37 -0
- data/spec/routing/hello/locale_routing_spec.rb +17 -0
- data/spec/routing/hello/profile_routing_spec.rb +29 -0
- data/spec/routing/hello/registration_routing_spec.rb +23 -0
- data/spec/routing/hello/sign_out_routing_spec.rb +11 -0
- data/spec/routing/hello/sudo_mode_routing_spec.rb +23 -0
- data/spec/routing/hello/users_routing_spec.rb +15 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/spec_helper/codeclimate.rb +2 -0
- data/spec/spec_helper/configure_rspec.rb +23 -0
- data/spec/spec_helper/create_database.rb +5 -0
- data/spec/spec_helper/dummy_and_test_dependencies.rb +17 -0
- data/spec/spec_helper/support.rb +1 -0
- data/spec/support/factories.rb +60 -0
- data/spec/support/feature_injection.rb +118 -0
- data/spec/support/features/feature_support_given.rb +46 -0
- data/spec/support/features/feature_support_then.rb +43 -0
- data/spec/support/helpers/aliases.rb +76 -0
- data/spec/support/helpers/configuration.rb +6 -0
- data/spec/support/helpers/current.rb +16 -0
- data/spec/support/helpers/expect.rb +61 -0
- data/spec/support/helpers/given.rb +49 -0
- data/spec/support/helpers/shortcuts.rb +24 -0
- data/spec/support/helpers/then.rb +29 -0
- data/spec/support/helpers/when.rb +108 -0
- data/spec/support/requests/request_support.rb +8 -0
- data/spec/utils/device_name_spec.rb +228 -0
- metadata +562 -11
@@ -0,0 +1,60 @@
|
|
1
|
+
module Hello
|
2
|
+
module RailsActiveRecord
|
3
|
+
class EmailCredential < ::Credential
|
4
|
+
|
5
|
+
# VALIDATIONS
|
6
|
+
before_destroy :cannot_destroy_last_email_credential
|
7
|
+
|
8
|
+
validate :hello_validations
|
9
|
+
validates_uniqueness_of :email
|
10
|
+
|
11
|
+
# SETTERS
|
12
|
+
def email=(v)
|
13
|
+
super(v.to_s.downcase.delete(' '))
|
14
|
+
end
|
15
|
+
|
16
|
+
# CUSTOM METHODS
|
17
|
+
|
18
|
+
def email_confirmed?
|
19
|
+
!!confirmed_at
|
20
|
+
end
|
21
|
+
|
22
|
+
def email_delivered?
|
23
|
+
!!email_delivered_at
|
24
|
+
end
|
25
|
+
|
26
|
+
def email_delivered_at
|
27
|
+
verifying_token_digested_at
|
28
|
+
end
|
29
|
+
|
30
|
+
def confirm_email!
|
31
|
+
update! verifying_token_digest: nil, verifying_token_digested_at: nil, confirmed_at: 1.second.ago
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def hello_validations
|
37
|
+
validates_presence_of :email
|
38
|
+
return false if errors[:email].any?
|
39
|
+
|
40
|
+
c = Hello.configuration
|
41
|
+
validates_length_of :email, in: c.email_length
|
42
|
+
return false if errors[:email].any?
|
43
|
+
|
44
|
+
validates_format_of :email, with: c.email_regex
|
45
|
+
return false if errors[:email].any?
|
46
|
+
end
|
47
|
+
|
48
|
+
def cannot_destroy_last_email_credential
|
49
|
+
return if hello_is_user_being_destroyed?
|
50
|
+
return unless is_last_email_credential?
|
51
|
+
errors[:base] << 'must have at least one credential'
|
52
|
+
false
|
53
|
+
end
|
54
|
+
|
55
|
+
def is_last_email_credential?
|
56
|
+
user.email_credentials.count == 1
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Hello
|
2
|
+
module RailsActiveRecord
|
3
|
+
class PasswordCredential < ::Credential
|
4
|
+
|
5
|
+
# VALIDATIONS
|
6
|
+
validates_presence_of :password, on: :create
|
7
|
+
# validates_presence_of :digest
|
8
|
+
|
9
|
+
# before_destroy :cannot_destroy_last_password_credential
|
10
|
+
validate :hello_validations
|
11
|
+
|
12
|
+
# SETTERS
|
13
|
+
|
14
|
+
attr_reader :password
|
15
|
+
|
16
|
+
def password=(value)
|
17
|
+
# puts "password=('#{value}')".blue
|
18
|
+
self.digest = @password = nil if value.blank?
|
19
|
+
@password = value
|
20
|
+
|
21
|
+
self.digest = complex_encryptor.encrypt(value)
|
22
|
+
end
|
23
|
+
|
24
|
+
# CUSTOM METHODS
|
25
|
+
|
26
|
+
def password_is?(plain_text_password)
|
27
|
+
complex_encryptor.match(plain_text_password, digest)
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_generated_password
|
31
|
+
self.password = simple_encryptor.single(4) # 8 chars
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def hello_validations
|
37
|
+
return true unless digest_changed?
|
38
|
+
|
39
|
+
return false if errors[:password].any?
|
40
|
+
c = Hello.configuration
|
41
|
+
|
42
|
+
validates_length_of :password, in: c.password_length
|
43
|
+
return false if errors[:password].any?
|
44
|
+
|
45
|
+
validates_format_of :password, with: c.password_regex
|
46
|
+
return false if errors[:password].any?
|
47
|
+
end
|
48
|
+
|
49
|
+
def complex_encryptor
|
50
|
+
Hello::Encryptors::Complex.instance
|
51
|
+
end
|
52
|
+
|
53
|
+
def simple_encryptor
|
54
|
+
Hello::Encryptors::Simple.instance
|
55
|
+
end
|
56
|
+
|
57
|
+
# # TODO: code for multiple passwords
|
58
|
+
# def cannot_destroy_last_password_credential
|
59
|
+
# return if hello_is_user_being_destroyed?
|
60
|
+
# return if not is_last_password_credential?
|
61
|
+
# errors[:base] << "must have at least one credential"
|
62
|
+
# false
|
63
|
+
# end
|
64
|
+
|
65
|
+
# def is_last_password_credential?
|
66
|
+
# user.password_credentials.count == 1
|
67
|
+
# end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module Hello
|
2
|
+
module RailsActiveRecord
|
3
|
+
class User < ::ActiveRecord::Base
|
4
|
+
self.table_name = 'users'
|
5
|
+
|
6
|
+
# ASSOCIATIONS
|
7
|
+
|
8
|
+
has_many :credentials, dependent: :destroy, class_name: '::Credential'
|
9
|
+
has_many :email_credentials, dependent: :destroy, class_name: '::EmailCredential'
|
10
|
+
has_one :password_credential, dependent: :destroy, class_name: '::PasswordCredential'
|
11
|
+
has_many :password_credentials, dependent: :destroy, class_name: '::PasswordCredential'
|
12
|
+
has_many :accesses, dependent: :destroy, class_name: '::Access'
|
13
|
+
|
14
|
+
alias :main_password_credential :password_credential
|
15
|
+
|
16
|
+
# VALIDATIONS
|
17
|
+
|
18
|
+
validates_presence_of :username, :locale, :time_zone
|
19
|
+
validates_uniqueness_of :username
|
20
|
+
validate :hello_validations
|
21
|
+
|
22
|
+
# SETTERS
|
23
|
+
|
24
|
+
def username=(v)
|
25
|
+
super(v.to_s.downcase.remove(' '))
|
26
|
+
end
|
27
|
+
|
28
|
+
# OVERRIDES
|
29
|
+
|
30
|
+
def destroy
|
31
|
+
# In Rails 4.0
|
32
|
+
# 'this instance' and the 'user in the credential instance'
|
33
|
+
# are 2 separate instances, making it impossible for them to share state
|
34
|
+
# therefore, an instance variable used as a flag will not work for Rails 4.0
|
35
|
+
# It will however, work for Rails 4.1 and 4.2
|
36
|
+
# @hello_is_this_being_destroyed = true
|
37
|
+
Thread.current['Hello.destroying_user'] = true
|
38
|
+
super
|
39
|
+
end
|
40
|
+
|
41
|
+
# def hello_is_this_being_destroyed?
|
42
|
+
# !!@hello_is_this_being_destroyed
|
43
|
+
# end
|
44
|
+
|
45
|
+
|
46
|
+
# CUSTOM METHODS
|
47
|
+
|
48
|
+
def as_json_web_api
|
49
|
+
as_json
|
50
|
+
end
|
51
|
+
|
52
|
+
def password_is?(plain_text_password)
|
53
|
+
password_credential.password_is?(plain_text_password)
|
54
|
+
end
|
55
|
+
|
56
|
+
def role_is?(role)
|
57
|
+
send("#{role}?")
|
58
|
+
end
|
59
|
+
|
60
|
+
def in_any_role?(roles)
|
61
|
+
roles.each { |r| role_is?(r) and return true }
|
62
|
+
false
|
63
|
+
end
|
64
|
+
|
65
|
+
def set_generated_username
|
66
|
+
loop do
|
67
|
+
self.username = _make_up_new_username
|
68
|
+
break if _username_unique?
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def hello_validations
|
75
|
+
c = Hello.configuration
|
76
|
+
|
77
|
+
validates_inclusion_of :locale, in: c.locales
|
78
|
+
validates_inclusion_of :time_zone, in: c.time_zones
|
79
|
+
validates_format_of :username, with: c.username_regex
|
80
|
+
validates_length_of :username, in: c.username_length
|
81
|
+
end
|
82
|
+
|
83
|
+
def _make_up_new_username
|
84
|
+
Hello::Encryptors::Simple.instance.single(16) # 16 chars
|
85
|
+
end
|
86
|
+
|
87
|
+
def _username_unique?
|
88
|
+
!self.class.unscoped.where(username: username).where.not(id: id).exists?
|
89
|
+
end
|
90
|
+
|
91
|
+
# def username_suggestions
|
92
|
+
# email1 = email.to_s.split('@').first
|
93
|
+
# name1 = name.to_s.split(' ')
|
94
|
+
# ideas = [name1, email1].flatten
|
95
|
+
# [ideas.sample, rand(999)].join.parameterize
|
96
|
+
# end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module Hello
|
2
|
+
module RailsController
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
autoload :RestrictByRole, 'hello/rails_controller/restrict_by_role'
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def sign_out!(options = {})
|
9
|
+
before_action(options) { sign_out! }
|
10
|
+
end
|
11
|
+
|
12
|
+
def kick(*args)
|
13
|
+
options, roles = Hello::Utils.trailing_options(args)
|
14
|
+
before_action(options) { kick(*roles) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def dont_kick(*args)
|
18
|
+
options, roles = Hello::Utils.trailing_options(args)
|
19
|
+
before_action(options) { dont_kick(*roles) }
|
20
|
+
end
|
21
|
+
|
22
|
+
def dont_kick_people
|
23
|
+
# :)
|
24
|
+
end
|
25
|
+
|
26
|
+
def sudo_mode(options = {})
|
27
|
+
before_action(options) { sudo_mode }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
included do
|
32
|
+
around_action :hello_around_action
|
33
|
+
|
34
|
+
helper_method :sign_up_disabled,
|
35
|
+
:current_user, :current_accesses, :current_access,
|
36
|
+
:signed_in?, :is_current_access?, :sudo_mode?
|
37
|
+
|
38
|
+
delegate :sign_in!, :sign_out!, :signed_in?,
|
39
|
+
:current_user, :is_current_user?,
|
40
|
+
:current_access, :current_accesses, :is_current_access?,
|
41
|
+
:session_token=, :session_tokens,
|
42
|
+
to: :hello_manager
|
43
|
+
|
44
|
+
delegate :kick, :dont_kick,
|
45
|
+
to: :restrict_by_role
|
46
|
+
end
|
47
|
+
|
48
|
+
def hello_manager
|
49
|
+
env['hello'] ||= Hello::RequestManager.create(request)
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
def sign_up_disabled
|
55
|
+
Hello.configuration.sign_up_disabled || action_name=='disabled'
|
56
|
+
end
|
57
|
+
|
58
|
+
def hello_store_url_on_session!
|
59
|
+
if hello_manager.stateful?
|
60
|
+
session[:url] = url_for(params.permit!.merge(only_path: true))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
def sudo_mode?
|
67
|
+
current_access && current_access.sudo_expires_at.future?
|
68
|
+
end
|
69
|
+
|
70
|
+
def sudo_mode
|
71
|
+
unless sudo_mode?
|
72
|
+
hello_store_url_on_session!
|
73
|
+
render_sudo_mode_form
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def render_sudo_mode_form
|
78
|
+
render 'hello/authentication/sudo_mode'
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def restrict_by_role
|
86
|
+
@_hello_rbr ||= RestrictByRole.new(self)
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
def use_locale(locale)
|
91
|
+
locale ||= current_user && current_user.locale
|
92
|
+
locale ||= session['locale']
|
93
|
+
locale ||= recommended_locale.to_s
|
94
|
+
|
95
|
+
I18n.locale = session['locale'] = locale
|
96
|
+
end
|
97
|
+
|
98
|
+
def hello_around_action(&block)
|
99
|
+
use_locale(nil)
|
100
|
+
|
101
|
+
if current_user
|
102
|
+
# begin keep-alive
|
103
|
+
Access.cached_destroy_all_expired
|
104
|
+
current_access.keep_alive!
|
105
|
+
expires_in = view_context.time_ago_in_words(current_access.expires_at)
|
106
|
+
logger.info " #{'Hello Session'.bold.light_blue} expires in #{expires_in}"
|
107
|
+
# end keep-alive
|
108
|
+
|
109
|
+
Thread.current['Hello.destroying_user'] = nil
|
110
|
+
Time.use_zone(current_user.time_zone, &block)
|
111
|
+
Thread.current['Hello.destroying_user'] = nil
|
112
|
+
else
|
113
|
+
yield
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def recommended_locale
|
118
|
+
y = Hello.configuration.locales
|
119
|
+
x = http_accept_language.compatible_language_from(y)
|
120
|
+
x || I18n.default_locale
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Hello
|
2
|
+
module RailsController
|
3
|
+
class RestrictByRole
|
4
|
+
|
5
|
+
def initialize(controller)
|
6
|
+
@controller = controller
|
7
|
+
end
|
8
|
+
|
9
|
+
def kick(*roles)
|
10
|
+
to_home_page if current_user.in_any_role?(roles)
|
11
|
+
end
|
12
|
+
|
13
|
+
def dont_kick(*roles)
|
14
|
+
to_home_page if not current_user.in_any_role?(roles)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def current_user
|
20
|
+
@controller.current_user || ::User.new(role: 'guest')
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_home_page
|
24
|
+
if current_user.guest?
|
25
|
+
to_sign_in
|
26
|
+
elsif current_user.onboarding?
|
27
|
+
to_onboarding
|
28
|
+
else
|
29
|
+
to_root
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_root
|
34
|
+
respond_to do |format|
|
35
|
+
format.html { redirect_to '/' }
|
36
|
+
format.json do
|
37
|
+
data = { 'message' => 'Access Denied.' }
|
38
|
+
status = :forbidden # 403
|
39
|
+
render json: data, status: status
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_sign_in
|
45
|
+
respond_to do |format|
|
46
|
+
format.html do
|
47
|
+
hello_store_url_on_session!
|
48
|
+
redirect_to hello.sign_in_path
|
49
|
+
end
|
50
|
+
format.json do
|
51
|
+
data = { 'message' => 'An active access token must be used to query information about the current user.' }
|
52
|
+
status = :unauthorized # 401
|
53
|
+
render json: data, status: status
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_onboarding
|
59
|
+
respond_to do |format|
|
60
|
+
format.html { redirect_to '/onboarding' }
|
61
|
+
format.json do
|
62
|
+
data = { 'message' => 'Access Denied, visit /onboarding and complete your registration.' }
|
63
|
+
status = :forbidden # 403
|
64
|
+
render json: data, status: status
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def method_missing(method, *args, &block)
|
70
|
+
if @controller.respond_to?(method)
|
71
|
+
@controller.send(method, *args, &block)
|
72
|
+
else
|
73
|
+
super
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Hello
|
2
|
+
module RailsHelper
|
3
|
+
def method_missing(method, *args, &block)
|
4
|
+
# # http://candland.net/2012/04/17/rails-routes-used-in-an-isolated-engine/
|
5
|
+
# puts "LOOKING FOR ROUTES #{method}"
|
6
|
+
return super unless method.to_s.end_with?('_path', '_url')
|
7
|
+
return super unless main_app.respond_to?(method)
|
8
|
+
main_app.send(method, *args)
|
9
|
+
end
|
10
|
+
|
11
|
+
def respond_to?(method)
|
12
|
+
return super unless method.to_s.end_with?('_path', '_url')
|
13
|
+
return super unless main_app.respond_to?(method)
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
# [['English', 'en']]
|
18
|
+
def hello_locale_select_options
|
19
|
+
available_locales_with_names.map { |k, v| [v, k] }
|
20
|
+
end
|
21
|
+
|
22
|
+
def human_current_locale
|
23
|
+
t('hello.locale_name')
|
24
|
+
end
|
25
|
+
|
26
|
+
def current_locale
|
27
|
+
session['locale']
|
28
|
+
end
|
29
|
+
|
30
|
+
def available_locales_with_names
|
31
|
+
Hello::Locales.all.select { |k, _v| Hello.configuration.locales.include? k }
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|