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,93 @@
1
+ en:
2
+ morpho:
3
+ labels:
4
+ sessions:
5
+ sign_in: 'Sign in'
6
+ sign_up: 'Sign up with a new user account'
7
+ password_reset: 'Reset my account password'
8
+ unlock: 'Unlock my account'
9
+ users:
10
+ sign_up: 'Sign up'
11
+ sign_in: 'Sign in with an existent user account'
12
+ activation: 'Activate my account'
13
+ passwords:
14
+ send_instructions: 'Send reset password instructions'
15
+ sign_in: 'Sign in with an existent user account'
16
+ sign_up: 'Sign up with a new user account'
17
+ change_password: 'Change my password'
18
+ activations:
19
+ send_instructions: 'Send activation instructions'
20
+ sign_in: 'Sign in with an existent user account'
21
+ sign_up: 'Sign up with a new user account'
22
+ unlocks:
23
+ send_instructions: 'Send unlock instructions'
24
+ sign_in: 'Sign in with an existent user account'
25
+ sign_up: 'Sign up with a new user account'
26
+ messages:
27
+ unauthenticated: 'You need to sign in first'
28
+ sessions:
29
+ create:
30
+ success: 'Sign in successfully'
31
+ failure: 'Sign in failed, please check the information provided'
32
+ destroy:
33
+ success: 'You sign out successfully'
34
+ users:
35
+ create:
36
+ success: 'Sign up successfully, you will receive al email with account activation instructions'
37
+ failure: 'Sign up failed, please review the errors below'
38
+ passwords:
39
+ create:
40
+ success: 'You will receive password reset instructions on your email inbox'
41
+ failure: 'No user acount found with that email'
42
+ edit:
43
+ success: 'Enter your new password on the fields below'
44
+ failure: 'Password reset failed, request a new activation token'
45
+ update:
46
+ success: 'Password successfully changed, sign in to continue'
47
+ failure: 'Password change failed, please review the errors below'
48
+ activations:
49
+ create:
50
+ success: 'You will receive user account activation instructions on your email inbox'
51
+ failure: 'No user account found with that email or user account is active already'
52
+ activate:
53
+ success: 'Activation successfully, sign in to continue'
54
+ failure: 'Activation failed, request a new activation token'
55
+ unlocks:
56
+ create:
57
+ success: 'You will receive user account unlock instructions on your email inbox'
58
+ failure: 'No user account found with that email or user account is unlocked already'
59
+ unlock:
60
+ success: 'Unlock successfully, sign in to continue'
61
+ failure: 'Unlock failed, request a new unlock token'
62
+ mailer:
63
+ activation_needed:
64
+ subject: 'You have successfully signed up'
65
+ activation_success:
66
+ subject: 'Your account is now activated'
67
+ reset_password:
68
+ subject: 'You have requested to reset your password'
69
+ unlock_token:
70
+ subject: 'Your account has been locked'
71
+ api:
72
+ messages:
73
+ bad_request: 'Bad request'
74
+ unauthorized: 'Unauthorized'
75
+ payment_required: 'Payment required'
76
+ forbidden: 'Forbidden'
77
+ not_found: 'Not found'
78
+ method_not_allowed: 'Method not allowed'
79
+ unprocessable_entity: 'Unprocessable entity'
80
+ simple_form:
81
+ 'yes': 'Yes'
82
+ 'no': 'No'
83
+ required:
84
+ text: 'required'
85
+ mark: '*'
86
+ error_notification:
87
+ default_message: 'Please review the problems below:'
88
+ labels:
89
+ defaults:
90
+ email: 'Email'
91
+ password: 'Password'
92
+ password_confirmation: 'Confirm your password'
93
+ remember_me: 'Remember me'
@@ -1,2 +1,27 @@
1
1
  Morpho::Engine.routes.draw do
2
+ get 'sign_in', to: 'sessions#new'
3
+ post 'sign_in', to: 'sessions#create'
4
+ delete 'sign_out', to: 'sessions#destroy'
5
+
6
+ get 'sign_up', to: 'users#new'
7
+ post 'sign_up', to: 'users#create'
8
+ get 'account', to: 'users#edit'
9
+ put 'account', to: 'users#update'
10
+
11
+ get 'new_activation', to: 'activations#new'
12
+ post 'send_activation', to: 'activations#create'
13
+ get 'activate/:token', to: 'activations#show', as: :activate
14
+
15
+ get 'new_reset_password', to: 'passwords#new'
16
+ post 'send_reset_password', to: 'passwords#create'
17
+ get 'new_password/:token', to: 'passwords#edit', as: :new_password
18
+ put 'change_password/:token', to: 'passwords#update', as: :change_password
19
+
20
+ get 'new_unlock', to: 'unlocks#new'
21
+ post 'send_unlock', to: 'unlocks#create'
22
+ get 'unlock/:token', to: 'unlocks#show', as: :unlock
23
+
24
+ mount Morpho::API => '/api', as: :api
25
+
26
+ root to: 'home#index'
2
27
  end
