X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/cd8f854549cf8224cfee5b42667869664dcf6e80..70d97b98ddf977505069795ef08236fb439b18e1:/services/api/app/models/user.rb?ds=sidebyside diff --git a/services/api/app/models/user.rb b/services/api/app/models/user.rb index 1d1d83662c..1662278cc3 100644 --- a/services/api/app/models/user.rb +++ b/services/api/app/models/user.rb @@ -24,6 +24,7 @@ class User < ArvadosModel validate :identity_url_nil_if_empty before_update :prevent_privilege_escalation before_update :prevent_inactive_admin + before_update :prevent_nonadmin_system_root before_update :verify_repositories_empty, :if => Proc.new { username.nil? and username_changed? } @@ -72,6 +73,8 @@ class User < ArvadosModel t.add :is_invited t.add :prefs t.add :writable_by + t.add :can_write + t.add :can_manage end ALL_PERMISSIONS = {read: true, write: true, manage: true} @@ -121,6 +124,14 @@ class User < ArvadosModel end next if target_uuid == self.uuid + if action == :write && target && !target.new_record? && + target.respond_to?(:frozen_by_uuid) && + target.frozen_by_uuid_was + # Just an optimization to skip the PERMISSION_VIEW and + # FrozenGroup queries below + return false + end + target_owner_uuid = target.owner_uuid if target.respond_to? :owner_uuid user_uuids_subquery = USER_UUIDS_SUBQUERY_TEMPLATE % {user: "$1", perm_level: "$3"} @@ -291,6 +302,10 @@ SELECT target_uuid, perm_level # delete user signatures, login, repo, and vm perms, and mark as inactive def unsetup + if self.uuid == system_user_uuid + raise "System root user cannot be deactivated" + end + # delete oid_login_perms for this user # # note: these permission links are obsolete, they have no effect @@ -335,6 +350,11 @@ SELECT target_uuid, perm_level self.save! end + # Called from ArvadosModel + def set_default_owner + self.owner_uuid = system_user_uuid + end + def must_unsetup_to_deactivate if !self.new_record? && self.uuid[0..4] == Rails.configuration.Login.LoginCluster && @@ -581,6 +601,13 @@ SELECT target_uuid, perm_level protected + def self.attributes_required_columns + super.merge( + 'can_write' => ['owner_uuid', 'uuid'], + 'can_manage' => ['owner_uuid', 'uuid'], + ) + end + def change_all_uuid_refs(old_uuid:, new_uuid:) ActiveRecord::Base.descendants.reject(&:abstract_class?).each do |klass| klass.columns.each do |col| @@ -685,6 +712,13 @@ SELECT target_uuid, perm_level true end + def prevent_nonadmin_system_root + if self.uuid == system_user_uuid and self.is_admin_changed? and !self.is_admin + raise "System root user cannot be non-admin" + end + true + end + def search_permissions(start, graph, merged={}, upstream_mask=nil, upstream_path={}) nextpaths = graph[start] return merged if !nextpaths