openstax_accounts 8.1.0 → 9.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/openstax/accounts/application_controller.rb +0 -4
  3. data/app/controllers/openstax/accounts/dev/accounts_controller.rb +16 -10
  4. data/app/controllers/openstax/accounts/dev/base_controller.rb +1 -5
  5. data/app/controllers/openstax/accounts/sessions_controller.rb +3 -7
  6. data/app/handlers/openstax/accounts/accounts_search.rb +3 -5
  7. data/app/handlers/openstax/accounts/dev/accounts_create.rb +1 -7
  8. data/app/handlers/openstax/accounts/dev/accounts_search.rb +0 -2
  9. data/app/handlers/openstax/accounts/sessions_callback.rb +2 -4
  10. data/app/models/openstax/accounts/account.rb +1 -19
  11. data/app/models/openstax/accounts/anonymous_account.rb +1 -2
  12. data/app/routines/openstax/accounts/dev/create_account.rb +23 -21
  13. data/app/routines/openstax/accounts/find_or_create_account.rb +9 -18
  14. data/app/routines/openstax/accounts/find_or_create_from_sso.rb +2 -8
  15. data/app/routines/openstax/accounts/sync_accounts.rb +1 -6
  16. data/app/views/layouts/openstax/accounts/application.html.erb +2 -2
  17. data/app/views/openstax/accounts/dev/accounts/_search_results.html.erb +9 -10
  18. data/app/views/openstax/accounts/dev/accounts/index.html.erb +7 -10
  19. data/app/views/openstax/accounts/dev/accounts/{search.js.erb → index.js.erb} +0 -0
  20. data/app/views/openstax/accounts/shared/_attention.html.erb +9 -1
  21. data/app/views/openstax/accounts/shared/accounts/_search.html.erb +12 -8
  22. data/config/routes.rb +2 -5
  23. data/db/migrate/14_drop_openstax_uid_and_username_uniqueness.rb +9 -0
  24. data/db/migrate/15_drop_accounts_groups.rb +42 -0
  25. data/lib/omniauth/strategies/openstax.rb +1 -1
  26. data/lib/openstax/accounts/api.rb +0 -149
  27. data/lib/openstax/accounts/configuration.rb +4 -4
  28. data/lib/openstax/accounts/current_user_manager.rb +1 -5
  29. data/lib/openstax/accounts/engine.rb +1 -1
  30. data/lib/openstax/accounts/sso.rb +4 -3
  31. data/lib/openstax/accounts/version.rb +1 -1
  32. data/lib/tasks/sync.rake +0 -8
  33. metadata +9 -25
  34. data/app/models/openstax/accounts/application_group.rb +0 -7
  35. data/app/models/openstax/accounts/group.rb +0 -169
  36. data/app/models/openstax/accounts/group_member.rb +0 -37
  37. data/app/models/openstax/accounts/group_nesting.rb +0 -55
  38. data/app/models/openstax/accounts/group_owner.rb +0 -37
  39. data/app/representers/openstax/accounts/api/v1/application_group_representer.rb +0 -48
  40. data/app/representers/openstax/accounts/api/v1/application_groups_representer.rb +0 -20
  41. data/app/representers/openstax/accounts/api/v1/group_nesting_representer.rb +0 -31
  42. data/app/representers/openstax/accounts/api/v1/group_representer.rb +0 -71
  43. data/app/representers/openstax/accounts/api/v1/group_user_representer.rb +0 -34
  44. data/app/routines/openstax/accounts/create_group.rb +0 -26
  45. data/app/routines/openstax/accounts/sync_groups.rb +0 -67
  46. data/app/routines/openstax/accounts/update_group_caches.rb +0 -27
  47. data/lib/openstax/accounts/has_many_through_groups/active_record/base.rb +0 -51
  48. data/spec/factories/openstax_accounts_group.rb +0 -7
  49. data/spec/factories/openstax_accounts_group_member.rb +0 -6
  50. data/spec/factories/openstax_accounts_group_nesting.rb +0 -6
  51. 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: 5f7776ce8e75c51c3a8b3435712dc37aab19225584f25c99f82ce6bd92042350
4
- data.tar.gz: fac871ea9ca585e3b5e02d46bd37fe6b462ed80283cf23881e551c92d25e9297
3
+ metadata.gz: 94c7f3a9d37b020069be2c39b96a1f7beacb918d50e87aa84d70fe24d437025c
4
+ data.tar.gz: 9a857efcee527418bd4287d6b8a61c369fa424541358de01b3dc41f1ae8e3aa7
5
5
  SHA512:
6
- metadata.gz: 90ed74a62cb7a299c8ef064accfc52e295a3baa334a110ac8020e02bebf61408f846e3b278124ebb0feb921bf3f32ea4d2551e01a4fb42a9e14b30d9b1169720
7
- data.tar.gz: 882b93e2e815f42e1942fafaca8754787b1a86538ba46bb5604dc313b5da8a370fd2708c7cd268a24ee434de0961691af336dd30b45b5b5bbd9440f0a38ee6ed
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: [:index, :search]
6
+ before_action :allow_iframe_access, only: :index
7
7
 
8
8
  def index
9
- end
10
-
11
- def search
12
- handle_with(AccountsSearch)
9
+ handle_with AccountsSearch
13
10
  end
14
11
 
15
12
  def create
16
- handle_with(AccountsCreate,
17
- complete: lambda { redirect_to dev_accounts_path })
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.find_by(openstax_uid: params[:id])
22
- sign_in(@account)
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, "/profile").to_s
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[:total_count] = out[:total_count]
52
+ outputs.total_count = out.total_count
54
53
 
55
- if !@max_items.nil? && outputs[:total_count] > @max_items
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[:items] = out[:items].to_a
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) if !OpenStax::Accounts.configuration.enable_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
- while username.nil? || Account.where(username: username).exists? do
18
- username = SecureRandom.hex(3).to_s
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.new
22
-
23
- account.openstax_uid = -SecureRandom.hex(4).to_i(16)/2
24
- account.access_token = SecureRandom.hex.to_s
25
- account.username = username
26
- account.role = inputs[:role] || :unknown_role
27
- account.uuid = SecureRandom.uuid
28
- account.support_identifier = "cs_#{SecureRandom.hex(4)}"
29
- account.is_test = true
30
-
31
- account.save
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
- id = Account.find_by(username: username).try!(:openstax_uid) ||
20
- -SecureRandom.hex(4).to_i(16)/2
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
- id = struct.id
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.find_or_initialize_by(openstax_uid: id)
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(account, {type: :verbatim}, true)
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
- uuid: uuid, openstax_uid: uid
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