@@ -0,0 +1,13 @@
1
+ class SorceryCore < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table :morpho_users do |t|
4
+ t.string :email, :null => false
5
+ t.string :crypted_password
6
+ t.string :salt
7
+
8
+ t.timestamps :null => false
9
+ end
10
+
11
+ add_index :morpho_users, :email, unique: true
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ class SorceryRememberMe < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :morpho_users, :remember_me_token, :string, :default => nil
4
+ add_column :morpho_users, :remember_me_token_expires_at, :datetime, :default => nil
5
+
6
+ add_index :morpho_users, :remember_me_token
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ class SorceryResetPassword < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :morpho_users, :reset_password_token, :string, :default => nil
4
+ add_column :morpho_users, :reset_password_token_expires_at, :datetime, :default => nil
5
+ add_column :morpho_users, :reset_password_email_sent_at, :datetime, :default => nil
6
+ add_column :morpho_users, :access_count_to_reset_password_page, :integer, :default => 0
7
+
8
+ add_index :morpho_users, :reset_password_token
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ class SorceryUserActivation < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :morpho_users, :activation_state, :string, :default => nil
4
+ add_column :morpho_users, :activation_token, :string, :default => nil
5
+ add_column :morpho_users, :activation_token_expires_at, :datetime, :default => nil
6
+
7
+ add_index :morpho_users, :activation_token
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class SorceryBruteForceProtection < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :morpho_users, :failed_logins_count, :integer, :default => 0
4
+ add_column :morpho_users, :lock_expires_at, :datetime, :default => nil
5
+ add_column :morpho_users, :unlock_token, :string, :default => nil
6
+
7
+ add_index :morpho_users, :unlock_token
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ class SorceryActivityLogging < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :morpho_users, :last_login_at, :datetime, :default => nil
4
+ add_column :morpho_users, :last_logout_at, :datetime, :default => nil
5
+ add_column :morpho_users, :last_activity_at, :datetime, :default => nil
6
+ add_column :morpho_users, :last_login_from_ip_address, :string, :default => nil
7
+
8
+ add_index :morpho_users, [:last_logout_at, :last_activity_at]
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ class SorceryExternal < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table :morpho_authentications do |t|
4
+ t.integer :user_id, :null => false
5
+ t.string :provider, :uid, :null => false
6
+
7
+ t.timestamps :null => false
8
+ end
9
+
10
+ add_index :morpho_authentications, [:provider, :uid]
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ class Morpho::InstallGenerator < Rails::Generators::Base
2
+ source_root File.expand_path('templates', __dir__)
3
+
4
+ def install
5
+ copy_file 'config/initializers/morpho.rb', 'config/initializers/morpho.rb'
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ Morpho.configure do |config|
2
+ config.host = 'localhost:3000'
3
+ config.mailer.from = ''
4
+ config.mailer.address = 'smtp.mailtrap.io'
5
+ config.mailer.user_name = ''
6
+ config.mailer.password = ''
7
+ config.mailer.port = 2525
8
+ config.mailer.authentication = 'login'
9
+ config.mailer.enable_starttls_auto = false
10
+ config.jwt.secret = ''
11
+ config.jwt.algorithm = 'HS256'
12
+ config.jwt.header = 'Authorization'
13
+ config.jwt.expiration_time = 1.hour
14
+ config.api.title = ''
15
+ config.api.description = ''
16
+ config.auth.failed_login_attempts_limit = 5
17
+ end
@@ -1,5 +1,18 @@
1
- require "morpho/engine"
1
+ require 'morpho/loader'
2
+ require 'morpho/engine'
3
+ require 'morpho/version'
4
+ require 'morpho/configuration'
2
5
 
3
6
  module Morpho
4
- # Your code goes here...
7
+ class << self
8
+ attr_writer :config
9
+
10
+ def configure
11
+ yield config
12
+ end
13
+
14
+ def config
15
+ @config ||= Morpho::Configuration.new
16
+ end
17
+ end
5
18
  end
