openstax_accounts 8.1.0 → 9.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 +4 -4
- data/app/controllers/openstax/accounts/application_controller.rb +0 -4
- data/app/controllers/openstax/accounts/dev/accounts_controller.rb +16 -10
- data/app/controllers/openstax/accounts/dev/base_controller.rb +1 -5
- data/app/controllers/openstax/accounts/sessions_controller.rb +3 -7
- data/app/handlers/openstax/accounts/accounts_search.rb +3 -5
- data/app/handlers/openstax/accounts/dev/accounts_create.rb +1 -7
- data/app/handlers/openstax/accounts/dev/accounts_search.rb +0 -2
- data/app/handlers/openstax/accounts/sessions_callback.rb +2 -4
- data/app/models/openstax/accounts/account.rb +1 -19
- data/app/models/openstax/accounts/anonymous_account.rb +1 -2
- data/app/routines/openstax/accounts/dev/create_account.rb +23 -21
- data/app/routines/openstax/accounts/find_or_create_account.rb +9 -18
- data/app/routines/openstax/accounts/find_or_create_from_sso.rb +2 -8
- data/app/routines/openstax/accounts/sync_accounts.rb +1 -6
- data/app/views/layouts/openstax/accounts/application.html.erb +2 -2
- data/app/views/openstax/accounts/dev/accounts/_search_results.html.erb +9 -10
- data/app/views/openstax/accounts/dev/accounts/index.html.erb +7 -10
- data/app/views/openstax/accounts/dev/accounts/{search.js.erb → index.js.erb} +0 -0
- data/app/views/openstax/accounts/shared/_attention.html.erb +9 -1
- data/app/views/openstax/accounts/shared/accounts/_search.html.erb +12 -8
- data/config/routes.rb +2 -5
- data/db/migrate/14_drop_openstax_uid_and_username_uniqueness.rb +9 -0
- data/db/migrate/15_drop_accounts_groups.rb +42 -0
- data/lib/omniauth/strategies/openstax.rb +1 -1
- data/lib/openstax/accounts/api.rb +0 -149
- data/lib/openstax/accounts/configuration.rb +4 -4
- data/lib/openstax/accounts/current_user_manager.rb +1 -5
- data/lib/openstax/accounts/engine.rb +1 -1
- data/lib/openstax/accounts/sso.rb +4 -3
- data/lib/openstax/accounts/version.rb +1 -1
- data/lib/tasks/sync.rake +0 -8
- metadata +9 -25
- data/app/models/openstax/accounts/application_group.rb +0 -7
- data/app/models/openstax/accounts/group.rb +0 -169
- data/app/models/openstax/accounts/group_member.rb +0 -37
- data/app/models/openstax/accounts/group_nesting.rb +0 -55
- data/app/models/openstax/accounts/group_owner.rb +0 -37
- data/app/representers/openstax/accounts/api/v1/application_group_representer.rb +0 -48
- data/app/representers/openstax/accounts/api/v1/application_groups_representer.rb +0 -20
- data/app/representers/openstax/accounts/api/v1/group_nesting_representer.rb +0 -31
- data/app/representers/openstax/accounts/api/v1/group_representer.rb +0 -71
- data/app/representers/openstax/accounts/api/v1/group_user_representer.rb +0 -34
- data/app/routines/openstax/accounts/create_group.rb +0 -26
- data/app/routines/openstax/accounts/sync_groups.rb +0 -67
- data/app/routines/openstax/accounts/update_group_caches.rb +0 -27
- data/lib/openstax/accounts/has_many_through_groups/active_record/base.rb +0 -51
- data/spec/factories/openstax_accounts_group.rb +0 -7
- data/spec/factories/openstax_accounts_group_member.rb +0 -6
- data/spec/factories/openstax_accounts_group_nesting.rb +0 -6
- data/spec/factories/openstax_accounts_group_owner.rb +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94c7f3a9d37b020069be2c39b96a1f7beacb918d50e87aa84d70fe24d437025c
|
4
|
+
data.tar.gz: 9a857efcee527418bd4287d6b8a61c369fa424541358de01b3dc41f1ae8e3aa7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 831790e591d38994596ff471d0828b773a8fd770253bf7040ed4c1106b2979e944b9a5ce5777cc89271c552cdb8fb50b7cfb239e316b1251713fe81f960e9237
|
7
|
+
data.tar.gz: fa14a2404033df1bc6131f6a1b91c134c98bda24d16af737f3442b52ea9b3de1c1933f463ac7c46060cef64fac02e73628990d936f35a7a0bdf1b93a99d6290c
|
@@ -1,8 +1,6 @@
|
|
1
1
|
module OpenStax
|
2
2
|
module Accounts
|
3
|
-
|
4
3
|
class ApplicationController < ::ActionController::Base
|
5
|
-
|
6
4
|
include Lev::HandleWith
|
7
5
|
|
8
6
|
skip_before_action :authenticate_user!, raise: false
|
@@ -10,8 +8,6 @@ module OpenStax
|
|
10
8
|
def configuration
|
11
9
|
OpenStax::Accounts.configuration
|
12
10
|
end
|
13
|
-
|
14
11
|
end
|
15
|
-
|
16
12
|
end
|
17
13
|
end
|
@@ -3,23 +3,30 @@ module OpenStax
|
|
3
3
|
module Dev
|
4
4
|
class AccountsController < OpenStax::Accounts::Dev::BaseController
|
5
5
|
# Allow accessing from inside an iframe
|
6
|
-
before_action :allow_iframe_access, only:
|
6
|
+
before_action :allow_iframe_access, only: :index
|
7
7
|
|
8
8
|
def index
|
9
|
-
|
10
|
-
|
11
|
-
def search
|
12
|
-
handle_with(AccountsSearch)
|
9
|
+
handle_with AccountsSearch
|
13
10
|
end
|
14
11
|
|
15
12
|
def create
|
16
|
-
handle_with(
|
17
|
-
|
13
|
+
handle_with(
|
14
|
+
AccountsCreate,
|
15
|
+
success: -> do
|
16
|
+
username = @handler_result.outputs.account.username
|
17
|
+
flash.notice = "Account with username \"#{username}\" created."
|
18
|
+
redirect_to dev_accounts_path(search: { query: username })
|
19
|
+
end,
|
20
|
+
failure: -> do
|
21
|
+
flash.alert = @handler_result.errors.first.translate
|
22
|
+
redirect_to dev_accounts_path(search: { query: params.dig(:create, :username) })
|
23
|
+
end
|
24
|
+
)
|
18
25
|
end
|
19
26
|
|
20
27
|
def become
|
21
|
-
@account = Account.
|
22
|
-
sign_in
|
28
|
+
@account = Account.find(params[:id])
|
29
|
+
sign_in @account
|
23
30
|
redirect_back key: :accounts_return_to, strategies: [:session]
|
24
31
|
end
|
25
32
|
|
@@ -28,7 +35,6 @@ module OpenStax
|
|
28
35
|
def allow_iframe_access
|
29
36
|
response.headers.except! 'X-Frame-Options'
|
30
37
|
end
|
31
|
-
|
32
38
|
end
|
33
39
|
end
|
34
40
|
end
|
@@ -2,11 +2,7 @@ module OpenStax
|
|
2
2
|
module Accounts
|
3
3
|
module Dev
|
4
4
|
class BaseController < OpenStax::Accounts::ApplicationController
|
5
|
-
|
6
|
-
before_action do
|
7
|
-
raise SecurityTransgression if Rails.env.production?
|
8
|
-
end
|
9
|
-
|
5
|
+
before_action { raise SecurityTransgression if Rails.env.production? }
|
10
6
|
end
|
11
7
|
end
|
12
8
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module OpenStax
|
2
2
|
module Accounts
|
3
3
|
class SessionsController < OpenStax::Accounts::ApplicationController
|
4
|
-
|
5
4
|
def new
|
6
5
|
if configuration.is_return_to_url_approved?(params[:return_to])
|
7
6
|
store_url url: params[:return_to], key: :accounts_return_to, strategies: [:session]
|
@@ -11,8 +10,7 @@ module OpenStax
|
|
11
10
|
if configuration.enable_stubbing?
|
12
11
|
redirect_to dev_accounts_path
|
13
12
|
else
|
14
|
-
forwardable_params =
|
15
|
-
params.permit(*configuration.forwardable_login_param_keys.map(&:to_s)).to_h
|
13
|
+
forwardable_params = params.permit(*configuration.forwardable_login_params).to_h
|
16
14
|
redirect_to openstax_login_path(forwardable_params)
|
17
15
|
end
|
18
16
|
end
|
@@ -40,15 +38,13 @@ module OpenStax
|
|
40
38
|
end
|
41
39
|
|
42
40
|
def failure
|
43
|
-
redirect_back key: :accounts_return_to,
|
44
|
-
alert: "Authentication failed, please try again."
|
41
|
+
redirect_back key: :accounts_return_to, alert: 'Authentication failed, please try again.'
|
45
42
|
end
|
46
43
|
|
47
44
|
def profile
|
48
45
|
# TODO: stub profile if stubbing is enabled
|
49
|
-
redirect_to URI.join(configuration.openstax_accounts_url,
|
46
|
+
redirect_to URI.join(configuration.openstax_accounts_url, '/profile').to_s
|
50
47
|
end
|
51
|
-
|
52
48
|
end
|
53
49
|
end
|
54
50
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module OpenStax
|
2
2
|
module Accounts
|
3
3
|
class AccountsSearch
|
4
|
-
|
5
4
|
lev_handler
|
6
5
|
|
7
6
|
paramify :search do
|
@@ -50,17 +49,16 @@ module OpenStax
|
|
50
49
|
page: search_params.page,
|
51
50
|
per_page: search_params.per_page}
|
52
51
|
out = run(OpenStax::Accounts::SearchAccounts, params).outputs
|
53
|
-
outputs
|
52
|
+
outputs.total_count = out.total_count
|
54
53
|
|
55
|
-
if !@max_items.nil? && outputs
|
54
|
+
if !@max_items.nil? && outputs.total_count > @max_items
|
56
55
|
fatal_error(code: :too_many_items,
|
57
56
|
message: "The number of matches exceeded the allowed limit of #{
|
58
57
|
@max_items} matches. Please refine your query and try again.")
|
59
58
|
end
|
60
59
|
|
61
|
-
outputs
|
60
|
+
outputs.items = out.items.to_a
|
62
61
|
end
|
63
|
-
|
64
62
|
end
|
65
63
|
end
|
66
64
|
end
|
@@ -1,21 +1,17 @@
|
|
1
1
|
module OpenStax
|
2
2
|
module Accounts
|
3
|
-
|
4
3
|
module Dev
|
5
4
|
class AccountsCreate
|
6
|
-
|
7
5
|
lev_handler
|
8
6
|
|
9
7
|
paramify :create do
|
10
8
|
attribute :username, type: String
|
11
|
-
validates :username, presence: true
|
12
9
|
attribute :role, type: String
|
13
10
|
end
|
14
11
|
|
15
12
|
uses_routine OpenStax::Accounts::Dev::CreateAccount,
|
16
13
|
as: :create_account,
|
17
|
-
translations: { inputs: { scope: :create },
|
18
|
-
outputs: { type: :verbatim } }
|
14
|
+
translations: { inputs: { scope: :create }, outputs: { type: :verbatim } }
|
19
15
|
|
20
16
|
protected
|
21
17
|
|
@@ -26,9 +22,7 @@ module OpenStax
|
|
26
22
|
def handle
|
27
23
|
run(:create_account, create_params.as_hash(:username, :role))
|
28
24
|
end
|
29
|
-
|
30
25
|
end
|
31
26
|
end
|
32
|
-
|
33
27
|
end
|
34
28
|
end
|
@@ -2,7 +2,6 @@ module OpenStax
|
|
2
2
|
module Accounts
|
3
3
|
module Dev
|
4
4
|
class AccountsSearch < OpenStax::Accounts::AccountsSearch
|
5
|
-
|
6
5
|
paramify :search do
|
7
6
|
attribute :type, type: String
|
8
7
|
attribute :query, type: String
|
@@ -21,7 +20,6 @@ module OpenStax
|
|
21
20
|
def authorized?
|
22
21
|
!Rails.env.production?
|
23
22
|
end
|
24
|
-
|
25
23
|
end
|
26
24
|
end
|
27
25
|
end
|
@@ -15,15 +15,13 @@ module OpenStax
|
|
15
15
|
|
16
16
|
def handle
|
17
17
|
# Don't worry if the account is logged in or not beforehand. Just assume that they aren't.
|
18
|
-
|
19
18
|
# tap is used because we want the block to always run (not just when initializing)
|
20
19
|
begin
|
21
|
-
outputs.account = Account.find_or_initialize_by(
|
22
|
-
openstax_uid: @auth_data.uid
|
23
|
-
).tap do |account|
|
20
|
+
outputs.account = Account.find_or_initialize_by(uuid: @auth_data.uid).tap do |account|
|
24
21
|
account.access_token = @auth_data.credentials.token
|
25
22
|
|
26
23
|
raw_info = @auth_data.extra.raw_info
|
24
|
+
raw_info = raw_info.merge openstax_uid: raw_info[:id]
|
27
25
|
OpenStax::Accounts::Account::SYNC_ATTRIBUTES.each do |attribute|
|
28
26
|
begin
|
29
27
|
account.send "#{attribute}=", raw_info[attribute]
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module OpenStax::Accounts
|
2
2
|
class Account < ActiveRecord::Base
|
3
|
-
|
4
3
|
USERNAME_DISCARDED_CHAR_REGEX = /[^A-Za-z\d_]/
|
5
4
|
USERNAME_MAX_LENGTH = 50
|
6
5
|
SYNC_ATTRIBUTES = [
|
6
|
+
:openstax_uid,
|
7
7
|
:username,
|
8
8
|
:first_name,
|
9
9
|
:last_name,
|
@@ -13,27 +13,12 @@ module OpenStax::Accounts
|
|
13
13
|
:faculty_status,
|
14
14
|
:school_type,
|
15
15
|
:salesforce_contact_id,
|
16
|
-
:uuid,
|
17
16
|
:support_identifier,
|
18
17
|
:is_test
|
19
18
|
]
|
20
19
|
|
21
20
|
attr_accessor :syncing
|
22
21
|
|
23
|
-
has_many :group_owners, dependent: :destroy,
|
24
|
-
class_name: 'OpenStax::Accounts::GroupOwner',
|
25
|
-
primary_key: :openstax_uid,
|
26
|
-
foreign_key: :user_id,
|
27
|
-
inverse_of: :user
|
28
|
-
has_many :groups_as_owner, through: :group_owners, source: :group
|
29
|
-
|
30
|
-
has_many :group_members, dependent: :destroy,
|
31
|
-
class_name: 'OpenStax::Accounts::GroupMember',
|
32
|
-
primary_key: :openstax_uid,
|
33
|
-
foreign_key: :user_id,
|
34
|
-
inverse_of: :user
|
35
|
-
has_many :groups_as_member, through: :group_members, source: :group
|
36
|
-
|
37
22
|
enum faculty_status: [:no_faculty_info, :pending_faculty, :confirmed_faculty, :rejected_faculty]
|
38
23
|
enum role: [
|
39
24
|
:unknown_role,
|
@@ -50,8 +35,6 @@ module OpenStax::Accounts
|
|
50
35
|
|
51
36
|
validates :faculty_status, :role, :school_type, presence: true
|
52
37
|
|
53
|
-
validates :openstax_uid, uniqueness: { allow_nil: true }
|
54
|
-
validates :username, uniqueness: { allow_nil: true }
|
55
38
|
validates :uuid, presence: true, uniqueness: true
|
56
39
|
validates :support_identifier, uniqueness: { allow_nil: true }
|
57
40
|
|
@@ -98,6 +81,5 @@ module OpenStax::Accounts
|
|
98
81
|
def update_openstax_accounts
|
99
82
|
OpenStax::Accounts::Api.update_account(self)
|
100
83
|
end
|
101
|
-
|
102
84
|
end
|
103
85
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module OpenStax
|
2
2
|
module Accounts
|
3
3
|
class AnonymousAccount < Account
|
4
|
-
|
5
4
|
include Singleton
|
6
5
|
|
7
6
|
before_save { false }
|
@@ -9,6 +8,7 @@ module OpenStax
|
|
9
8
|
def initialize(attributes=nil)
|
10
9
|
super
|
11
10
|
self.id = nil
|
11
|
+
self.uuid = nil
|
12
12
|
self.openstax_uid = nil
|
13
13
|
self.username = 'anonymous'
|
14
14
|
self.first_name = 'Guest'
|
@@ -18,7 +18,6 @@ module OpenStax
|
|
18
18
|
def is_anonymous?
|
19
19
|
true
|
20
20
|
end
|
21
|
-
|
22
21
|
end
|
23
22
|
end
|
24
23
|
end
|
@@ -1,5 +1,4 @@
|
|
1
|
-
# Routine for creating an account, only for use when stubbing and
|
2
|
-
# not on production.
|
1
|
+
# Routine for creating an account, only for use when stubbing and not on production.
|
3
2
|
|
4
3
|
module OpenStax
|
5
4
|
module Accounts
|
@@ -11,30 +10,33 @@ module OpenStax
|
|
11
10
|
|
12
11
|
def exec(inputs={})
|
13
12
|
fatal_error(code: :cannot_create_account_in_production) if Rails.env.production?
|
14
|
-
fatal_error(code: :can_only_create_account_when_stubbing)
|
13
|
+
fatal_error(code: :can_only_create_account_when_stubbing) \
|
14
|
+
unless OpenStax::Accounts.configuration.enable_stubbing?
|
15
15
|
|
16
16
|
username = inputs[:username]
|
17
|
-
|
18
|
-
username
|
17
|
+
if username.blank?
|
18
|
+
while username.blank? || Account.where(username: username).exists? do
|
19
|
+
username = SecureRandom.hex(3).to_s
|
20
|
+
end
|
21
|
+
else
|
22
|
+
fatal_error(
|
23
|
+
code: :account_already_exists,
|
24
|
+
message: "One or more accounts with username \"#{username}\" already exist."
|
25
|
+
) if Account.where(username: username).exists?
|
19
26
|
end
|
20
27
|
|
21
|
-
account = OpenStax::Accounts::Account.
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
account
|
32
|
-
|
33
|
-
transfer_errors_from(account, {type: :verbatim}, true)
|
34
|
-
|
35
|
-
outputs[:account] = account
|
28
|
+
outputs.account = OpenStax::Accounts::Account.create(
|
29
|
+
openstax_uid: -SecureRandom.hex(4).to_i(16)/2,
|
30
|
+
access_token: SecureRandom.hex.to_s,
|
31
|
+
username: username,
|
32
|
+
role: inputs[:role] || :unknown_role,
|
33
|
+
uuid: SecureRandom.uuid,
|
34
|
+
support_identifier: "cs_#{SecureRandom.hex(4)}",
|
35
|
+
is_test: true
|
36
|
+
)
|
37
|
+
|
38
|
+
transfer_errors_from(outputs.account, {type: :verbatim}, true)
|
36
39
|
end
|
37
|
-
|
38
40
|
end
|
39
41
|
end
|
40
42
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module OpenStax
|
2
2
|
module Accounts
|
3
3
|
class FindOrCreateAccount
|
4
|
-
|
5
4
|
lev_routine
|
6
5
|
|
7
6
|
protected
|
@@ -16,31 +15,27 @@ module OpenStax
|
|
16
15
|
|
17
16
|
if OpenStax::Accounts.configuration.enable_stubbing
|
18
17
|
# We can only stub finding by username b/c accounts-rails doesn't persist emails
|
19
|
-
|
20
|
-
|
21
|
-
uuid = SecureRandom.uuid
|
18
|
+
uuid = Account.find_by(username: username)&.uuid || SecureRandom.uuid
|
19
|
+
openstax_uid = -SecureRandom.hex(4).to_i(16)/2
|
22
20
|
support_identifier = "cs_#{SecureRandom.hex(4)}"
|
23
21
|
else
|
24
|
-
response = Api.find_or_create_account(
|
22
|
+
response = OpenStax::Accounts::Api.find_or_create_account(
|
25
23
|
email: email, username: username, password: password,
|
26
24
|
first_name: first_name, last_name: last_name, full_name: full_name,
|
27
25
|
salesforce_contact_id: salesforce_contact_id, faculty_status: faculty_status,
|
28
|
-
role: role, school_type: school_type, is_test: is_test
|
26
|
+
role: role, school_type: school_type, is_test: is_test
|
27
|
+
)
|
29
28
|
fatal_error(code: :invalid_inputs) unless (200..202).include?(response.status)
|
30
29
|
|
31
30
|
struct = OpenStruct.new
|
32
31
|
Api::V1::UnclaimedAccountRepresenter.new(struct).from_json(response.body)
|
33
|
-
|
32
|
+
openstax_uid = struct.id
|
34
33
|
uuid = struct.uuid
|
35
34
|
support_identifier = struct.support_identifier
|
36
35
|
end
|
37
36
|
|
38
|
-
account = Account.
|
39
|
-
|
40
|
-
unless account.persisted?
|
41
|
-
while username.nil? || Account.where(username: username).exists? do
|
42
|
-
username = SecureRandom.hex(3).to_s
|
43
|
-
end
|
37
|
+
outputs.account = Account.find_or_create_by(uuid: uuid) do |account|
|
38
|
+
account.openstax_uid = openstax_uid
|
44
39
|
account.username = username
|
45
40
|
account.first_name = first_name
|
46
41
|
account.last_name = last_name
|
@@ -50,16 +45,12 @@ module OpenStax
|
|
50
45
|
account.faculty_status = faculty_status || :no_faculty_info
|
51
46
|
account.role = role || :unknown_role
|
52
47
|
account.school_type = school_type || :unknown_school_type
|
53
|
-
account.uuid = uuid
|
54
48
|
account.support_identifier = support_identifier
|
55
49
|
account.is_test = is_test
|
56
|
-
account.save!
|
57
50
|
end
|
58
51
|
|
59
|
-
transfer_errors_from
|
60
|
-
outputs.account = account
|
52
|
+
transfer_errors_from outputs.account, { type: :verbatim }, true
|
61
53
|
end
|
62
|
-
|
63
54
|
end
|
64
55
|
end
|
65
56
|
end
|
@@ -1,23 +1,17 @@
|
|
1
1
|
module OpenStax
|
2
2
|
module Accounts
|
3
3
|
class FindOrCreateFromSso
|
4
|
-
|
5
4
|
lev_routine express_output: :account
|
6
5
|
|
7
6
|
def exec(attrs)
|
8
7
|
attrs.stringify_keys!
|
9
8
|
uid = attrs.delete('id')
|
10
9
|
uuid = attrs.delete('uuid')
|
11
|
-
account = Account.find_or_initialize_by(
|
12
|
-
|
13
|
-
)
|
14
|
-
account.update_attributes!(
|
15
|
-
attrs.slice(*Account.column_names)
|
16
|
-
)
|
10
|
+
account = Account.find_or_initialize_by(uuid: uuid)
|
11
|
+
account.update_attributes!(attrs.slice(*Account.column_names))
|
17
12
|
transfer_errors_from(account, {type: :verbatim})
|
18
13
|
outputs.account = account
|
19
14
|
end
|
20
|
-
|
21
15
|
end
|
22
16
|
end
|
23
17
|
end
|