pollett 0.1.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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +81 -0
- data/Rakefile +25 -0
- data/app/controllers/concerns/pollett/controller.rb +37 -0
- data/app/controllers/pollett/application_controller.rb +4 -0
- data/app/controllers/pollett/keys_controller.rb +5 -0
- data/app/controllers/pollett/sessions_controller.rb +5 -0
- data/app/controllers/pollett/users_controller.rb +5 -0
- data/app/mailers/pollett/mailer.rb +5 -0
- data/app/models/concerns/pollett/user.rb +40 -0
- data/app/models/pollett/context.rb +5 -0
- data/app/models/pollett/key.rb +5 -0
- data/app/models/pollett/session.rb +5 -0
- data/app/serializers/pollett/key_serializer.rb +5 -0
- data/app/serializers/pollett/session_serializer.rb +5 -0
- data/app/serializers/user_serializer.rb +3 -0
- data/app/services/pollett/authenticate_user.rb +5 -0
- data/app/services/pollett/change_password.rb +5 -0
- data/app/services/pollett/create_session.rb +5 -0
- data/app/services/pollett/register_user.rb +5 -0
- data/app/services/pollett/reset_password.rb +5 -0
- data/app/views/pollett/mailer/reset.text.erb +5 -0
- data/app/views/pollett/mailer/welcome.text.erb +1 -0
- data/config/locales/en.yml +14 -0
- data/config/routes.rb +11 -0
- data/db/migrate/20150226024506_create_pollett_contexts.rb +21 -0
- data/lib/generators/pollett/install/install_generator.rb +123 -0
- data/lib/generators/pollett/install/templates/db/migrate/add_pollett_to_users.rb +21 -0
- data/lib/generators/pollett/install/templates/db/migrate/create_users.rb +15 -0
- data/lib/generators/pollett/install/templates/initializer.rb +3 -0
- data/lib/generators/pollett/install/templates/user.rb +3 -0
- data/lib/pollett.rb +20 -0
- data/lib/pollett/concerns.rb +5 -0
- data/lib/pollett/concerns/controllers.rb +3 -0
- data/lib/pollett/concerns/controllers/keys_controller.rb +37 -0
- data/lib/pollett/concerns/controllers/sessions_controller.rb +43 -0
- data/lib/pollett/concerns/controllers/users_controller.rb +28 -0
- data/lib/pollett/concerns/mailers.rb +1 -0
- data/lib/pollett/concerns/mailers/mailer.rb +24 -0
- data/lib/pollett/concerns/models.rb +3 -0
- data/lib/pollett/concerns/models/context.rb +42 -0
- data/lib/pollett/concerns/models/key.rb +13 -0
- data/lib/pollett/concerns/models/session.rb +20 -0
- data/lib/pollett/concerns/serializers.rb +2 -0
- data/lib/pollett/concerns/serializers/context_serializer.rb +21 -0
- data/lib/pollett/concerns/serializers/user_serializer.rb +16 -0
- data/lib/pollett/concerns/services.rb +5 -0
- data/lib/pollett/concerns/services/authenticate_user.rb +21 -0
- data/lib/pollett/concerns/services/change_password.rb +21 -0
- data/lib/pollett/concerns/services/create_session.rb +27 -0
- data/lib/pollett/concerns/services/register_user.rb +29 -0
- data/lib/pollett/concerns/services/reset_password.rb +27 -0
- data/lib/pollett/configuration.rb +34 -0
- data/lib/pollett/engine.rb +12 -0
- data/lib/pollett/rspec.rb +6 -0
- data/lib/pollett/testing/request_helper.rb +106 -0
- data/lib/pollett/version.rb +3 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +12 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/application_mailer.rb +4 -0
- data/spec/dummy/app/models/user.rb +3 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/app/views/layouts/mailer.text.erb +6 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +32 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +85 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/active_model_serializers.rb +1 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/migrate/20150226030314_enable_uuid_extension.rb +5 -0
- data/spec/dummy/db/migrate/20150226030315_create_users.rb +15 -0
- data/spec/dummy/db/migrate/20150226030316_create_pollett_contexts.pollett.rb +22 -0
- data/spec/dummy/db/schema.rb +49 -0
- data/spec/dummy/log/development.log +1315 -0
- data/spec/dummy/log/test.log +181283 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/pollett_context.rb +5 -0
- data/spec/factories/pollett_key.rb +5 -0
- data/spec/factories/pollett_session.rb +5 -0
- data/spec/factories/user.rb +7 -0
- data/spec/mailers/pollett/mailer_spec.rb +73 -0
- data/spec/rails_helper.rb +19 -0
- data/spec/requests/keys_spec.rb +67 -0
- data/spec/requests/sessions_spec.rb +176 -0
- data/spec/requests/user_spec.rb +41 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/support/email_helper.rb +9 -0
- metadata +323 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
class AddPollettToUsers < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
change_table :users do |t|
|
4
|
+
<% config[:new_columns].values.each do |column| -%>
|
5
|
+
<%= column %>
|
6
|
+
<% end -%>
|
7
|
+
end
|
8
|
+
|
9
|
+
<% config[:new_indexes].values.each do |index| -%>
|
10
|
+
<%= index %>
|
11
|
+
<% end -%>
|
12
|
+
end
|
13
|
+
|
14
|
+
def down
|
15
|
+
change_table :users do |t|
|
16
|
+
<% if config[:new_columns].any? -%>
|
17
|
+
t.remove <%= new_columns.keys.map { |column| ":#{column}" }.join(",") %>
|
18
|
+
<% end -%>
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class CreateUsers < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :users, id: :uuid do |t|
|
4
|
+
t.string :name, null: false
|
5
|
+
t.string :email, null: false
|
6
|
+
t.string :password_digest, null: false
|
7
|
+
t.string :reset_token
|
8
|
+
|
9
|
+
t.timestamps null: false
|
10
|
+
end
|
11
|
+
|
12
|
+
add_index :users, :email, unique: true
|
13
|
+
add_index :users, :reset_token, unique: true
|
14
|
+
end
|
15
|
+
end
|
data/lib/pollett.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require "active_model_serializers"
|
2
|
+
require "servitore"
|
3
|
+
|
4
|
+
require "pollett/concerns"
|
5
|
+
require "pollett/configuration"
|
6
|
+
require "pollett/engine"
|
7
|
+
|
8
|
+
module Pollett
|
9
|
+
Unauthorized = Class.new(StandardError)
|
10
|
+
|
11
|
+
TOKEN_LENGTH = 32
|
12
|
+
|
13
|
+
def self.generate_token(length = TOKEN_LENGTH)
|
14
|
+
SecureRandom.urlsafe_base64(length)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.reset_url(token)
|
18
|
+
config.reset_url.call(token)
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Pollett
|
2
|
+
module Concerns
|
3
|
+
module Controllers
|
4
|
+
module KeysController
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
def index
|
8
|
+
render_list(scoped)
|
9
|
+
end
|
10
|
+
|
11
|
+
def create
|
12
|
+
key = current_user.keys.create!(safe_params)
|
13
|
+
render json: key, status: :created
|
14
|
+
end
|
15
|
+
|
16
|
+
def show
|
17
|
+
key = scoped.find(params[:id])
|
18
|
+
render json: key, status: :ok
|
19
|
+
end
|
20
|
+
|
21
|
+
def destroy
|
22
|
+
scoped.find(params[:id]).revoke!
|
23
|
+
head :no_content
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def safe_params
|
28
|
+
params.permit(:client)
|
29
|
+
end
|
30
|
+
|
31
|
+
def scoped
|
32
|
+
current_user.keys.active
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Pollett
|
2
|
+
module Concerns
|
3
|
+
module Controllers
|
4
|
+
module SessionsController
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
skip_authentication only: [:create, :forgot]
|
9
|
+
end
|
10
|
+
|
11
|
+
def index
|
12
|
+
render_list(scoped)
|
13
|
+
end
|
14
|
+
|
15
|
+
def show
|
16
|
+
session = scoped.find(params[:id])
|
17
|
+
render json: session, status: :ok
|
18
|
+
end
|
19
|
+
|
20
|
+
def create
|
21
|
+
session = CreateSession.call(params)
|
22
|
+
activate_context(session)
|
23
|
+
render json: session, status: :created
|
24
|
+
end
|
25
|
+
|
26
|
+
def forgot
|
27
|
+
ResetPassword.call(params)
|
28
|
+
render json: { status: :accepted }, status: :accepted
|
29
|
+
end
|
30
|
+
|
31
|
+
def destroy
|
32
|
+
scoped.find(params[:id]).revoke!
|
33
|
+
head :no_content
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def scoped
|
38
|
+
current_user.sessions.active
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Pollett
|
2
|
+
module Concerns
|
3
|
+
module Controllers
|
4
|
+
module UsersController
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
def show
|
8
|
+
render json: current_user, status: :ok
|
9
|
+
end
|
10
|
+
|
11
|
+
def update
|
12
|
+
current_user.update!(safe_params)
|
13
|
+
render json: current_user, status: :ok
|
14
|
+
end
|
15
|
+
|
16
|
+
def destroy
|
17
|
+
current_user.destroy
|
18
|
+
head :no_content
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def safe_params
|
23
|
+
params.permit(:name, :email, :password)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "pollett/concerns/mailers/mailer"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Pollett
|
2
|
+
module Concerns
|
3
|
+
module Mailers
|
4
|
+
module Mailer
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
default from: Pollett.config.from_email if Pollett.config.from_email
|
9
|
+
end
|
10
|
+
|
11
|
+
def welcome(user)
|
12
|
+
@user = user
|
13
|
+
mail(to: user.email)
|
14
|
+
end
|
15
|
+
|
16
|
+
def reset(user)
|
17
|
+
@user = user
|
18
|
+
@url = Pollett.reset_url(user.reset_token)
|
19
|
+
mail(to: user.email)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Pollett
|
2
|
+
module Concerns
|
3
|
+
module Models
|
4
|
+
module Context
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
belongs_to :user, class_name: Pollett.config.user_model_name
|
9
|
+
|
10
|
+
scope :active, -> { where("((type = 'Pollett::Session' AND accessed_at >= ?) OR (type = 'Pollett::Key')) AND revoked_at IS NULL", Pollett.config.timeout.ago) }
|
11
|
+
end
|
12
|
+
|
13
|
+
module ClassMethods
|
14
|
+
def authenticate(id)
|
15
|
+
active.find_by(id: id)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def revoked
|
20
|
+
revoked_at?
|
21
|
+
end
|
22
|
+
|
23
|
+
def active
|
24
|
+
!revoked
|
25
|
+
end
|
26
|
+
|
27
|
+
def access(request)
|
28
|
+
update({
|
29
|
+
accessed_at: current_time_from_proper_timezone,
|
30
|
+
ip: request.remote_ip,
|
31
|
+
user_agent: request.user_agent
|
32
|
+
})
|
33
|
+
end
|
34
|
+
|
35
|
+
def revoke!
|
36
|
+
self.revoked_at ||= current_time_from_proper_timezone
|
37
|
+
save!
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Pollett
|
2
|
+
module Concerns
|
3
|
+
module Models
|
4
|
+
module Session
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
CLIENT = "App"
|
8
|
+
|
9
|
+
included do
|
10
|
+
before_create :set_client
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
def set_client
|
15
|
+
self.client = CLIENT
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Pollett
|
2
|
+
module Concerns
|
3
|
+
module Serializers
|
4
|
+
module ContextSerializer
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
attributes :client,
|
9
|
+
:active,
|
10
|
+
:ip,
|
11
|
+
:user_agent,
|
12
|
+
:accessed_at,
|
13
|
+
:created_at,
|
14
|
+
:updated_at
|
15
|
+
|
16
|
+
belongs_to :user
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Pollett
|
2
|
+
module Concerns
|
3
|
+
module Services
|
4
|
+
module AuthenticateUser
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
include Servitore::Service
|
8
|
+
|
9
|
+
included do
|
10
|
+
param_reader :email, :password
|
11
|
+
end
|
12
|
+
|
13
|
+
def call
|
14
|
+
Pollett.config.user_model.find_by_normalized_email(email).tap do |u|
|
15
|
+
raise Unauthorized unless u && u.authenticate(password)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Pollett
|
2
|
+
module Concerns
|
3
|
+
module Services
|
4
|
+
module ChangePassword
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
include Servitore::Service
|
8
|
+
|
9
|
+
included do
|
10
|
+
param_reader :token, :password
|
11
|
+
end
|
12
|
+
|
13
|
+
def call
|
14
|
+
Pollett.config.user_model.find_by!(reset_token: token).tap do |u|
|
15
|
+
u.update!(password: password, reset_token: nil)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Pollett
|
2
|
+
module Concerns
|
3
|
+
module Services
|
4
|
+
module CreateSession
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
include Servitore::Service
|
8
|
+
|
9
|
+
def call
|
10
|
+
user = service.call(_params)
|
11
|
+
user.sessions.create!
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
def service
|
16
|
+
@service ||= if _params.key?(:name)
|
17
|
+
Pollett::RegisterUser
|
18
|
+
elsif _params.key?(:token)
|
19
|
+
Pollett::ChangePassword
|
20
|
+
else
|
21
|
+
Pollett::AuthenticateUser
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Pollett
|
2
|
+
module Concerns
|
3
|
+
module Services
|
4
|
+
module RegisterUser
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
include Servitore::Service
|
8
|
+
|
9
|
+
PERMITTED = [:name, :email, :password]
|
10
|
+
|
11
|
+
def call
|
12
|
+
Pollett.config.user_model.create!(safe_params).tap do |user|
|
13
|
+
deliver_email(user) if Pollett.config.send_welcome_email
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
def safe_params
|
19
|
+
permitted = Pollett.config.whitelist | PERMITTED
|
20
|
+
_params.permit(*permitted)
|
21
|
+
end
|
22
|
+
|
23
|
+
def deliver_email(user)
|
24
|
+
Mailer.welcome(user).deliver_later
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|