morpho 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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 %>