@@ -0,0 +1,24 @@
1
+ require 'morpho/configurations/mailer'
2
+ require 'morpho/configurations/api'
3
+ require 'morpho/configurations/jwt'
4
+ require 'morpho/configurations/auth'
5
+
6
+ module Morpho
7
+ class Configuration
8
+ attr_accessor :host
9
+
10
+ attr_accessor :mailer
11
+ attr_accessor :api
12
+ attr_accessor :jwt
13
+ attr_accessor :auth
14
+
15
+ def initialize
16
+ self.host = ''
17
+
18
+ self.mailer = Morpho::Configurations::Mailer.new
19
+ self.api = Morpho::Configurations::API.new
20
+ self.jwt = Morpho::Configurations::JWT.new
21
+ self.auth = Morpho::Configurations::Auth.new
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,31 @@
1
+ module Morpho
2
+ module Configurations
3
+ class API
4
+ attr_accessor :title
5
+ attr_accessor :description
6
+ attr_accessor :entities
7
+ attr_accessor :versions
8
+
9
+ def initialize
10
+ self.title = ''
11
+ self.description = ''
12
+ self.entities = []
13
+ self.versions = []
14
+ end
15
+
16
+ def register_entity(entity)
17
+ self.entities << entity
18
+ end
19
+
20
+ def register_entities
21
+ end
22
+
23
+ def register_version(version)
24
+ self.versions << version
25
+ end
26
+
27
+ def register_versions
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,11 @@
1
+ module Morpho
2
+ module Configurations
3
+ class Auth
4
+ attr_accessor :failed_login_attempts_limit
5
+
6
+ def initialize
7
+ self.failed_login_attempts_limit = 0
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ module Morpho
2
+ module Configurations
3
+ class JWT
4
+ attr_accessor :secret
5
+ attr_accessor :algorithm
6
+ attr_accessor :header
7
+ attr_accessor :expiration_time
8
+
9
+ def initialize
10
+ self.secret = ''
11
+ self.algorithm = ''
12
+ self.header = ''
13
+ self.expiration_time = 0
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ module Morpho
2
+ module Configurations
3
+ class Mailer
4
+ attr_accessor :from
5
+ attr_accessor :address
6
+ attr_accessor :user_name
7
+ attr_accessor :password
8
+ attr_accessor :port
9
+ attr_accessor :authentication
10
+ attr_accessor :enable_starttls_auto
11
+
12
+ def initialize
13
+ self.from = ''
14
+ self.address = ''
15
+ self.user_name = ''
16
+ self.password = ''
17
+ self.port = ''
18
+ self.authentication = ''
19
+ self.enable_starttls_auto = ''
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,5 +1,38 @@
1
1
  module Morpho
2
2
  class Engine < ::Rails::Engine
3
3
  isolate_namespace Morpho
4
+ engine_name 'morpho'
5
+
6
+ initializer 'morpho.paths', before: :set_autoload_paths do |app|
7
+ config.autoload_paths << File.expand_path('app/api', __dir__)
8
+ end
9
+
10
+ initializer 'morpho.migrations', before: :load_config_initializers do |app|
11
+ config.paths['db/migrate'].expanded.each do |expanded_path|
12
+ app.config.paths['db/migrate'] << expanded_path
13
+ end
14
+ end
15
+
16
+ initializer 'morpho.configurations', after: :load_config_initializers do |app|
17
+ ActionMailer::Base.delivery_method = :smtp
18
+ ActionMailer::Base.perform_deliveries = true
19
+
20
+ ActionMailer::Base.default_options = {
21
+ from: Morpho.config.mailer.from
22
+ }
23
+
24
+ ActionMailer::Base.default_url_options = {
25
+ host: Morpho.config.host
26
+ }
27
+
28
+ ActionMailer::Base.smtp_settings = {
29
+ address: Morpho.config.mailer.address,
30
+ port: Morpho.config.mailer.port,
31
+ user_name: Morpho.config.mailer.user_name,
32
+ password: Morpho.config.mailer.password,
33
+ authentication: Morpho.config.mailer.authentication,
34
+ enable_starttls_auto: Morpho.config.mailer.enable_starttls_auto
35
+ }
36
+ end
4
37
  end
5
38
  end
@@ -0,0 +1,11 @@
1
+ require 'draper'
2
+ require 'sorcery'
3
+ require 'jwt'
4
+ require 'validates_email_format_of'
5
+ require 'flash_rails_messages'
6
+ require 'simple_form'
7
+ require 'grape'
8
+ require 'grape-entity'
9
+ require 'grape-swagger'
10
+ require 'grape-swagger/entity'
11
+ require 'grape-swagger/representable'
@@ -1,3 +1,3 @@
1
1
  module Morpho
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
@@ -1,4 +1,4 @@
1
- # desc "Explaining what the task does"
1
+ # desc 'Explaining what the task does'
2
2
  # task :morpho do
3
3
  # # Task goes here
4
4
  # end
@@ -0,0 +1,15 @@
1
+ <%# frozen_string_literal: true %>
2
+ <%%= simple_form_for(@<%= singular_table_name %>) do |f| %>
3
+ <%%= f.error_notification %>
4
+ <%%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
5
+
6
+ <div class="form-inputs">
7
+ <%- attributes.each do |attribute| -%>
8
+ <%%= f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %> %>
9
+ <%- end -%>
10
+ </div>
11
+
12
+ <div class="form-actions">
13
+ <%%= f.button :submit %>
14
+ </div>
15
+ <%% end %>