10557: Always run user setup procedure when is_active becomes true.
authorTom Clegg <tom@curoverse.com>
Wed, 14 Jun 2017 01:02:17 +0000 (21:02 -0400)
committerTom Clegg <tom@curoverse.com>
Wed, 14 Jun 2017 01:02:17 +0000 (21:02 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curoverse.com>

services/api/app/models/user.rb
services/api/test/functional/arvados/v1/users_controller_test.rb

index b654b5a023071f1abe95400a3309964365c7e0af..c4a4f92d306617332e4adcfc4a75227bc3c43a5c 100644 (file)
@@ -20,6 +20,9 @@ class User < ArvadosModel
   before_update :verify_repositories_empty, :if => Proc.new { |user|
     user.username.nil? and user.username_changed?
   }
+  before_update :setup_on_activate, :if => Proc.new { |user|
+    ![system_user_uuid, anonymous_user_uuid].include?(user.uuid)
+  }
   before_create :check_auto_admin
   before_create :set_initial_username, :if => Proc.new { |user|
     user.username.nil? and user.email
@@ -461,6 +464,14 @@ class User < ArvadosModel
     end
   end
 
+  # Automatically setup if is_active flag turns on
+  def setup_on_activate
+    return if [system_user_uuid, anonymous_user_uuid].include?(self.uuid)
+    if is_active && (new_record? || is_active_changed?)
+      setup(openid_prefix: Rails.configuration.default_openid_prefix)
+    end
+  end
+
   # Automatically setup new user during creation
   def auto_setup_new_user
     setup(openid_prefix: Rails.configuration.default_openid_prefix)
index f98e482dd84a190fb08f3e606be45835119f986f..789242f6e02e9080790f2e37f52d8040df1f8ac1 100644 (file)
@@ -660,6 +660,24 @@ class Arvados::V1::UsersControllerTest < ActionController::TestCase
     assert (setup_email.body.to_s.include? "#{Rails.configuration.workbench_address}users/#{created['uuid']}/virtual_machines"), 'Expected virtual machines url in email body'
   end
 
+  test "setup inactive user by changing is_active to true" do
+    authorize_with :admin
+    active_user = users(:active)
+
+    # invoke setup with a repository
+    put :update, {
+          id: active_user['uuid'],
+          user: {
+            is_active: true,
+          }
+        }
+    assert_response :success
+    assert_equal active_user['uuid'], json_response['uuid']
+    updated = User.where(uuid: active_user['uuid']).first
+    assert_equal(true, updated.is_active)
+    assert_equal({read: true}, updated.group_permissions[all_users_group_uuid])
+  end
+
   test "non-admin user can get basic information about readable users" do
     authorize_with :spectator
     get(:index)