X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d179241c734c2c533f4453beaecd53d27ced9a98..e48387b530d01be0f92f70390570169ddf3b9111:/services/api/app/models/api_client_authorization.rb diff --git a/services/api/app/models/api_client_authorization.rb b/services/api/app/models/api_client_authorization.rb index b158faa272..5f495d1b94 100644 --- a/services/api/app/models/api_client_authorization.rb +++ b/services/api/app/models/api_client_authorization.rb @@ -92,17 +92,37 @@ class ApiClientAuthorization < ArvadosModel uuid_prefix+".arvadosapi.com") end - def self.validate(token:, remote:) + def self.validate(token:, remote: nil) return nil if !token remote ||= Rails.configuration.uuid_prefix case token[0..2] when 'v2/' - _, uuid, secret = token.split('/') + _, uuid, secret, optional = token.split('/') unless uuid.andand.length == 27 && secret.andand.length.andand > 0 return nil end + if !optional.nil? + # if "optional" is a container uuid, check that it + # matches expections. + c = Container.where(uuid: optional).first + if !c.nil? + if !c.auth_uuid.nil? and c.auth_uuid != uuid + # token doesn't match the container's token + return nil + end + if !c.runtime_token.nil? and "v2/#{uuid}/#{secret}" != c.runtime_token + # token doesn't match the container's token + return nil + end + if ![Container::Locked, Container::Running].include?(c.state) + # container isn't locked or running, token shouldn't be used + return nil + end + end + end + auth = ApiClientAuthorization. includes(:user, :api_client). where('uuid=? and (expires_at is null or expires_at > CURRENT_TIMESTAMP)', uuid). @@ -135,6 +155,12 @@ class ApiClientAuthorization < ArvadosModel clnt = HTTPClient.new if Rails.configuration.sso_insecure clnt.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE + else + # Use system CA certificates + ["/etc/ssl/certs/ca-certificates.crt", + "/etc/pki/tls/certs/ca-bundle.crt"] + .select { |ca_path| File.readable?(ca_path) } + .each { |ca_path| clnt.ssl_config.add_trust_ca(ca_path) } end remote_user = SafeJSON.load( clnt.get_content('https://' + host + '/arvados/v1/users/current', @@ -161,7 +187,8 @@ class ApiClientAuthorization < ArvadosModel end end - if Rails.configuration.new_users_are_active + if Rails.configuration.new_users_are_active || + Rails.configuration.auto_activate_users_from.include?(remote_user['uuid'][0..4]) # Update is_active to whatever it is at the remote end user.is_active = remote_user['is_active'] elsif !remote_user['is_active'] @@ -203,6 +230,18 @@ class ApiClientAuthorization < ArvadosModel return nil end + def token + v2token + end + + def v1token + api_token + end + + def v2token + 'v2/' + uuid + '/' + api_token + end + protected def permission_to_create