X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d81ea65da05119d5c6480d373b5d42bbee8ae1ad..6b17ef224b600b3ce889546d648df43d8aea81f4:/services/api/app/models/user.rb diff --git a/services/api/app/models/user.rb b/services/api/app/models/user.rb index 19e84dca7c..446a61f255 100644 --- a/services/api/app/models/user.rb +++ b/services/api/app/models/user.rb @@ -12,6 +12,7 @@ class User < ArvadosModel before_update :prevent_inactive_admin before_create :check_auto_admin after_create :add_system_group_permission_link + after_create :auto_setup_new_user after_create :send_admin_notifications after_update :send_profile_created_notification @@ -103,12 +104,13 @@ class User < ArvadosModel Group.where('owner_uuid in (?)', lookup_uuids).each do |group| newgroups << [group.owner_uuid, group.uuid, 'can_manage'] end - # add any permission links from the current lookup_uuids to a - # User or Group. - Link.where('tail_uuid in (?) and link_class = ? and (head_uuid like ? or head_uuid like ?)', - lookup_uuids, + # add any permission links from the current lookup_uuids to a Group. + Link.where('link_class = ? and tail_uuid in (?) and ' \ + '(head_uuid like ? or (name = ? and head_uuid like ?))', 'permission', + lookup_uuids, Group.uuid_like_pattern, + 'can_manage', User.uuid_like_pattern).each do |link| newgroups << [link.tail_uuid, link.head_uuid, link.name] end @@ -420,6 +422,47 @@ class User < ArvadosModel end end + # Automatically setup new user during creation + def auto_setup_new_user + return true if !Rails.configuration.auto_setup_new_users + return true if !self.email + + if Rails.configuration.auto_setup_new_users_with_vm_uuid || + Rails.configuration.auto_setup_new_users_with_repository + username = self.email.partition('@')[0] if self.email + return true if !username + + blacklisted_usernames = Rails.configuration.auto_setup_name_blacklist + if blacklisted_usernames.include?(username) + return true + elsif !(/^[a-zA-Z][-._a-zA-Z0-9]{0,30}[a-zA-Z0-9]$/.match(username)) + return true + else + return true if !(username = derive_unique_username username) + end + end + + # setup user + setup_repo_vm_links(username, + Rails.configuration.auto_setup_new_users_with_vm_uuid, + Rails.configuration.default_openid_prefix) + end + + # Find a username that starts with the given string and does not collide + # with any existing repository name or VM login name + def derive_unique_username username + while true + if Repository.where(name: username).empty? + login_collisions = Link.where(link_class: 'permission', + name: 'can_login').select do |perm| + perm.properties['username'] == username + end + return username if login_collisions.empty? + end + username = username + SecureRandom.random_number(10).to_s + end + end + # Send notification if the user saved profile for the first time def send_profile_created_notification if self.prefs_changed?